模块会在延迟加载模块中加载两次吗

Icy*_*Brk 5 angular2-modules angular

当我最近阅读 Angular2 的doc 时,它是这样说的:

如果我两次导入同一个模块怎么办?

那不是问题。当三个模块都导入 Module 'A' 时,Angular 会在第一次遇到模块 'A' 时评估一次模块 'A',并且不会再这样做。

在导入模块的层次结构中出现的任何级别 A 都是如此。> 当模块'B'导入模块'A',模块'C'导入'B',模块'D'导入[C,B,A]时,然后'D'触发对'C'的评估,从而触发评估'B',评估'A'。当 Angular 到达 'D' 中的 'B' 和 'A' 时,它们已经被缓存并准备好了

Angular 不喜欢带有循环引用的模块,所以不要让 Module 'A' ......

但我认为上述内容是在所有 Eager Loading Modules 的上下文中说明的。我怀疑这是否适用于延迟加载模块,例如,如果 AppModule 和延迟加载功能模块都导入相同的模块(例如 ModuleA),ModuleA 会被加载两次吗?

我的想法是:当 AppModule 和延迟加载模块加载时,会创建 ModuleA 类型的两个模块实例。我的理解正确吗?有人可以帮我澄清一下吗?先感谢您。

Gün*_*uer 6

目前尚不清楚“已加载”是什么意思。

Angular 不会从服务器加载两次。在后续使用中,它会从缓存中使用它。

如果您的意思是是否在内存中创建多个实例,那么是的。

延迟加载的模块为依赖注入创建一个新的子作用域。如果一个模块被另一个本身延迟加载的模块延迟加载,则 DI 范围的层次结构将没有意义。

    RootScope (AppModule)
       /    \
    LazyA  LazyB
     /        \
  LazyC      LazyC
Run Code Online (Sandbox Code Playgroud)

如果只有一个实例,则需要和 的LazyC提供者可用。如果永远不会被加载怎么办?那么添加提供者就没有意义了。LazyALazyBLazyCLazyB

创建范围后,Angular 也无法更新提供程序。这就是延迟加载模块引入新子作用域的原因。它们的提供程序不会RootScope像所有非延迟加载模块那样添加到其中。因此,创建新实例是唯一的方法。

在我看来,这不会造成伤害。除了 DI 范围之外,我不知道这会产生什么影响。


Icy*_*Brk 1

根据我所做的实验,当我在延迟加载模块中导入相同的模块时,当加载该延迟加载时,我可以看到该共享模块的构造函数被再次调用。这回答了我的问题,答案是肯定的。如果大家有不同意见,欢迎指出。