假设我有三个模块:
- 应用程序模块
- 核心模块
- 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处理。
这就是你的";你好";只打印一次。