
This change allows ReflectiveInjector to be tree shaken resulting in not needed Reflect polyfil and smaller bundles. Code savings for HelloWorld using Closure: Reflective: bundle.js: 105,864(34,190 gzip) Static: bundle.js: 154,889(33,555 gzip) 645( 2%) BREAKING CHANGE: `platformXXXX()` no longer accepts providers which depend on reflection. Specifically the method signature when from `Provider[]` to `StaticProvider[]`. Example: Before: ``` [ MyClass, {provide: ClassA, useClass: SubClassA} ] ``` After: ``` [ {provide: MyClass, deps: [Dep1,...]}, {provide: ClassA, useClass: SubClassA, deps: [Dep1,...]} ] ``` NOTE: This only applies to platform creation and providers for the JIT compiler. It does not apply to `@Compotent` or `@NgModule` provides declarations. Benchpress note: Previously Benchpress also supported reflective provides, which now require static providers. DEPRECATION: - `ReflectiveInjector` is now deprecated as it will be remove. Use `Injector.create` as a replacement. closes #18496
62 lines
2.0 KiB
TypeScript
62 lines
2.0 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google Inc. 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 {Injector, NgModuleFactory, NgModuleRef, StaticProvider} from '@angular/core';
|
|
import {platformBrowser} from '@angular/platform-browser';
|
|
|
|
import * as angular from '../common/angular1';
|
|
import {$INJECTOR, INJECTOR_KEY, LAZY_MODULE_REF, UPGRADE_MODULE_NAME} from '../common/constants';
|
|
import {LazyModuleRef, isFunction} from '../common/util';
|
|
|
|
import {angular1Providers, setTempInjectorRef} from './angular1_providers';
|
|
import {NgAdapterInjector} from './util';
|
|
|
|
|
|
/** @experimental */
|
|
export function downgradeModule<T>(
|
|
moduleFactoryOrBootstrapFn: NgModuleFactory<T>|
|
|
((extraProviders: StaticProvider[]) => Promise<NgModuleRef<T>>)): string {
|
|
const LAZY_MODULE_NAME = UPGRADE_MODULE_NAME + '.lazy';
|
|
const bootstrapFn = isFunction(moduleFactoryOrBootstrapFn) ?
|
|
moduleFactoryOrBootstrapFn :
|
|
(extraProviders: StaticProvider[]) =>
|
|
platformBrowser(extraProviders).bootstrapModuleFactory(moduleFactoryOrBootstrapFn);
|
|
|
|
let injector: Injector;
|
|
|
|
// Create an ng1 module to bootstrap.
|
|
angular.module(LAZY_MODULE_NAME, [])
|
|
.factory(
|
|
INJECTOR_KEY,
|
|
() => {
|
|
if (!injector) {
|
|
throw new Error(
|
|
'Trying to get the Angular injector before bootstrapping an Angular module.');
|
|
}
|
|
return injector;
|
|
})
|
|
.factory(LAZY_MODULE_REF, [
|
|
$INJECTOR,
|
|
($injector: angular.IInjectorService) => {
|
|
setTempInjectorRef($injector);
|
|
const result: LazyModuleRef = {
|
|
needsNgZone: true,
|
|
promise: bootstrapFn(angular1Providers).then(ref => {
|
|
injector = result.injector = new NgAdapterInjector(ref.injector);
|
|
injector.get($INJECTOR);
|
|
|
|
return injector;
|
|
})
|
|
};
|
|
return result;
|
|
}
|
|
]);
|
|
|
|
return LAZY_MODULE_NAME;
|
|
}
|