feat(module-loader): add caching for ngModuleLoader on load

This commit is contained in:
Brandy Carney
2017-03-06 18:23:31 -05:00
parent c6343951ae
commit 17359b7b8c
2 changed files with 14 additions and 12 deletions

View File

@ -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 { DeepLinkConfig } from '../navigation/nav-util';
import { NgModuleLoader } from './ng-module-loader'; import { NgModuleLoader } from './ng-module-loader';
@ -15,6 +15,8 @@ export class ModuleLoader {
/** @internal */ /** @internal */
_cfrMap = new Map<any, ComponentFactoryResolver>(); _cfrMap = new Map<any, ComponentFactoryResolver>();
_promiseMap = new Map<string, Promise<NgModuleFactory<any>>>();
constructor( constructor(
private _ngModuleLoader: NgModuleLoader, private _ngModuleLoader: NgModuleLoader,
private _injector: Injector) {} private _injector: Injector) {}
@ -25,7 +27,15 @@ export class ModuleLoader {
const splitString = modulePath.split(SPLITTER); 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}'`); console.timeEnd(`ModuleLoader, load: ${modulePath}'`);
const ref = loadedModule.create(this._injector); const ref = loadedModule.create(this._injector);

View File

@ -1,7 +1,5 @@
import { DeepLinkConfig } from '../../navigation/nav-util';
import { DeepLinker } from '../../navigation/deep-linker';
import { ModuleLoader } from '../module-loader'; 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'; import { NgModuleLoader } from '../ng-module-loader';
@ -47,22 +45,16 @@ describe('module-loader', () => {
// we would expect the same promise to be returned both times // we would expect the same promise to be returned both times
expect(promise).toEqual(secondPromise); 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 moduleLoader: ModuleLoader;
var ngModuleLoader: NgModuleLoader; var ngModuleLoader: NgModuleLoader;
beforeEach(() => { beforeEach(() => {
deepLinkConfig = mockDeepLinkConfig();
deepLinker = mockDeepLinker(deepLinkConfig);
ngModuleLoader = mockNgModuleLoader(); ngModuleLoader = mockNgModuleLoader();
moduleLoader = mockModuleLoader(ngModuleLoader); moduleLoader = mockModuleLoader(ngModuleLoader);
}); });