我意识到使用懒加载如果用户没有访问页面,则会丢失PWA的主要特性,即您无法离线浏览。
那么有没有一种方法可以预取懒加载文件?
我意识到使用懒加载如果用户没有访问页面,则会丢失PWA的主要特性,即您无法离线浏览。
那么有没有一种方法可以预取懒加载文件?
是的,您需要定义预加载策略:
imports: [RouterModule.forRoot(ROUTES, {preloadingStrategy: PreloadAllModules})]
import 'rxjs/add/observable/of';
import { Injectable } from '@angular/core';
import { PreloadingStrategy, Route } from '@angular/router';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class CustomPreloadingStrategy implements PreloadingStrategy {
preloadedModules: string[] = [];
preload(route: Route, load: () => Observable<any>): Observable<any> {
if (route.data && route.data['preload']) { // see app.routing.ts
this.preloadedModules.push(route.path);
return load();
} else {
return Observable.of(null);
}
}
}
接着在app.module.ts文件中:
@NgModule({
imports: [RouterModule.forRoot(routes, { preloadingStrategy:
CustomPreloadingStrategy })],
exports: [RouterModule],
providers: [CustomPreloadingStrategy]
})
app.routing.ts:
{
path: ':section',
loadChildren: './gm-email/gm-email.module#GmEmailModule',
data: { preload: true }
}
基本上,如果数据预加载(data.preload)为真,则表示在应用程序已加载后立即预加载此项(即在第一个模块惰性加载后)。否则,在需要时进行预加载(即当用户单击链接进行惰性加载时)。
installMode
设置为prefetch
,并在resources.files
数组中指定/*.js
,这将指示Angular服务工作者在PWA安装时预取您的惰性加载.js包,在用户在线浏览器导航时不会失去惰性加载的好处。 "$schema": "./node_modules/@angular/service-worker/config/schema.json",
"index": "/index.html",
"assetGroups": [
{
"name": "app",
"installMode": "prefetch",
"resources": {
"files": [
"/favicon.ico",
"/index.html",
"/manifest.webmanifest",
"/*.css",
"/*.js"
]
}
}
]
}