【问题标题】:Lazily loaded module in Angular 4 errors with "Component X is not part of any NgModule"Angular 4 中延迟加载的模块出现“组件 X 不是任何 NgModule 的一部分”错误
【发布时间】:2018-04-27 21:01:09
【问题描述】:

我有一个包含大量模块的应用程序。它完美地工作。我想让一个模块延迟加载,因为它不经常被普通用户点击。

所以,我将 LazyModule 的路由更改为使用 loadChildren,主应用程序仍然可以加载,但是当我尝试点击 LazyModule 的子路由之一时,它给了我这个错误:

错误:未捕获(承诺):错误:组件 HomeComponent 不是 任何 NgModule 的一部分或该模块尚未导入到您的 模块。

在 LazyModule 中不使用 HomeComponent。它是不同模块的一部分,称为 MainModule。

MainModule 和 LazyModule 都被导入和导出到 ComponentsModule 或从 ComponentsModule 中导入,然后再导入 app.module。

还有一个 SharedModule 被导入到所有其他提到的模块中。

所以我的问题:

  • 为什么 LazyModule 在 MainModule 完全没有依赖关系时会尝试加载组件?
  • 为什么它适用于普通路由,但不适用于延迟加载?

提前感谢您的帮助。

模块在这里:

LazyModule

import ...;

const routes: Routes = [
    {
        path: '',
        redirectTo: '/lazy-page/1',
        pathMatch: 'full'
    },
    {
        path: '1',
        component: LazyPage1Component
    }
];

@NgModule({
  imports: [
      RouterModule.forChild(routes),
      SharedModule
  ],
  declarations: [
      LazyPage1Component
  ]
})
export class LazyModule { }

主模块

import ...;

@NgModule({
  imports: [
      SharedModule
  ],
  declarations: [
      HomeComponent
  ],
  exports: [
      HomeComponent
  ]
})
export class MainModule { }

组件模块

import ...;

@NgModule({
  imports: [
    SharedModule,
    MainModule,
    LazyModule
  ],
  declarations: [],
  exports: [
    SharedModule,
    MainModule,
    LazyModule
  ]
})
export class ComponentsModule { }

AppModule

import ...;

@NgModule({
  imports: [
    ComponentsModule
  ],
  declarations: [
    AppComponent
  ],
  providers: [{provide: APP_BASE_HREF, useValue : '/' }],
  bootstrap: [AppComponent]
})
export class AppModule { }

AppRoutingModule

const routes: Routes = [
{
    path: '',
    component: HomeComponent
},
{
    path: 'lazy-page',
    loadChildren: './components/lazy/lazy.module#LazyModule',
},

编辑:我现在找到了一个解决方法,但我真的想要一个合适的解决方案。 hack 只是将我的应用程序中的每个模块都导入到 LazyModule 和 AppModule 中。这是一个糟糕的解决方案,因为拥有延迟加载模块的整个想法是将其与应用程序的其余部分分离,因为它是独立的。我不想将所有内容都导入两次,我也不应该这样做,因为导入的模块都没有在 LazyModule 中使用或引用过。

【问题讨论】:

    标签: angular lazy-loading angular4-router


    【解决方案1】:

    感谢@Dmitry Grinko,我重新组织了我的路由器,这让我发现我已将 app-routing.module 随机导入到另一个模块中。

    解决方案是删除这个额外的导入,并且一切正常。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,与@Dmitry 建议的类似,我只是从我的 AppRoutingModule 中删除了所有路由,并留下了根 + 延迟加载的模块路由。我收到了一条不同的错误消息,例如 cmets 中提到的 @DoubleA。

      最后我在我的 SharedModule 中导入了 AppRoutingModule,同时它也被导入到延迟加载的模块中。我将不得不重构以避免 AppRoutingModule。

      【讨论】:

        【解决方案3】:

        查看您的代码,我只想评论说,延迟加载的模块不需要导入到您的应用程序模块中,因为您正在将其添加到组件模块并导入到应用程序模块中。

        延迟加载的模块可以作为独立于应用程序的模块,并在路由需要激活时加载。

        【讨论】:

          【解决方案4】:

          尝试使用这个AppRoutingModule

          const routes: Routes = [
          {
              path: '',
              redirectTo: '',
              pathMatch: 'full',
          },
          {
              path: '',
              component: AppComponent,
              children: [
                  {
                      path: '',
                      loadChildren: './path/to/main.module#MainModule',
                  }
              ]
          },
          {
              path: 'lazy-page',
              component: AppComponent,
              children: [
                  {
                      path: '',
                      loadChildren: './components/lazy/lazy.module#LazyModule',
                  }
              ]
          }
          

          你的app.component

          <router-outlet></router-outlet>
          

          MainRoutingModule

          {
              path: '',
              component: HomeComponent
          },
          

          这是你的 LazyModule 路由

          const routes: Routes = [
              {
                  path: '1',
                  component: LazyPage1Component
              }
          ];
          

          移除 ComponentModule

          希望对你有帮助

          【讨论】:

          • HomeComponent 从 MainModule 导出到 AppModule,所以这不是问题。此外,它加载主应用程序的部分没有问题,只有延迟加载的路由。
          • 另一方面,我认为也不是这样 - ComponentModule 没有导入到 LazyModule,所以 LazyModule 不应该关心那里发生了什么。
          • 如果您能给我更有意义的模块名称,也许我可以帮助您更多
          • 你需要比 Main、Shared 和 Lazy 更有意义多少?
          • 谢谢你 - 这不是解决方案,但它帮助我获得了更好的错误处理和更好的组织路由器,这让我发现我已经随机导入 app-routing.module 到不同的模块。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-24
          • 2019-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-16
          • 2021-01-05
          相关资源
          最近更新 更多