Skip to content

Commit 65b6642

Browse files
committed
feat(preload): added Preload strategies module
1 parent 65ddb12 commit 65b6642

22 files changed

+431
-19
lines changed

PLAYBOOK.md

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -318,13 +318,6 @@ ng g lib ContextMenu --tags=public-module --publishable=true --unit-test-runner=
318318
ng g component ContextMenu --project=context-menu --flat -d
319319
ng g directive ContextMenuTrigger --project=context-menu --flat -d
320320

321-
# generate components for `Prefetch` Module
322-
ng g service Prefetch --tags=public-module --prefix=ngx --publishable=true --unit-test-runner=jest
323-
ng g service PrefetchRegistry --project=prefetch --skipTests -d
324-
ng g service QuicklinkStrategy --project=prefetch --skipTests -d
325-
ng g service LinkHandler --project=prefetch --skipTests -d
326-
ng g directive Link --project=prefetch --flat --skipTests -d
327-
328321
# generate components, services for `ThemePicker` Module
329322
ng g lib ThemePicker --tags=public-module --publishable=true --unit-test-runner=jest
330323
ng g component ThemePicker --project=theme-picker --flat -d
@@ -407,6 +400,15 @@ ng g directive directives/in-viewport/inViewport --selector=inViewport --projec
407400
ng g service directives/in-viewport/Viewport --project=ngx-utils --module=in-viewport -d
408401

409402

403+
# generate components for `preload` Module
404+
ng g lib preload --tags=public-module --prefix=ngx --publishable=true --unit-test-runner=jest --skipTests
405+
ng g service strategies/selected/PreloadSelectedStrategy --project=preload --skipTests -d
406+
ng g module strategies/viewport/PreloadViewport --flat --project=preload --skipTests -d
407+
ng g service strategies/viewport/PreloadViewportStrategy --project=preload --skipTests -d
408+
ng g service strategies/viewport/PrefetchRegistry --project=preload --skipTests -d
409+
ng g service strategies/viewport/LinkHandler --project=preload --skipTests -d
410+
ng g directive strategies/viewport/Link --project=preload --module=preload-viewport --skipTests -d
411+
410412
# generate components for `toolbar` Module
411413
ng g lib toolbar --tags=private-module --unit-test-runner=jest -d
412414
ng g component toolbar --project=toolbar --flat -d

