为什么模块构造函数只调用一次



假设我有三个模块:

  • 应用程序模块
  • 核心模块
  • SomeFeature模块

然后我

  • 在应用模块中导入Core和SomeFeature模块
  • 在SomeFeature模块中导入Core模块
  • 将console.log('hello'(添加到Core模块的构造函数

为什么"你好"只打印一次?因此为什么核心模块构造函数被调用一次

这是stackblitz:https://stackblitz.com/edit/angular-ivy-bdter8


我问是因为我看到了这段代码:

export class CoreModule {
constructor(@Optional() @SkipSelf() parentModule?: CoreModule) {
if (parentModule) {
throw new Error(
'CoreModule is already loaded. Import it in the AppModule only'
);
}
}
}

它应该防止核心模块被导入到应用程序模块以外的模块中。我想尝试一下,但我想它只有在懒加载模块中重新移植的情况下才能工作??

此外,注入模块是如何工作的?哪里提供模块?我最近了解了DI解析是如何为服务工作的,但它是如何为模块工作的?

不太确定你想要实现什么,但在一个健康的角度应用程序上,模块构造函数应该只调用一次。

如果第二次加载的模块提供服务,您可能会得到多个服务实例。Angular文档指出:

延迟加载模块有自己的注入器

延迟加载的服务的作用域为延迟加载模块的注入器

因此,当模块在主应用程序和lazzy加载的应用程序中都使用时,lazzy加载肯定会导致这种情况。

如果你没有懒散地加载(stackblitz就是这样(,并且你在应用程序的不同部分导入了模块,那么模块只会构造一次。它的实例将由根ModuleInjector处理。

这就是你的";你好";只打印一次。

相关内容

最新更新