`@angular/platform-server` provides the foundation for rendering an Angular app on the server. In order to achieve that, it uses a server-side DOM implementation (currently [domino][1]). For rendering on the server to work as closely as possible to running the app on the browser, we need to make DOM globals (such as `Element`, `HTMLElement`, etc.), which are normally provided by the browser, available as globals on the server as well. Currently, `@angular/platform-server` achieves this by extending the `global` object with the DOM implementation provided by `domino`. This assignment happens in the [setDomTypes()][2] function, which is [called in a `PLATFORM_INITIALIZER`][3]. While this works in most cases, there are some scenarios where the DOM globals are needed sooner (i.e. before initializing the platform). See, for example, #24551 and #39950 for more details on such issues. This commit provides a way to solve this problem by exposing a side-effect-ful entry-point (`@angular/platform-server/init`), that shims the `global` object with DOM globals. People will be able to import this entry-point in their server-rendered apps before bootstrapping the app (for example, in their `main.server.ts` file). (See also [#39950 (comment)][4].) In a future update, the [`universal` schematics][5] will include such an import by default in newly generated projects. [1]: https://www.npmjs.com/package/domino [2]: https://github.com/angular/angular/blob/0fc8466f1be392917e0c/packages/platform-server/src/domino_adapter.ts#L17-L21 [3]: https://github.com/angular/angular/blob/0fc8466f1be392917e0c/packages/platform-server/src/server.ts#L33 [4]: https://github.com/angular/angular/issues/39950#issuecomment-747598403 [5]: https://github.com/angular/angular-cli/blob/cc51432661eb4ab4b6a3/packages/schematics/angular/universal PR Close #40559
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /**
 | |
|  * @license
 | |
|  * Copyright Google LLC All Rights Reserved.
 | |
|  *
 | |
|  * Use of this source code is governed by an MIT-style license that can be
 | |
|  * found in the LICENSE file at https://angular.io/license
 | |
|  */
 | |
| 
 | |
| 
 | |
| 
 | |
| import * as animations from '@angular/animations';
 | |
| import * as animationsBrowser from '@angular/animations/browser';
 | |
| import * as animationsBrowserTesting from '@angular/animations/browser/testing';
 | |
| import * as common from '@angular/common';
 | |
| import * as commonHttp from '@angular/common/http';
 | |
| import * as commonTesting from '@angular/common/testing';
 | |
| import * as commonHttpTesting from '@angular/common/testing';
 | |
| import * as compiler from '@angular/compiler';
 | |
| import * as compilerTesting from '@angular/compiler/testing';
 | |
| import * as core from '@angular/core';
 | |
| import * as coreTesting from '@angular/core/testing';
 | |
| import * as elements from '@angular/elements';
 | |
| import * as forms from '@angular/forms';
 | |
| import * as platformBrowser from '@angular/platform-browser';
 | |
| import * as platformBrowserDynamic from '@angular/platform-browser-dynamic';
 | |
| import * as platformBrowserDynamicTesting from '@angular/platform-browser-dynamic/testing';
 | |
| import * as platformBrowserAnimations from '@angular/platform-browser/animations';
 | |
| import * as platformBrowserTesting from '@angular/platform-browser/testing';
 | |
| import * as platformServer from '@angular/platform-server';
 | |
| import * as platformServerInit from '@angular/platform-server/init';
 | |
| import * as platformServerTesting from '@angular/platform-server/testing';
 | |
| import * as router from '@angular/router';
 | |
| import * as routerTesting from '@angular/router/testing';
 | |
| import * as routerUpgrade from '@angular/router/upgrade';
 | |
| import * as serviceWorker from '@angular/service-worker';
 | |
| import * as upgrade from '@angular/upgrade';
 | |
| import * as upgradeStatic from '@angular/upgrade/static';
 | |
| import * as upgradeTesting from '@angular/upgrade/static/testing';
 | |
| 
 | |
| export default {
 | |
|   animations,
 | |
|   animationsBrowser,
 | |
|   animationsBrowserTesting,
 | |
|   common,
 | |
|   commonTesting,
 | |
|   commonHttp,
 | |
|   commonHttpTesting,
 | |
|   compiler,
 | |
|   compilerTesting,
 | |
|   core,
 | |
|   coreTesting,
 | |
|   elements,
 | |
|   forms,
 | |
|   platformBrowser,
 | |
|   platformBrowserTesting,
 | |
|   platformBrowserDynamic,
 | |
|   platformBrowserDynamicTesting,
 | |
|   platformBrowserAnimations,
 | |
|   platformServer,
 | |
|   platformServerInit,
 | |
|   platformServerTesting,
 | |
|   router,
 | |
|   routerTesting,
 | |
|   routerUpgrade,
 | |
|   serviceWorker,
 | |
|   upgrade,
 | |
|   upgradeStatic,
 | |
|   upgradeTesting,
 | |
| };
 |