Angular 在AppModule中导入的共享模块
我正在阅读关于模块的文档,寻找一行不鼓励在AppModule中导入SharedModule的内容 我没有发现这方面的任何东西,只是一个GitHub问题,它指出最好不要导入它。然而,没有任何深刻的解释 Angular不鼓励在共享模块中提供服务,我确实同意这一点。但没有别的 所以我的问题是: 由于我的所有功能模块都是延迟加载的,需要导入共享模块,但我的应用程序组件也需要使用同一共享模块提供的内容,因此将其导入AppModule是一种不好的做法吗 后果可能是什么Angular 在AppModule中导入的共享模块,angular,Angular,我正在阅读关于模块的文档,寻找一行不鼓励在AppModule中导入SharedModule的内容 我没有发现这方面的任何东西,只是一个GitHub问题,它指出最好不要导入它。然而,没有任何深刻的解释 Angular不鼓励在共享模块中提供服务,我确实同意这一点。但没有别的 所以我的问题是: 由于我的所有功能模块都是延迟加载的,需要导入共享模块,但我的应用程序组件也需要使用同一共享模块提供的内容,因此将其导入AppModule是一种不好的做法吗 后果可能是什么 提前感谢所有人将SharedModu
提前感谢所有人将
SharedModule
导入AppModule
的问题在于,提供程序将在功能模块中注入两次(一次由SharedModule
注入,一次由AppModule
注入)这将导致服务不再像人们想象的那样是单身
实现这一点的常见模式不是直接在@NgModule
声明中公开提供者,而是在静态forRoot
函数中公开提供者(名称不是强制性的,这是一种约定),如下所示:
export class SharedModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: SharedModule,
providers: [
...
]
};
}
}
将
SharedModule
导入AppModule
时,请使用SharedModule.forRoot()
,将其导入功能模块时,只需将其作为SharedModule
导入即可,只需查看此链接在AppModule
中导入共享模块不是一种坏做法
共享模块是关于拥有公共模块,例如如果您有表单模块
某些模块
,则需要在所有模块上使用这些模块,而不是在所有模块中导入。您可以在共享模块
中导入这些模块,然后将其导出-查看链接以了解更多说明
对于服务,它可以只在一个模块中注入AppModule
-服务是可注入的
,如果它已经注入到根模块中,则可以在任何模块中使用
@Injectable({
providedIn: 'root'
})
在您的服务顶部使用此装饰器,它将自动将您的服务注入根模块
谢谢-快乐编码 只要您避免在共享模块内声明服务,我看不出有任何问题。对!谢谢你的提示!除此之外,你没有看到任何其他“问题”?唯一让我担心的是SharedModule可能会随着时间的推移而增长,那么当用户在加载AppModule时部署和请求它时,它会成为一个巨大的庞然大物吗?对我来说,唯一可能发生的另一件事确实是共享模块变得非常大,并导致每个JS块(初始或延迟加载)也变得很大,使用可能未使用的代码(即使树震动看起来相当有效)。但我认为这是一个问题,如果它发生了,你会有时间看到它的到来。将下面的答案标记为已接受,因为它指出了一个重要的步骤,除此之外,即使你的答案也是有效的,所以我投了赞成票。谢谢你的时间:)没问题-谢谢