【问题标题】: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 实例,则需要LazyALazyB 的提供者对LazyC 可用。 如果永远不会加载LazyB 怎么办?那么添加提供者就没有意义了。

    在创建范围后,Angular 也无法更新提供程序。这就是延迟加载模块引入新子作用域的原因。他们的提供者不会添加到RootScope,因为所有非延迟加载的模块都是如此。 因此,创建一个新实例是唯一的方法。

    在我看来,这不会造成伤害。 除了 DI 范围,我看不出这会有什么不同。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-05-22
        • 1970-01-01
        • 2020-01-24
        • 2017-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多