Skip to content

Commit 17359b7

Browse files
committed
feat(module-loader): add caching for ngModuleLoader on load
1 parent c634395 commit 17359b7

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

src/util/module-loader.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ComponentFactoryResolver, Injectable, Injector, OpaqueToken, Type } from '@angular/core';
1+
import { ComponentFactoryResolver, Injectable, Injector, NgModuleFactory, OpaqueToken, Type } from '@angular/core';
22
import { DeepLinkConfig } from '../navigation/nav-util';
33
import { NgModuleLoader } from './ng-module-loader';
44

@@ -15,6 +15,8 @@ export class ModuleLoader {
1515
/** @internal */
1616
_cfrMap = new Map<any, ComponentFactoryResolver>();
1717

18+
_promiseMap = new Map<string, Promise<NgModuleFactory<any>>>();
19+
1820
constructor(
1921
private _ngModuleLoader: NgModuleLoader,
2022
private _injector: Injector) {}
@@ -25,7 +27,15 @@ export class ModuleLoader {
2527

2628
const splitString = modulePath.split(SPLITTER);
2729

28-
return this._ngModuleLoader.load(splitString[0], splitString[1]).then(loadedModule => {
30+
let promise = this._promiseMap.get(modulePath);
31+
if (!promise) {
32+
promise = this._ngModuleLoader.load(splitString[0], splitString[1]);
33+
this._promiseMap.set(modulePath, promise);
34+
}
35+
36+
return promise.then(loadedModule => {
37+
// clear it from the cache
38+
this._promiseMap.delete(modulePath);
2939
console.timeEnd(`ModuleLoader, load: ${modulePath}'`);
3040
const ref = loadedModule.create(this._injector);
3141

src/util/test/module-loader.spec.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import { DeepLinkConfig } from '../../navigation/nav-util';
2-
import { DeepLinker } from '../../navigation/deep-linker';
31
import { ModuleLoader } from '../module-loader';
4-
import { mockDeepLinkConfig, mockDeepLinker, mockModuleLoader, mockNgModuleLoader } from '../mock-providers';
2+
import { mockModuleLoader, mockNgModuleLoader } from '../mock-providers';
53
import { NgModuleLoader } from '../ng-module-loader';
64

75

@@ -47,22 +45,16 @@ describe('module-loader', () => {
4745
// we would expect the same promise to be returned both times
4846
expect(promise).toEqual(secondPromise);
4947

50-
// TODO enable this with caching
51-
// expect(ngModuleLoader.load).toHaveBeenCalledTimes(1);
48+
expect(ngModuleLoader.load).toHaveBeenCalledTimes(1);
5249
});
5350

5451
});
5552

56-
var deepLinker: DeepLinker;
57-
var deepLinkConfig: DeepLinkConfig;
5853
var moduleLoader: ModuleLoader;
5954
var ngModuleLoader: NgModuleLoader;
6055

6156
beforeEach(() => {
62-
deepLinkConfig = mockDeepLinkConfig();
63-
deepLinker = mockDeepLinker(deepLinkConfig);
6457
ngModuleLoader = mockNgModuleLoader();
65-
6658
moduleLoader = mockModuleLoader(ngModuleLoader);
6759
});
6860

0 commit comments

Comments
 (0)