angular - 模块是否会在延迟加载模块中加载两次

标签 angular angular2-modules

当我最近阅读 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/

相关文章:

Angular 2 ng-bootstrap 关闭模态

css - 更改primeng PanelMenu 样式

angular - 如何将第一个选项设置为选定的选项,其中选项是从选择框 anular 4 中的循环构建的

javascript - 添加提供程序@NgModule 时出现 Angular2 "No provider for Service!"错误

Angular2 - 'Can' t 在将 http 注入(inject)自定义服务时解决所有参数错误

javascript - 如何在主路由中加载新路由

javascript - Angular 2 引导函数给出错误 "Argument type AppComponent is not assignable to parameter type Type"

Angular:如何将异步属性数据绑定(bind)到背景图像

angular - 如何在另一个 ng 模块上导入/使用延迟加载模块

Angular2 模块 : How can i import a service from another module