Angular懒加载模块在非匹配路由下被意外加载问题求助
问题原因
- 根路由存在多个未配置
pathMatch: 'full'的空路径(path: '')路由,Angular路由默认采用前缀匹配规则,空路径可以匹配任意URL的前缀,因此访问/web-design时,除了命中web-design对应的路由外,后续所有空路径路由都会被命中,触发对应模块的加载。 - 你配置的
LandingModule、PublicModule内部大概率直接在@NgModule的imports数组中导入了ContentModule、FreelancerProfileModule,而非在子路由中配置懒加载,因此这两个父模块加载时会同步加载这两个子模块。 - 路由配置不符合规范,存在多个重复的空路径根路由,即使放在业务路由之后,也会因为前缀匹配规则被命中。
解决方案
- 修正空路径路由配置,只有需要匹配根路径的路由才配置
path: ''+pathMatch: 'full',如果需要让某个模块处理无统一前缀的子路由,不要在根路由配置多个空路径路由,应该把所有无前缀的子路由整合到同一个父模块的路由配置中。 - 移除根路由中多余的空路径路由,调整后的根路由参考如下:
[ { pathMatch: 'full', path: '', loadChildren: () => import('./pages/landing/home-page/home-page.module').then(m => m.HomePageModule) }, { path: 'web-design', loadChildren: () => import('./pages/landing/web-design/web-design.module').then(m => m.WebDesignModule) }, { path: 'content', loadChildren: () => import('./pages/landing/content/content.module').then(m => m.ContentModule) }, { path: 'profile', loadChildren: () => import('./pages/public/freelancer-profile/freelancer-profile.module').then(m => m.FreelancerProfileModule) }, { canActivate: [LoginGuardService], path: 'panel', loadChildren: () => import('./pages/private/private.module').then(m => m.PrivateModule) }, { path: 'freelancer', loadChildren: () => import('./pages/freelancer-search/freelancer-search.module').then(m => m.FreelancerSearchModule) }, // 移除多余的三个空路径路由,将这三个模块的子路由整合到对应业务路由中,或者统一配置到一个空路径父模块下 { path: '', loadChildren: () => import('./pages/common/common.module').then(m => m.CommonModule) }, { path: '**', redirectTo: '404', } ];
- 检查
LandingModule、PublicModule的imports数组,删除直接导入的ContentModule、FreelancerProfileModule,改为在对应模块的路由中配置懒加载。 - 若需要排查路由匹配过程,可以在
RouterModule.forRoot的第二个参数中开启路由追踪:RouterModule.forRoot(routes, { enableTracing: true }),通过控制台输出的匹配日志确认命中的路由项。
内容的提问来源于stack exchange,提问作者Behnam Aminazad
相关产品推荐
相关产品推荐

