当我最近阅读Angular2的doc时,它会这样说:
如果我导入两次相同的模块怎么办?
这不是问题。当三个模块都导入模块'A',Angular 在第一次遇到模块'A'时评估模块'A',并且没有这样做>试。
在任何级别A出现在导入模块的层次结构中都是如此。 >当模块'B'导入模块'A',模块'C'导入'B',模块'D'导入[C,B,A],然后'D'触发'C'的评估,触发评估'B',评估'A'。 当Angular到达'B'时'B'和'A'时,它们已经缓存并准备好。
Angular不喜欢带有循环引用的模块,所以不要让模块'A'......
但我认为上述内容是在所有Eager Loading Modules的背景下说明的。我怀疑这是否适用于延迟加载模块,例如,如果AppModule和延迟加载功能模块都导入相同的模块(例如ModuleA),ModuleA会被加载两次吗?
我的想法是:当AppModule和延迟加载模块加载时,将创建ModuleA类型的两个模块实例。我的理解是否正确?有人可以帮我澄清一下吗?提前谢谢。
答案 0 :(得分:2)
目前还不清楚你的意思是什么" loading"。
Angular不会从服务器加载两次。在后续使用中,它从缓存中使用它。
如果你的意思是在内存中是否创建了多个实例,那么是。
延迟加载的模块为依赖项注入创建一个新的子范围。 如果模块由另一个本身延迟加载的模块延迟加载,则DI范围的层次结构将没有意义。
LazyC
如果LazyA
只有一个实例,则LazyB
和LazyC
的提供商可以LazyB
使用。
如果永远不会加载RootScope
怎么办?然后添加提供商是没有意义的。
Angular在创建范围后也无法更新提供程序。这就是延迟加载模块引入新子范围的原因。它们的提供程序未添加到<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/shareitbaby.io/public"
ServerName www.shareitbaby.io
ServerAlias shareitbaby.io
<Directory "C:/xampp/htdocs/shareitbaby.io/public">
AllowOverride All
Order allow,deny
Allow from all
</Directory>
,因为所有非延迟加载的模块都是如此。
因此,创建新实例是唯一的方法。
在我看来,这并不会造成伤害。 除了DI范围,我不知道这会如何产生影响。
答案 1 :(得分:1)
根据我的实验,当我在Lazy-Load模块中导入相同的模块时,加载延迟加载时,我可以看到该共享模块的构造函数再次被调用。所以这回答了我的问题,答案是肯定的。如果有人有不同的意见,请指出。