【问题标题】:Angular 4 Circular dependency detected检测到Angular 4循环依赖
【发布时间】:2017-09-08 09:56:11
【问题描述】:

将 Angular Cli 升级到 1.3.1 我现在有一些警告

WARNING in Circular dependency detected: src\app\work-sessions\work-session-list\work-session-list.routing.ts
-> src\app\work-sessions\work-session-list\index.ts -> src\app\work
-sessions\work-session-list\work-session-list.routing.ts

每个类都有这样的结构:

work-session-list.routing.ts

import { Route } from '@angular/router';
import { WorkSessionListComponent } from './index';

export const WorkSessionRoutes: Route[] = [
  {
    path: '',
    component: WorkSessionListComponent
  },
];

Index.ts

export * from './work-session-list.component';
export * from './work-session-list.routing';

work-sessions-list.module.ts

import { WorkSessionListComponent } from './work-session-list.component';
import { WorkSessionRoutes } from './work-session-list.routing';
import { DataTableModule } from 'primeng/primeng';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router';

@NgModule( {
    imports: [RouterModule.forChild( WorkSessionRoutes ), CommonModule , FormsModule],

    declarations: [WorkSessionListComponent],
    exports: [WorkSessionListComponent]
} )

export class WorkSessionListModule { }

比 app.routing.ts

export const AppRoutes: Routes = [
      {
        path: 'workSession',
        loadChildren: './work-sessions/work-session-list/work-session-list.module#WorkSessionListModule'
      }
.
.
.

在app.module

中
 @NgModule({
imports: [
CommonModule,
BrowserAnimationsModule,
FormsModule,
RouterModule.forRoot(AppRoutes),
 })
  ],
  declarations: [
    AppComponent
  ]
  bootstrap: [AppComponent]
})
export class AppModule {}

我该如何解决这个问题?它有效,但我有很多警告

【问题讨论】:

    标签: angular typescript angular-routing


    【解决方案1】:

    正如警告所说,work-session-list.routing.ts 取决于 index.ts:

    import { WorkSessionListComponent } from './index';
    

    而index.ts 依赖于work-session-list.routing.ts:

    export * from './work-session-list.routing';
    

    第一个依赖不是必需的,因为您可以直接从其源文件中导入WorkSessionListComponent:

    import { WorkSessionListComponent } from './work-session-list.component';
    

    此更改应该可以解决问题。

    【讨论】:

    • 这样我可以消除索引文件吗?
    • index.ts 文件被称为barrels,在 Angular2 R.C. 之前很有用。 5 因为当时没有 NgModules。桶是避免无数进口/出口的唯一解决方案。现在我们有了模块,它们已经过时了。 angular.io/guide/glossary#barrel
    • 会不会导致问题?升级 cli 后我收到相同的警告
    • @AlexBeugnet 在拥有 NgModules 时使用桶仍然有用!
    • 这是错误的解决方案。桶文件应该用于深度导入。
    【解决方案2】:

    Ján Halaša 的答案是正确的。我想解释一些东西以使事情清楚。

    index.ts 不应该被删除,它仍然应该被使用。

    我遇到了同样的问题,在我的情况下,我有一个 cards 主模块,其中包含许多子模块。 (基于https://medium.com/@tomastrajan/the-best-way-to-architect-your-angular-libraries-87959301d3d3)

    所以在我的tsconfig.ts 我有

    "@com-tuxin/cards/*": [
     "projects/cards/*",
     "projects/cards"
    ],
    "@com-tuxin/cards": [
     "dist/cards/*",
     "dist/cards"
    ]
    

    在projects/cards/src/lib 下,我的每个模块都有一个目录,每个模块都有index.ts 文件。

    我会收到循环依赖警告的原因是因为我会在我所在的同一模块中使用桶包含组件。

    例如我有子模块article-card,我有这个代码:

    import { NgModule } from '@angular/core';
    import { CommonModule } from '@angular/common';
    import {ArticleCardComponent} from '@com-tuxin/cards/src/lib/article-card';
    import {MatCardModule} from '@angular/material/card';
    import {MatButtonModule} from '@angular/material/button';
    
    
    @NgModule({
      declarations: [
        ArticleCardComponent
      ],
      imports: [
        CommonModule,
        MatCardModule,
        MatButtonModule,
      ],
      exports: [
        ArticleCardComponent
      ]
    })
    export class ArticleCardModule { }
    

    所以问题在于import {ArticleCardComponent} from '@com-tuxin/cards/src/lib/article-card;,因为我在那个确切的模块中,我应该使用确切的路径而不是桶,所以我用它切换了

    import {ArticleCardComponent} from '@com-tuxin/cards/src/lib/article-card/article-card.component';
    

    就是这样,问题解决了。

    在我需要 article-card 组件的其他库中,我只需要包含 @com-tuxin/cards/src/lib/article-card 就不会得到循环依赖。

    希望这能解决问题。

    【讨论】:

    • 这里对我来说的关键声明是,“因为我在那个确切的模块中,所以我应该使用确切的路径而不是桶”。这帮助我摆脱了一堆基于桶的循环依赖警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2013-08-19
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多