当我最近阅读 Angular2 的 doc 时,它是这样说的:
What if I import the same module twice?
That's not a problem. When three modules all import Module 'A', Angular evaluates Module 'A' once, the first time it encounters it, and doesn't do so > again.
That's true at whatever level A appears in a hierarchy of imported modules. > When Module 'B' imports Module 'A', Module 'C' imports 'B', and Module 'D' imports [C, B, A], then 'D' triggers the evaluation of 'C', which triggers the evaluation of 'B', which evaluates 'A'. When Angular gets to the 'B' and 'A' in 'D', they're already cached and ready to go.
Angular doesn't like modules with circular references, so don't let Module 'A'......
但我假设以上内容是在所有预加载模块的上下文中说明的。我怀疑这在延迟加载模块中是否成立,例如,如果 AppModule 和延迟加载功能模块都导入相同的模块(例如 ModuleA),ModuleA 会被加载两次吗?
我的想法是:当 AppModule 和延迟加载模块加载时,将创建两个 ModuleA 类型的模块实例。我的理解正确吗?有人可以帮我澄清一下吗?提前谢谢你。
最佳答案
不清楚“已加载”是什么意思。
Angular 不会从服务器加载它两次。在后续使用中,它从缓存中使用它。
如果你的意思是是否在内存中创建了多个实例,那么是的。
延迟加载的模块为依赖注入(inject)创建了一个新的子作用域。 如果一个模块被另一个本身被延迟加载的模块延迟加载,那么 DI 范围的层次结构将没有意义。
RootScope (AppModule)
/ \
LazyA LazyB
/ \
LazyC LazyC
如果只有一个 LazyC
的实例这将需要 LazyA
的提供者和 LazyB
可用于 LazyC
.
如果LazyB
怎么办永远不会加载?那么添加提供者就没有意义了。
Angular 也无法在范围创建后更新提供者。这就是延迟加载模块引入新子作用域的原因。他们的提供者未添加到 RootScope
因为它是所有非延迟加载模块的情况。
因此,创建一个新实例是唯一的方法。
但我认为这不会造成伤害。 除了 DI 范围外,我看不出这会有什么不同。
关于angular - 模块是否会在延迟加载模块中加载两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46792547/