【问题标题】:Would the module loaded twice in Lazy-load module模块会在延迟加载模块中加载两次吗
【发布时间】:2017-10-17 14:25:42
【问题描述】:
当我最近阅读 Angular2 的 doc 时,它是这样说的:
如果我两次导入同一个模块会怎样?
这不是问题。当三个模块都导入模块'A'时,Angular
评估模块“A”一次,它第一次遇到它,并且不再这样做。
在导入模块的层次结构中出现的任何级别 A 都是如此。 > 当模块'B'导入模块'A',模块'C'导入'B',模块'D'导入[C,B,A],然后'D'触发'C'的评估,这触发了评估'B',评估'A'。 当 Angular 到达“D”中的“B”和“A”时,它们已经被缓存并准备好了。
Angular 不喜欢带有循环引用的模块,所以不要让 Module 'A'......
但我假设上述内容是在所有急切加载模块的上下文中说明的。我怀疑这在延迟加载模块中是否成立,例如,如果 AppModule 和延迟加载功能模块都导入相同的模块(例如 ModuleA),ModuleA 会加载两次吗?
我的想法是:当 AppModule 和延迟加载模块加载时,会创建两个 ModuleA 类型的模块实例。我的理解正确吗?有人可以帮我澄清一下吗?提前谢谢你。
【问题讨论】:
标签:
angular
angular2-modules
【解决方案1】:
不清楚您所说的“已加载”是什么意思。
Angular 不会从服务器加载两次。在随后的使用中,它会从缓存中使用它。
如果你的意思是是否在内存中创建了多个实例,那么是的。
延迟加载的模块为依赖注入创建了一个新的子作用域。
如果一个模块被另一个本身是延迟加载的模块延迟加载,那么 DI 作用域的层次结构就没有意义了。
RootScope (AppModule)
/ \
LazyA LazyB
/ \
LazyC LazyC
如果只有一个LazyC 实例,则需要LazyA 和LazyB 的提供者对LazyC 可用。
如果永远不会加载LazyB 怎么办?那么添加提供者就没有意义了。
在创建范围后,Angular 也无法更新提供程序。这就是延迟加载模块引入新子作用域的原因。他们的提供者不会添加到RootScope,因为所有非延迟加载的模块都是如此。
因此,创建一个新实例是唯一的方法。
在我看来,这不会造成伤害。
除了 DI 范围,我看不出这会有什么不同。
【解决方案2】:
根据我做的实验,当我在延迟加载模块中导入相同的模块时,当加载延迟加载时,我可以看到该共享模块的构造函数被再次调用。所以这回答了我的问题,答案是肯定的。如有不同意见,欢迎指出。