我在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
解决方案<!/强>
以下是我解决问题的方法。
providers
。ng build --prod
,然后等待构建结果。事实证明,我有以下代码导致循环
依赖: 提供者:[ 地点, {提供:LocationStrategy,useClass:PathLocationStrategy}, { 提供:HTTP_INTERCEPTORS, useClass:AuthTokenInterceptor, 多:真的 } ]
PathLocationStrategy
需要Location
,Location
需要PathLocationStrategy
。