Skip to content

Commit

Permalink
perf: switch angular to use StaticInjector instead of ReflectiveInjector
Browse files Browse the repository at this point in the history
This change allows ReflectiveInjector to be tree shaken resulting
in not needed Reflect polyfil and smaller bundles.
  • Loading branch information
mhevery committed Aug 3, 2017
1 parent 4689cbe commit 5e07e15
Show file tree
Hide file tree
Showing 85 changed files with 335 additions and 271 deletions.
4 changes: 2 additions & 2 deletions aio/src/app/documents/document.service.spec.ts
@@ -1,4 +1,4 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { Http, ConnectionBackend, RequestOptions, BaseRequestOptions, Response, ResponseOptions } from '@angular/http';

import { Observable } from 'rxjs/Observable';
Expand All @@ -21,7 +21,7 @@ function createResponse(body: any) {
}

function createInjector(initialUrl: string) {
return ReflectiveInjector.resolveAndCreate([
return Injector.create([
DocumentService,
{ provide: LocationService, useFactory: () => new MockLocationService(initialUrl) },
{ provide: ConnectionBackend, useClass: MockBackend },
Expand Down
6 changes: 3 additions & 3 deletions aio/src/app/embedded/api/api.service.spec.ts
@@ -1,4 +1,4 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { Http, ConnectionBackend, RequestOptions, BaseRequestOptions, Response, ResponseOptions } from '@angular/http';
import { MockBackend, MockConnection } from '@angular/http/testing';

Expand All @@ -8,7 +8,7 @@ import { ApiService } from './api.service';

describe('ApiService', () => {

let injector: ReflectiveInjector;
let injector: Injector;
let service: ApiService;
let backend: MockBackend;

Expand All @@ -17,7 +17,7 @@ describe('ApiService', () => {
}

beforeEach(() => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
ApiService,
{ provide: ConnectionBackend, useClass: MockBackend },
{ provide: RequestOptions, useClass: BaseRequestOptions },
Expand Down
@@ -1,4 +1,4 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';

import { of } from 'rxjs/observable/of';

Expand All @@ -12,13 +12,13 @@ import { LocationService } from 'app/shared/location.service';
describe('ContributorListComponent', () => {

let component: ContributorListComponent;
let injector: ReflectiveInjector;
let injector: Injector;
let contributorService: TestContributorService;
let locationService: TestLocationService;
let contributorGroups: ContributorGroup[];

beforeEach(() => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
ContributorListComponent,
{provide: ContributorService, useClass: TestContributorService },
{provide: LocationService, useClass: TestLocationService }
Expand Down
6 changes: 3 additions & 3 deletions aio/src/app/embedded/contributor/contributor.service.spec.ts
@@ -1,4 +1,4 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { Http, ConnectionBackend, RequestOptions, BaseRequestOptions, Response, ResponseOptions } from '@angular/http';
import { MockBackend } from '@angular/http/testing';

Expand All @@ -7,7 +7,7 @@ import { Contributor, ContributorGroup } from './contributors.model';

describe('ContributorService', () => {

let injector: ReflectiveInjector;
let injector: Injector;
let backend: MockBackend;
let contribService: ContributorService;

Expand All @@ -16,7 +16,7 @@ describe('ContributorService', () => {
}

beforeEach(() => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
ContributorService,
{ provide: ConnectionBackend, useClass: MockBackend },
{ provide: RequestOptions, useClass: BaseRequestOptions },
Expand Down
6 changes: 3 additions & 3 deletions aio/src/app/embedded/resource/resource-list.component.spec.ts
@@ -1,4 +1,4 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { PlatformLocation } from '@angular/common';

import { Observable } from 'rxjs/Observable';
Expand All @@ -13,12 +13,12 @@ import { Category } from './resource.model';
// Let e2e tests verify how it displays.
describe('ResourceListComponent', () => {

let injector: ReflectiveInjector;
let injector: Injector;
let location: TestPlatformLocation;
let resourceService: TestResourceService;

beforeEach(() => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
ResourceListComponent,
{provide: PlatformLocation, useClass: TestPlatformLocation },
{provide: ResourceService, useClass: TestResourceService }
Expand Down
6 changes: 3 additions & 3 deletions aio/src/app/embedded/resource/resource.service.spec.ts
@@ -1,4 +1,4 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { Http, ConnectionBackend, RequestOptions, BaseRequestOptions, Response, ResponseOptions } from '@angular/http';
import { MockBackend } from '@angular/http/testing';

Expand All @@ -7,7 +7,7 @@ import { Category, SubCategory, Resource } from './resource.model';

describe('ResourceService', () => {

let injector: ReflectiveInjector;
let injector: Injector;
let backend: MockBackend;
let resourceService: ResourceService;

Expand All @@ -16,7 +16,7 @@ describe('ResourceService', () => {
}

beforeEach(() => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
ResourceService,
{ provide: ConnectionBackend, useClass: MockBackend },
{ provide: RequestOptions, useClass: BaseRequestOptions },
Expand Down
6 changes: 3 additions & 3 deletions aio/src/app/navigation/navigation.service.spec.ts
@@ -1,4 +1,4 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { Http, ConnectionBackend, RequestOptions, BaseRequestOptions, Response, ResponseOptions } from '@angular/http';
import { MockBackend } from '@angular/http/testing';
import { CurrentNodes, NavigationService, NavigationViews, NavigationNode, VersionInfo } from 'app/navigation/navigation.service';
Expand All @@ -7,7 +7,7 @@ import { MockLocationService } from 'testing/location.service';

describe('NavigationService', () => {

let injector: ReflectiveInjector;
let injector: Injector;
let backend: MockBackend;
let navService: NavigationService;

Expand All @@ -16,7 +16,7 @@ describe('NavigationService', () => {
}

beforeEach(() => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
NavigationService,
{ provide: LocationService, useFactory: () => new MockLocationService('a') },
{ provide: ConnectionBackend, useClass: MockBackend },
Expand Down
6 changes: 3 additions & 3 deletions aio/src/app/search/search.service.spec.ts
@@ -1,12 +1,12 @@
import { ReflectiveInjector, NgZone } from '@angular/core';
import { Injector, NgZone } from '@angular/core';
import { fakeAsync, tick } from '@angular/core/testing';
import { Observable } from 'rxjs/Observable';
import { SearchService } from './search.service';
import { WebWorkerClient } from 'app/shared/web-worker';

describe('SearchService', () => {

let injector: ReflectiveInjector;
let injector: Injector;
let service: SearchService;
let sendMessageSpy: jasmine.Spy;
let mockWorker: WebWorkerClient;
Expand All @@ -16,7 +16,7 @@ describe('SearchService', () => {
mockWorker = { sendMessage: sendMessageSpy } as any;
spyOn(WebWorkerClient, 'create').and.returnValue(mockWorker);

injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
SearchService,
{ provide: NgZone, useFactory: () => new NgZone({ enableLongStackTrace: false }) }
]);
Expand Down
6 changes: 3 additions & 3 deletions aio/src/app/shared/ga.service.spec.ts
@@ -1,12 +1,12 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { fakeAsync, tick } from '@angular/core/testing';

import { GaService } from 'app/shared/ga.service';
import { Logger } from 'app/shared/logger.service';

describe('GaService', () => {
let gaSpy: jasmine.Spy;
let injector: ReflectiveInjector;
let injector: Injector;

// filter for 'send' which communicates with server
// returns the url of the 'send pageview'
Expand All @@ -25,7 +25,7 @@ describe('GaService', () => {
}

beforeEach(() => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
GaService,
{ provide: Logger, useClass: TestLogger }
]);
Expand Down
6 changes: 3 additions & 3 deletions aio/src/app/shared/location.service.spec.ts
@@ -1,4 +1,4 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { Location, LocationStrategy, PlatformLocation } from '@angular/common';
import { MockLocationStrategy } from '@angular/common/testing';
import { Subject } from 'rxjs/Subject';
Expand All @@ -8,13 +8,13 @@ import { SwUpdatesService } from 'app/sw-updates/sw-updates.service';
import { LocationService } from './location.service';

describe('LocationService', () => {
let injector: ReflectiveInjector;
let injector: Injector;
let location: MockLocationStrategy;
let service: LocationService;
let swUpdates: MockSwUpdatesService;

beforeEach(() => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
LocationService,
Location,
{ provide: GaService, useClass: TestGaService },
Expand Down
4 changes: 2 additions & 2 deletions aio/src/app/shared/scroll-spy.service.spec.ts
@@ -1,4 +1,4 @@
import { Injector, ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { fakeAsync, tick } from '@angular/core/testing';
import { DOCUMENT } from '@angular/platform-browser';

Expand Down Expand Up @@ -150,7 +150,7 @@ describe('ScrollSpyService', () => {
let scrollSpyService: ScrollSpyService;

beforeEach(() => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
{ provide: DOCUMENT, useValue: { body: {} } },
{ provide: ScrollService, useValue: { topOffset: 50 } },
ScrollSpyService
Expand Down
6 changes: 3 additions & 3 deletions aio/src/app/shared/scroll.service.spec.ts
@@ -1,12 +1,12 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { PlatformLocation } from '@angular/common';
import { DOCUMENT } from '@angular/platform-browser';

import { ScrollService, topMargin } from './scroll.service';

describe('ScrollService', () => {
const topOfPageElem = {} as Element;
let injector: ReflectiveInjector;
let injector: Injector;
let document: MockDocument;
let location: MockPlatformLocation;
let scrollService: ScrollService;
Expand All @@ -32,7 +32,7 @@ describe('ScrollService', () => {
});

beforeEach(() => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
ScrollService,
{ provide: DOCUMENT, useClass: MockDocument },
{ provide: PlatformLocation, useClass: MockPlatformLocation }
Expand Down
6 changes: 3 additions & 3 deletions aio/src/app/shared/toc.service.spec.ts
@@ -1,12 +1,12 @@
import { ReflectiveInjector, SecurityContext } from '@angular/core';
import { Injector, SecurityContext } from '@angular/core';
import { DOCUMENT, DomSanitizer, SafeHtml } from '@angular/platform-browser';
import { Subject } from 'rxjs/Subject';

import { ScrollItem, ScrollSpyInfo, ScrollSpyService } from 'app/shared/scroll-spy.service';
import { TocItem, TocService } from './toc.service';

describe('TocService', () => {
let injector: ReflectiveInjector;
let injector: Injector;
let scrollSpyService: MockScrollSpyService;
let tocService: TocService;
let lastTocList: TocItem[];
Expand All @@ -20,7 +20,7 @@ describe('TocService', () => {
}

beforeEach(() => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
{ provide: DomSanitizer, useClass: TestDomSanitizer },
{ provide: DOCUMENT, useValue: document },
{ provide: ScrollSpyService, useClass: MockScrollSpyService },
Expand Down
6 changes: 3 additions & 3 deletions aio/src/app/sw-updates/sw-updates.service.spec.ts
@@ -1,4 +1,4 @@
import { ReflectiveInjector } from '@angular/core';
import { Injector } from '@angular/core';
import { fakeAsync, tick } from '@angular/core/testing';
import { NgServiceWorker } from '@angular/service-worker';
import { Subject } from 'rxjs/Subject';
Expand All @@ -8,7 +8,7 @@ import { Logger } from 'app/shared/logger.service';
import { SwUpdatesService } from './sw-updates.service';

describe('SwUpdatesService', () => {
let injector: ReflectiveInjector;
let injector: Injector;
let service: SwUpdatesService;
let sw: MockNgServiceWorker;
let checkInterval: number;
Expand All @@ -20,7 +20,7 @@ describe('SwUpdatesService', () => {
// `setup()` in a `beforeEach()` block. We use the `run()` helper to call `setup()` inside each
// test's zone.
const setup = () => {
injector = ReflectiveInjector.resolveAndCreate([
injector = Injector.create([
{ provide: Logger, useClass: MockLogger },
{ provide: NgServiceWorker, useClass: MockNgServiceWorker },
SwUpdatesService
Expand Down
Expand Up @@ -16,7 +16,7 @@
* ```
* export interface Component extends Directive {
* changeDetection?: ChangeDetectionStrategy;
* viewProviders?: Provider[];
* viewProviders?: StaticProvider[];
* templateUrl?: string;
* ...
* }
Expand Down
4 changes: 2 additions & 2 deletions modules/e2e_util/perf_util.ts
Expand Up @@ -11,7 +11,7 @@ const yargs = require('yargs');
const nodeUuid = require('node-uuid');
import * as fs from 'fs-extra';

import {SeleniumWebDriverAdapter, Options, JsonFileReporter, Validator, RegressionSlopeValidator, ConsoleReporter, SizeValidator, MultiReporter, MultiMetric, Runner, Provider} from '@angular/benchpress';
import {SeleniumWebDriverAdapter, Options, JsonFileReporter, Validator, RegressionSlopeValidator, ConsoleReporter, SizeValidator, MultiReporter, MultiMetric, Runner, StaticProvider} from '@angular/benchpress';
import {readCommandLine as readE2eCommandLine, openBrowser} from './e2e_util';

let cmdArgs: {'sample-size': number, 'force-gc': boolean, 'dryrun': boolean, 'bundles': boolean};
Expand Down Expand Up @@ -59,7 +59,7 @@ function createBenchpressRunner(): Runner {
}
const resultsFolder = './dist/benchmark_results';
fs.ensureDirSync(resultsFolder);
const providers: Provider[] = [
const providers: StaticProvider[] = [
SeleniumWebDriverAdapter.PROTRACTOR_PROVIDERS,
{provide: Options.FORCE_GC, useValue: cmdArgs['force-gc']},
{provide: Options.DEFAULT_DESCRIPTION, useValue: {'runId': runId}}, JsonFileReporter.PROVIDERS,
Expand Down
12 changes: 6 additions & 6 deletions packages/benchpress/src/runner.ts
Expand Up @@ -6,7 +6,7 @@
* found in the LICENSE file at https://angular.io/license
*/

import {Provider, ReflectiveInjector} from '@angular/core';
import {Injector, StaticProvider} from '@angular/core';

import {Options} from './common_options';
import {Metric} from './metric';
Expand Down Expand Up @@ -34,17 +34,17 @@ import {IOsDriverExtension} from './webdriver/ios_driver_extension';
* It provides defaults, creates the injector and calls the sampler.
*/
export class Runner {
constructor(private _defaultProviders: Provider[] = []) {}
constructor(private _defaultProviders: StaticProvider[] = []) {}

sample({id, execute, prepare, microMetrics, providers, userMetrics}: {
id: string,
execute?: Function,
prepare?: Function,
microMetrics?: {[key: string]: string},
providers?: Provider[],
providers?: StaticProvider[],
userMetrics?: {[key: string]: string}
}): Promise<SampleState> {
const sampleProviders: Provider[] = [
const sampleProviders: StaticProvider[] = [
_DEFAULT_PROVIDERS, this._defaultProviders, {provide: Options.SAMPLE_ID, useValue: id},
{provide: Options.EXECUTE, useValue: execute}
];
Expand All @@ -61,7 +61,7 @@ export class Runner {
sampleProviders.push(providers);
}

const inj = ReflectiveInjector.resolveAndCreate(sampleProviders);
const inj = Injector.create(sampleProviders);
const adapter: WebDriverAdapter = inj.get(WebDriverAdapter);

return Promise
Expand All @@ -75,7 +75,7 @@ export class Runner {
// Only WebDriverAdapter is reused.
// TODO vsavkin consider changing it when toAsyncFactory is added back or when child
// injectors are handled better.
const injector = ReflectiveInjector.resolveAndCreate([
const injector = Injector.create([
sampleProviders, {provide: Options.CAPABILITIES, useValue: capabilities},
{provide: Options.USER_AGENT, useValue: userAgent},
{provide: WebDriverAdapter, useValue: adapter}
Expand Down

0 comments on commit 5e07e15

Please sign in to comment.