【问题标题】:Should I add modules to Imports in SharedModule - Angular?我应该将模块添加到 SharedModule - Angular 中的 Imports 中吗?
【发布时间】:2020-05-01 11:57:47
【问题描述】:

这是我的共享模块

import { CommonModule } from "@angular/common";
import { NgModule } from "@angular/core";
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
import { IconModule } from "@my-app/components/icon/icon.module";
import { RequiredActionDirective } from "@my-app/directives/required-action.directive";

@NgModule({
    imports: [
        CommonModule,
        IconModule
    ],
    declarations: [
        RequiredActionDirective
    ],
    exports: [
        CommonModule,
        IconModule,
        FormsModule,
        ReactiveFormsModule,
        RequiredActionDirective
    ]
})
export class SharedModule { }

请注意,我只添加了Imports CommonModuleIconModule。我这样做是因为我在 RequiredActionDirective 中使用了这些模块。但是Exports 有更多的模块,因为将被其他将导入SharedModule 的模块使用。

问题:我是否正确地认为我不需要将模块添加到Imports,除非我想直接在SharedModule 中使用它们?或者将来可能会出现一些我目前不知道的问题,因为现在一切正常?

【问题讨论】:

    标签: angular typescript angular-module shared-module


    【解决方案1】:

    您不应无故重新导出模块,而应仅导入当前模块所依赖的模块。 import 没有什么坏处,但是 exporting 在依赖关系树中为提供者创建了一个 branch

    一旦一个模块重新导出一个模块,导入它的父模块就不能覆盖该导入。所以在某些极端情况下这可能是个问题。

    例如;

    NgModule({
         imports: [HttpClientModule],
         provide: { provide: HTTP_INTERCEPTORS, useClass: ExampleInterceptor, multi: true },
         exports: [HttpClientModule]
    })
    export class SharedModule {}
    

    现在 AppModule 不能提供另一个拦截器了。

    NgModule({
         imports: [SharedModule],
         provide: { provide: HTTP_INTERCEPTORS, useClass: AppInterceptor, multi: true }
         // ^^ interceptor is ignored
    })
    export class AppModule {}
    

    原因是HttpClientModuleSharedModule 级别的提供程序树中声明,并从该点解析所有HTTP_INTERCEPTORS向下

    要求AppModule应先导入HttpClientModule,再导入SharedModule

    NgModule({
         imports: [HttpClientModule, SharedModule],
         provide: { provide: HTTP_INTERCEPTORS, useClass: AppInterceptor, multi: true }
    })
    export class AppModule {}
    

    现在HttpClientModuleAppModule 级别声明并解析所有提供程序向下,包括SharedModuleimports: [] 数组中的顺序并不重要。

    【讨论】:

    • 我同意,但您的案例考虑到了供应商,这是另一回事。 SharedModule 的假设是在每个模块中聚合我几乎想要使用的最常见的模块。我在问是否需要在我进一步导出它们之前导入,但似乎我不需要。 :)
    猜你喜欢
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2020-12-10
    • 2013-04-14
    • 2018-10-28
    相关资源
    最近更新 更多