Angular - HttpClientModule应该在CoreModule的Exports数组中吗?

时间:2018-05-09 20:38:44

标签: angular typescript ng-modules

好吧,我正按照以下基础设施构建我的项目:

  • 功能模块。
  • 核心模块。
  • 共享模块。

但有些事我还不够清楚。

据我所知,HttpClientModule应该在CoreModule中,因为......它提供了HttpClient服务来向服务器发出HTTP请求。

现在,imports数组允许Angular模块使用其他模块中提供的功能,exports数组允许Angular模块公开其某些功能。

我在CoreModule

中有这个
@NgModule({
    imports: [
        BrowserAnimationsModule,
        HttpClientModule,
        RouterModule.forRoot(routes, {
            enableTracing: true
        })
    ],
    exports: [
        RouterModule
    ]
})
export class CoreModule {
}

现在,由于我的CoreModule导入AppModule,因此HttpClientModuleBrowserAnimationsModule也不应该导出?就像RouterModule一样。

我看到CoreModuleSharedModule就像某种桥梁。

SharedModule对我来说更有意义:

@NgModule({
    imports: [
        MatButtonModule
    ],
    exports: [
        MatButtonModule
    ]
})
export class SharedModule {
}

SharedModule导入MatButtonModule然后将其导出,以便其他模块可以使用它。

CoreModule不应该是一样的吗?因为App运行良好;但是,我处于开发模式。

希望我足够清楚,有人可以帮我解决这个疑问。

2 个答案:

答案 0 :(得分:3)

否,NgModule的exports数组不应包含没有组件,指令或管道的模块(例如HttpClientModule)。

从NgModule导出内容的目的是使其他模块(或这些其他模块中的内容)访问该模块的组件,指令和管道,有时还会赋予这些其他模块为方便起见,可以从其他模块访问(即重新导出)组件,指令和管道。

您的CoreModuleRouterModule列为导出文件,以便任何导入CoreModule的人都可以使用routerLink属性指令(除其他外)。也就是说,RouterModule导出组件,指令和/或管道。

由于HttpClientModule没有声明任何组件,指令或管道,因此将其列为NgModule导出没有任何价值。

这些Angular guide NgModule FAQs也可能有用:

答案 1 :(得分:-1)

我个人认为BrowserAnimationsModule可以而且应该在AppModule本身中导入。

如果您使用HttpClient的所有服务都在CoreModule本身中,则无需导出HttpClientModule。

即使您在其他模块中使用HttpClient,您也可以在该特定模块中导入HttpClientModule,或者在AppModule中执行(除了延迟加载的模块)。