loadchildren

CanLoad 守卫:保护对特性模块的未授权加载

只有在用户已登录的情况下你才加载 AdminModule

  1. canLoad(route: Route): boolean {
  2. let url = `/${route.path}`;
  3. return this.checkLogin(url);
  4. }
  1. {
  2. path: 'admin',
  3. loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule),
  4. canLoad: [AuthGuard]
  5. }

预加载 preloadingStrategy

但是,你几乎可以肯定用户会在启动应用之后的几分钟内访问危机中心。 理想情况下,应用启动时应该只加载 AppModuleHeroesModule,然后几乎立即开始后台加载 CrisisCenterModule。 在用户浏览到危机中心之前,该模块应该已经加载完毕,可供访问了。这就是预加载。

在每次成功的导航后,路由器会在自己的配置中查找尚未加载并且可以预加载的模块。 是否加载某个模块,以及要加载哪些模块,取决于预加载策略。

  1. RouterModule.forRoot(
  2. appRoutes,
  3. {
  4. enableTracing: true, // <-- debugging purposes only
  5. preloadingStrategy: PreloadAllModules
  6. }
  7. )

CanLoad 会阻塞预加载

如果你要加载一个模块并且保护它防止未授权访问,请移除 [canLoad](https://angular.cn/api/router/Route#canLoad) 守卫,只单独依赖CanActivate守卫。

自定义预加载策略

SelectivePreloadingStrategyService 实现了 [PreloadingStrategy](https://angular.cn/api/router/PreloadingStrategy),它只有一个方法 preload
preload 的实现必须返回一个 Observable。 如果该路由应该预加载,它就会返回调用加载器函数所返回的 Observable。 如果该路由不应该预加载,它就返回一个 null 值的 Observable 对象。

  1. RouterModule.forRoot(
  2. appRoutes,
  3. {
  4. enableTracing: true, // <-- debugging purposes only
  5. preloadingStrategy: PreloadAllModules
  6. }
  7. )
  1. export class SelectivePreloadingStrategyService implements PreloadingStrategy {
  2. preloadedModules: string[] = [];
  3. preload(route: Route, load: () => Observable<any>): Observable<any> {
  4. if (route.data && route.data['preload']) {
  5. // add the route path to the preloaded module array
  6. this.preloadedModules.push(route.path);
  7. // log the route path to the console
  8. console.log('Preloaded: ' + route.path);
  9. return load();
  10. } else {
  11. return of(null);
  12. }
  13. }
  14. }