loadchildren
CanLoad 守卫:保护对特性模块的未授权加载
只有在用户已登录的情况下你才加载 AdminModule
canLoad(route: Route): boolean {let url = `/${route.path}`;return this.checkLogin(url);}
{path: 'admin',loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule),canLoad: [AuthGuard]}
预加载 preloadingStrategy
但是,你几乎可以肯定用户会在启动应用之后的几分钟内访问危机中心。 理想情况下,应用启动时应该只加载
AppModule和HeroesModule,然后几乎立即开始后台加载CrisisCenterModule。 在用户浏览到危机中心之前,该模块应该已经加载完毕,可供访问了。这就是预加载。
在每次成功的导航后,路由器会在自己的配置中查找尚未加载并且可以预加载的模块。 是否加载某个模块,以及要加载哪些模块,取决于预加载策略。
RouterModule.forRoot(appRoutes,{enableTracing: true, // <-- debugging purposes onlypreloadingStrategy: PreloadAllModules})
CanLoad 会阻塞预加载
如果你要加载一个模块并且保护它防止未授权访问,请移除 [canLoad](https://angular.cn/api/router/Route#canLoad) 守卫,只单独依赖CanActivate守卫。
自定义预加载策略
SelectivePreloadingStrategyService 实现了 [PreloadingStrategy](https://angular.cn/api/router/PreloadingStrategy),它只有一个方法 preload。preload 的实现必须返回一个 Observable。 如果该路由应该预加载,它就会返回调用加载器函数所返回的 Observable。 如果该路由不应该预加载,它就返回一个 null 值的 Observable 对象。
RouterModule.forRoot(appRoutes,{enableTracing: true, // <-- debugging purposes onlypreloadingStrategy: PreloadAllModules})
export class SelectivePreloadingStrategyService implements PreloadingStrategy {preloadedModules: string[] = [];preload(route: Route, load: () => Observable<any>): Observable<any> {if (route.data && route.data['preload']) {// add the route path to the preloaded module arraythis.preloadedModules.push(route.path);// log the route path to the consoleconsole.log('Preloaded: ' + route.path);return load();} else {return of(null);}}}
