Angular7使用loadChildren配置路由时偶现空白页问题咨询
问题成因
偶发白屏的核心原因是路由配置存在规则冲突,触发了Angular路由匹配逻辑的边界问题:
- 根路由存在两个同级
path: ''配置:第一个是跳转到home的重定向规则,设置了pathMatch: 'full',仅当URL完全等于根路径/时触发;第二个是挂载懒加载ModelloModule的规则,未声明pathMatch,默认使用prefix匹配策略。
Angular路由按配置顺序从上到下匹配:懒加载模块未加载时,首次访问根路径会正常命中重定向规则跳转首页;但当用户访问过懒加载模块、模块完成实例化后,再返回根路径时,空path的懒加载父路由会被优先命中——但该路由本身未绑定任何组件、也无重定向规则,没有可渲染内容,直接导致白屏。且该规则排在通配符**路由之前,也不会触发404页面。 - 子路由中
path: 'dettaglio-ditta'层级存在配置缺陷:该路由声明了children子路由,但自身既未绑定承载组件(模板需包含<router-outlet>渲染子路由),也未配置重定向规则,特定跳转顺序下会出现子路由找不到渲染出口的局部空白。 - 懒加载路由上声明的空
canActivateChild: []数组无实际作用,但会干扰路由守卫的执行链路,在路由回跳时可能打断默认激活流程。
修复方案
按以下规则调整配置即可彻底解决问题:
- 重构根路由配置,移除同层级空path冲突,给懒加载模块明确路由前缀,调整重定向规则顺序:
const routes: Routes = [ { path: 'home', component: InformationPageComponent, data: { title: 'INFO', preTitle: 'VISUALIZZA_MODELLO' }, }, { path: 'visualizza-modello', loadChildren: './visualizza-modello/modello.module#ModelloModule' }, { path: '', redirectTo: 'home', pathMatch: 'full' }, { path: '**', component: PageNotFoundComponent } ]; - 对应调整子模块路由,移除重复的路径前缀,补全缺失的路由层级承载配置:
@NgModule({ imports: [ RouterModule.forChild([ { path: '', data: { title: 'DELEGHE', breadcrumb: 'VISUALIZZA_MODELLO', preTitle: 'VISUALIZZA_MODELLO', }, children: [ { path: 'dettaglio-ditta', data: { title: 'RICERCA_PAT', breadcrumb: 'RICERCA_PAT', preTitle: 'VISUALIZZA_MODELLO' }, component: DettaglioDittaComponent, children: [ { path: 'dettaglio-quadro', data: { title: 'DETTAGLIO_MODELLO', breadcrumb: 'VISUALIZZA_MODELLO', preTitle: 'VISUALIZZA_MODELLO' }, component: DettaglioQuadroComponent }, { path: '', pathMatch: 'full', redirectTo: '' } ] }, { path: '', pathMatch: 'full', data: { title: 'DELEGHE', breadcrumb: '', preTitle: 'VISUALIZZA_MODELLO' }, component: DelegheComponent }, ] }, ]) ], exports: [RouterModule] }) - 后续写路由时遵守通用校验规则:
- 所有非路由分组用途的空path路由,必须明确添加
pathMatch: 'full',避免prefix匹配导致的优先级错乱 - 所有带children的路由层级,要么绑定带
<router-outlet>的承载组件,要么明确配置重定向规则,禁止出现无组件、无重定向的空路由节点 - 移除所有无实际逻辑的空守卫数组,避免干扰路由执行链路
- 所有非路由分组用途的空path路由,必须明确添加
内容的提问来源于stack exchange,提问作者aulona aulona
相关产品推荐
相关产品推荐

