Angular Lazy Loaded模块依赖项(遇到未定义的提供程序)

时间:2018-04-08 02:46:37

标签: angular webpack angular-cli

我在Angular 5应用中拥有核心共享和许多功能模块。这些功能模块中的每一个都是延迟加载的。

几乎所有人都彼此依赖。例如,我有一个延迟加载的消息模块,该模块依赖于另一个延迟加载的模块(非核心,不是共享)来解析路由数据。

当我用yarn start编译应用程序时,一切正常。但是,当我尝试使用ng build --prod构建应用程序并且AOT启动时,我收到以下错误:

  

错误:遇到未定义的提供商!通常,这意味着您具有循环依赖性(可能是由于使用'桶'index.ts文件引起的。

我的错误是在构建时没有标记循环依赖项。

如果我使用ng build --no-aot --prod构建没有AOT的应用程序,我就没有错误,一切正常。

我尝试从角度CLI中弹出应用程序,以便使用webpack任务直接构建应用程序,但没有结果或详细说明正在发生的事情。

我从哪里开始调试此问题?

我在我的应用中使用了很多桶文件。他们每个都有类似的结构(样式借用Todd Motto的NGRX课程):

import { AlertsComponent } from '@alerts/containers/alerts/alerts.component';
import { AlertComponent } from '@alerts/containers/alert/alert.component';

export const containers: Array<any> = [AlertsComponent, AlertComponent];

export * from '@alerts/containers/alerts/alerts.component';
export * from '@alerts/containers/alert/alert.component';

这些容器在这个模块中传播:

import * as fromAlertsContainers from '@alerts/containers';
import * as fromCoreGuards from '@core/guards';

@NgModule({
    imports: [RouterModule.forChild(routes), SharedModule, CommonModule],
    providers: [...fromCoreGuards.guards],
    declarations: [...fromAlertsContainers.containers],
    exports: [...fromAlertsContainers.containers]
})
export class AlertsModule {}

我做错了什么?为什么它适用于yarn start而不适用于ng build --prod

  

测试#1:使用forwardRef作为补丁。

目前正在测试以下解决方案,如果可行/解决问题,我会与您保持联系:

@Inject(forwardRef(() => ApiService))
private apiService: ApiService
  

解决方案<!/强>

以下是我解决问题的方法。

  1. 从AppModule中删除了所有providers
  2. 逐个重新插入每个。
  3. 每次插入后,我运行ng build --prod,然后等待构建结果。
  4. 事实证明,我有以下代码导致循环

    依赖:  提供者:[   地点,    {提供:LocationStrategy,useClass:PathLocationStrategy},    {      提供:HTTP_INTERCEPTORS,      useClass:AuthTokenInterceptor,      多:真的    } ]

  5. PathLocationStrategy需要LocationLocation需要PathLocationStrategy

0 个答案:

没有答案