angular.json

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,6 +1299,36 @@
12991299
}
13001300
}
13011301
}
1302+
},
1303+
"preload": {
1304+
"root": "libs/preload",
1305+
"sourceRoot": "libs/preload/src",
1306+
"projectType": "library",
1307+
"prefix": "ngx",
1308+
"architect": {
1309+
"build": {
1310+
"builder": "@angular-devkit/build-ng-packagr:build",
1311+
"options": {
1312+
"tsConfig": "libs/preload/tsconfig.lib.json",
1313+
"project": "libs/preload/ng-package.json"
1314+
}
1315+
},
1316+
"lint": {
1317+
"builder": "@angular-devkit/build-angular:tslint",
1318+
"options": {
1319+
"tsConfig": ["libs/preload/tsconfig.lib.json", "libs/preload/tsconfig.spec.json"],
1320+
"exclude": ["**/node_modules/**"]
1321+
}
1322+
},
1323+
"test": {
1324+
"builder": "@nrwl/builders:jest",
1325+
"options": {
1326+
"jestConfig": "libs/preload/jest.config.js",
1327+
"tsConfig": "libs/preload/tsconfig.spec.json",
1328+
"setupFile": "libs/preload/src/test-setup.ts"
1329+
}
1330+
}
1331+
}
13021332
}
13031333
},
13041334
"schematics": {

apps/webapp/src/app/app.module.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
99
import { CoreModule } from '@ngx-starter-kit/core';
1010

1111
import { environment } from '@env/environment';
12-
import { PreloadSelectedModulesList } from './preloading-strategy';
12+
import { PreloadViewportModule, PreloadViewportStrategy, PreloadSelectedStrategy } from '@ngx-starter-kit/preload';
1313

1414
export class MyHammerConfig extends HammerGestureConfig {
1515
overrides = <any>{
@@ -23,6 +23,7 @@ export class MyHammerConfig extends HammerGestureConfig {
2323
imports: [
2424
BrowserModule,
2525
BrowserAnimationsModule,
26+
// PreloadViewportModule,
2627
RouterModule.forRoot(
2728
[
2829
{ path: '', redirectTo: 'home', pathMatch: 'full' },
@@ -40,7 +41,9 @@ export class MyHammerConfig extends HammerGestureConfig {
4041
{
4142
scrollPositionRestoration: 'enabled',
4243
anchorScrolling: 'enabled',
43-
preloadingStrategy: PreloadAllModules, // TODO: PreloadSelectedModulesList
44+
preloadingStrategy: PreloadSelectedStrategy,
45+
// preloadingStrategy: PreloadViewportStrategy,
46+
// preloadingStrategy: PreloadAllModules,
4447
paramsInheritanceStrategy: 'always',
4548
// enableTracing: true, // enable to debug routing during development
4649
// onSameUrlNavigation: 'reload'
@@ -50,7 +53,6 @@ export class MyHammerConfig extends HammerGestureConfig {
5053
CoreModule, // IMP: Please keep CoreModule after RouterModule
5154
],
5255
providers: [
53-
PreloadSelectedModulesList,
5456
{
5557
provide: HAMMER_GESTURE_CONFIG,
5658
useClass: MyHammerConfig,

apps/webapp/src/app/preloading-strategy.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

libs/preload/README.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Preload
2+
3+
Preload lazy-module strategies
4+
5+
* PreloadSelectedStrategy - Deterministic pre-fetching based on `preload` value in Route Data.
6+
* PreloadViewportStrategy - Speculative pre-fetching based on links in `Viewport`
7+
* PredictivePreloadStrategy - Predictive pre-fetching based google analytics. Use `Guess.JS`
8+
9+
> `PreloadViewportStrategy` same as @mgechev [ngx-quicklink](https://github.com/mgechev/ngx-quicklink)
10+
11+
### Usecase
12+
13+
- feature-1: load with main core bundle
14+
- feature-2: preload in background to be ready to use when user navigates to feature-2
15+
- feature-3: only lazy load if the user navigates to feature-3
16+
17+
### Publish
18+
```bash
19+
# build
20+
ng build preload
21+
# replace your npm key
22+
export NPM_TOKEN="00000000-0000-0000-0000-000000000000"
23+
# publish
24+
npm publish dist/libs/preload --access public
25+
```
26+
27+
### TODO
28+
* make `PreloadViewportStrategy` customizable.
29+

libs/preload/jest.config.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module.exports = {
2+
name: 'preload',
3+
preset: '../../jest.config.js',
4+
coverageDirectory: '../../coverage/libs/preload',
5+
};

libs/preload/ng-package.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
3+
"dest": "../../dist/libs/preload",
4+
"lib": {
5+
"entryFile": "src/index.ts"
6+
}
7+
}

libs/preload/package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"name": "@ngx-starter-kit/preload",
3+
"version": "0.0.1",
4+
"peerDependencies": {
5+
"@angular/common": "^7.2.0",
6+
"@angular/core": "^7.2.0"
7+
}
8+
}

libs/preload/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from './lib/strategies/viewport/preload-viewport.module';
2+
export * from './lib/strategies/viewport/preload-viewport-strategy.service';
3+
export * from './lib/strategies/selected/preload-selected-strategy.service';
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Injectable } from '@angular/core';
2+
import { PreloadingStrategy, Route } from '@angular/router';
3+
import { Observable, of } from 'rxjs';
4+
5+
@Injectable({
6+
providedIn: 'root',
7+
})
8+
export class PreloadSelectedStrategy implements PreloadingStrategy {
9+
preload(route: Route, load: Function): Observable<any> {
10+
return route.data && route.data.preload ? load() : of(null);
11+
}
12+
}

0 commit comments

Comments
 (0)