问题

Angular 运行报错 RouterModule.forRoot() called twice. Lazy loaded modules should use RouterModule.forChild() instead.

具体报错

  1. core.js:5847 ERROR Error: Uncaught (in promise): Error: RouterModule.forRoot() called twice. Lazy loaded modules should use RouterModule.forChild() instead.
  2. Error: RouterModule.forRoot() called twice. Lazy loaded modules should use RouterModule.forChild() instead.
  3. at provideForRootGuard (router.js:5561)
  4. at _callFactory (core.js:18524)
  5. at _createProviderInstance (core.js:18480)
  6. at initNgModule (core.js:18410)
  7. at new NgModuleRef_ (core.js:19137)
  8. at createNgModuleRef (core.js:19126)
  9. at Object.debugCreateNgModuleRef [as createNgModuleRef] (core.js:27949)
  10. at NgModuleFactory_.push../node_modules/@angular/core/fesm5/core.js.NgModuleFactory_.create (core.js:28653)
  11. at MapSubscriber.project (router.js:3602)
  12. at MapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/map.js.MapSubscriber._next (map.js:35)
  13. at resolvePromise (zone.js:852)
  14. at resolvePromise (zone.js:809)
  15. at zone.js:913
  16. at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
  17. at Object.onInvokeTask (core.js:24340)
  18. at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:422)
  19. at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:195)
  20. at drainMicroTaskQueue (zone.js:601)

出现原因

我给我的网站新增加一个继承AfterViewInit的component


  • 小知识:关于angular的AfterViewInit
    一个生命周期钩子,会在 Angular 完全初始化了组件的视图后调用。 定义一个 ngAfterViewInit() 方法来处理一些额外的初始化任务。

分析

看报错主要是说 RouterModule.forRoot()被调用两次。延迟加载的模块应该使用RouterModule.forChild()。意思就是我在哪个延迟加载的模块可能再次调用了RouterModule.forRoot(),其实本应该调用RouterModule.forChild(),那可能就是我在包含通过RouterModule.forChild()加载路由的模块里面加载了新增加的component导致出现这个问题,分析了一般发现没结果,于是把新增的component全删除了,结果还是报错,what????快奔溃,于是准备看下git的代码修改记录,发现啥时候不小心在我的一个子模块里面导入了AppModule,这导致在加载子模块时再次调用根AppRoutingModule,因此两次调用RouterModule.forRoot()终于真相大白,我也很奔溃,找了很久

结论

要细心