在功能模块中导入 HttpClientModule

Importing HttpClientModule in feature modules

HttpClientModule 上的 docs 说:

Before you can use the HttpClientModule, you need to import the Angular HttpClientModule. Most apps do so in the root AppModule.

  1. 在这种情况下我们要将 HttpClientModule 导入 功能模块?
  2. 如果我们将它导入多个会发生什么 功能模块又被导入到根模块中?
  3. 当我们在一个应用程序中有几十个模块时,这是否是一个合适的用例,其中一些模块需要 HttpClientModule,而我们只想将 HttpClientModule 导入到那几个模块中?

因此,有两种方法可以在根模块中加载模块,

  1. 将其添加到导入数组中
  2. 延迟加载

现在,当您在 imports 数组中加载一个模块时,该模块提供的所有服务都将成为单例服务,也就是说,这些服务的单个实例将在整个应用程序中共享。这些服务的实例是由根喷油器̷a̷t̷t̷h̷e̷t̷h̷e̷t̷i̷t̷i̷m̷e̷o̷o̷f̷b̷b̷o̷o̷o̷t̷s̷o̷t̷s̷o̷t̷a̷p̷pr̷a̷o̷o̷1o̷o̷y̷yy̷yy̷o̷o̷o̷o̷u̷u̷u̷u̷u̷u̷u̷u̷a̷a̷a̷a̷a̷pp̷p̷p̷p̷p̷p̷p̷p̷p̷p̷c̷c̷a̷ten= 11 =

在服务方面,无论是在根模块中加载一个模块还是在多个功能模块中加载模块,然后在根模块中加载所有这些功能模块,最终都会得到服务的单个实例.

但是,就您的声明而言,即组件、管道、指令。如果要将 AModule 用于其导出的组件,则必须在要使用组件的功能模块中加载 AModule。

但是,您可以查看 HttpClientModule source_code。声明或导出数组中没有任何内容。它只提供服务,所以不管你是在你的特性模块中加载它(同时在根模块的导入数组中加载特性模块),还是在根模块中,你都会以任何一种方式获得它的服务。所以,只需将它加载到根模块中即可。

现在当你使用延迟加载来加载一个功能模块时,延迟加载的模块确实获得了根模块中所有其他模块提供的所有服务,但它有自己的注入器,这意味着如果你加载 HttpClientModule延迟加载的模块已经加载到根模块中,您最终将得到 HttpClientModule 提供的所有服务的两个实例,而您不希望这样。

您可以进一步阅读有关 forRoot 和 forChild 模式的更多信息来解决此类情况。