diff --git a/src/util/module-loader.ts b/src/util/module-loader.ts index 0887b825a2..99436fe59b 100644 --- a/src/util/module-loader.ts +++ b/src/util/module-loader.ts @@ -1,4 +1,4 @@ -import { ComponentFactoryResolver, Injectable, Injector, OpaqueToken, Type } from '@angular/core'; +import { ComponentFactoryResolver, Injectable, Injector, NgModuleFactory, OpaqueToken, Type } from '@angular/core'; import { DeepLinkConfig } from '../navigation/nav-util'; import { NgModuleLoader } from './ng-module-loader'; @@ -15,6 +15,8 @@ export class ModuleLoader { /** @internal */ _cfrMap = new Map(); + _promiseMap = new Map>>(); + constructor( private _ngModuleLoader: NgModuleLoader, private _injector: Injector) {} @@ -25,7 +27,15 @@ export class ModuleLoader { const splitString = modulePath.split(SPLITTER); - return this._ngModuleLoader.load(splitString[0], splitString[1]).then(loadedModule => { + let promise = this._promiseMap.get(modulePath); + if (!promise) { + promise = this._ngModuleLoader.load(splitString[0], splitString[1]); + this._promiseMap.set(modulePath, promise); + } + + return promise.then(loadedModule => { + // clear it from the cache + this._promiseMap.delete(modulePath); console.timeEnd(`ModuleLoader, load: ${modulePath}'`); const ref = loadedModule.create(this._injector); diff --git a/src/util/test/module-loader.spec.ts b/src/util/test/module-loader.spec.ts index 4d67bd4972..542e6f2347 100644 --- a/src/util/test/module-loader.spec.ts +++ b/src/util/test/module-loader.spec.ts @@ -1,7 +1,5 @@ -import { DeepLinkConfig } from '../../navigation/nav-util'; -import { DeepLinker } from '../../navigation/deep-linker'; import { ModuleLoader } from '../module-loader'; -import { mockDeepLinkConfig, mockDeepLinker, mockModuleLoader, mockNgModuleLoader } from '../mock-providers'; +import { mockModuleLoader, mockNgModuleLoader } from '../mock-providers'; import { NgModuleLoader } from '../ng-module-loader'; @@ -47,22 +45,16 @@ describe('module-loader', () => { // we would expect the same promise to be returned both times expect(promise).toEqual(secondPromise); - // TODO enable this with caching - // expect(ngModuleLoader.load).toHaveBeenCalledTimes(1); + expect(ngModuleLoader.load).toHaveBeenCalledTimes(1); }); }); - var deepLinker: DeepLinker; - var deepLinkConfig: DeepLinkConfig; var moduleLoader: ModuleLoader; var ngModuleLoader: NgModuleLoader; beforeEach(() => { - deepLinkConfig = mockDeepLinkConfig(); - deepLinker = mockDeepLinker(deepLinkConfig); ngModuleLoader = mockNgModuleLoader(); - moduleLoader = mockModuleLoader(ngModuleLoader); });