Angular 启用 ivy 时的循环依赖
Angular cyclic dependency when enabling ivy
在我的 angular 项目中启用 ivy 后,一切都可以编译,但是在浏览器中启动应用程序时,我在应用程序 bootstrap:
期间收到以下错误
Error: Cannot instantiate cyclic dependency! ApplicationRef
at throwCyclicDependencyError (core.js:5208)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.hydrate (core.js:11763)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.get (core.js:11590)
at injectInjectorOnly (core.js:648)
at ɵɵinject (core.js:653)
at injectArgs (core.js:730)
at Object.factory (core.js:11858)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.hydrate (core.js:11767)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.get (core.js:11590)
at injectInjectorOnly (core.js:648)
我正在努力找出循环依赖的位置以及为什么它在不使用 ivy 时工作正常。我尝试使用 madge (madge --circular --extensions ts ./) 但没有发现循环依赖。
编辑:我手动检查了所有服务并验证它们之间没有循环依赖
事实证明,在我的 app.module 提供者中,我有一个 class 和 {provideIn: 'root'} 在 @Injectable() 中,删除修复它。
providers: [
{ provide: ErrorHandler, useClass: AppErrorHandler }
]
之前
@Injectable({ providedIn: 'root' })
export class AppErrorHandler implements ErrorHandler {
之后
@Injectable()
export class AppErrorHandler implements ErrorHandler {
我不知道为什么这在常春藤之前不是问题,即使有 AoT
我在更新 Angular 项目后遇到了同样的错误。
在更新之前我喜欢下面并且它一直有效直到 Angular 被更新:
@NgModule({
imports: [
...,
BrowserModule
],
declarations: [ErrorComponent],
providers: [
{
provide: ErrorHandler,
useClass: ErrorHandlerService,
}
]
})
export class ErrorModule { }
更新后,为了修复此错误,我已将此模块更改为:
@NgModule({
imports: [
...,
BrowserModule
],
declarations: [ErrorComponent]
})
export class ErrorModule {
public static forRoot(): ModuleWithProviders {
return {
ngModule: ErrorModule,
providers: [
{provide: ErrorHandler, useClass: ErrorHandlerService}
]
};
}
}
您必须在使用 @Injectable
的任何服务中的某处注入 Router
。所以你有两个选择:
解决方案 1
从您的服务构造函数中删除 router: Router
的依赖项。
解决方案 2
升级到最低 Angular 9.0.3 这解决了这个循环依赖问题。
(已在此 MR https://github.com/angular/angular/pull/35642 中修复)
在我的 angular 项目中启用 ivy 后,一切都可以编译,但是在浏览器中启动应用程序时,我在应用程序 bootstrap:
期间收到以下错误Error: Cannot instantiate cyclic dependency! ApplicationRef
at throwCyclicDependencyError (core.js:5208)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.hydrate (core.js:11763)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.get (core.js:11590)
at injectInjectorOnly (core.js:648)
at ɵɵinject (core.js:653)
at injectArgs (core.js:730)
at Object.factory (core.js:11858)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.hydrate (core.js:11767)
at R3Injector.push../node_modules/@angular/core/__ivy_ngcc__/fesm5/core.js.R3Injector.get (core.js:11590)
at injectInjectorOnly (core.js:648)
我正在努力找出循环依赖的位置以及为什么它在不使用 ivy 时工作正常。我尝试使用 madge (madge --circular --extensions ts ./) 但没有发现循环依赖。
编辑:我手动检查了所有服务并验证它们之间没有循环依赖
事实证明,在我的 app.module 提供者中,我有一个 class 和 {provideIn: 'root'} 在 @Injectable() 中,删除修复它。
providers: [
{ provide: ErrorHandler, useClass: AppErrorHandler }
]
之前
@Injectable({ providedIn: 'root' })
export class AppErrorHandler implements ErrorHandler {
之后
@Injectable()
export class AppErrorHandler implements ErrorHandler {
我不知道为什么这在常春藤之前不是问题,即使有 AoT
我在更新 Angular 项目后遇到了同样的错误。 在更新之前我喜欢下面并且它一直有效直到 Angular 被更新:
@NgModule({
imports: [
...,
BrowserModule
],
declarations: [ErrorComponent],
providers: [
{
provide: ErrorHandler,
useClass: ErrorHandlerService,
}
]
})
export class ErrorModule { }
更新后,为了修复此错误,我已将此模块更改为:
@NgModule({
imports: [
...,
BrowserModule
],
declarations: [ErrorComponent]
})
export class ErrorModule {
public static forRoot(): ModuleWithProviders {
return {
ngModule: ErrorModule,
providers: [
{provide: ErrorHandler, useClass: ErrorHandlerService}
]
};
}
}
您必须在使用 @Injectable
的任何服务中的某处注入 Router
。所以你有两个选择:
解决方案 1
从您的服务构造函数中删除 router: Router
的依赖项。
解决方案 2
升级到最低 Angular 9.0.3 这解决了这个循环依赖问题。
(已在此 MR https://github.com/angular/angular/pull/35642 中修复)