【问题标题】:Angular 4 - Multiple instances of modules in memoryAngular 4 - 内存中的多个模块实例
【发布时间】:2017-11-01 14:56:48
【问题描述】:

我们有一个使用lazy loading 的大型Angular 4 应用程序以及preloadAllModules 的预加载策略。我们正在使用Angular CLI

在 Chrome 检查器中查看内存问题时,我注意到我们到处都有多个模块实例。

如果我没看错的话,我们有 83 个 TranslateModuleHttpModule 等实例...

我唯一能想到的是每个lazy loaded 模块都有自己的根,需要为该捆绑包创建自己的模块?

是否有可能摆脱所有这些实例,或者它就是这样工作的?

【问题讨论】:

    标签: angular


    【解决方案1】:

    是否有可能摆脱所有这些实例,或者就是这样 有效吗?

    是的,只需将它们导入根AppModule。但是,虽然您可以避免将HttModule 放入每个加载的模块中,并且只能将其导入根AppModule 一次,但您无法避免RouterModule 的重复,应该像这样使用RouterModule.forChild(routes)

    重复发生是因为每个延迟加载的模块都有自己的注入器,其中包含所有导入模块的实例。因此,如果您有 83 个延迟加载模块,并且每个模块都导入 HttpModuleRouterModule,那么每个导入的模块将有 83 个实例。

    更多信息请阅读这里:

    【讨论】:

    • 我将我的共享模块和组件添加到 SharedModule 中,即使我将其导入到我的 AppModule 中,我仍然需要将 SharedModule 导入到我的延迟加载模块中。没有它,编译器就找不到正确的定义。导入这两次重复的代码实例吗?我的 SharedModule 是否已缓存?
    【解决方案2】:

    您应该将所有这些共享模块放入一个核心模块中,该模块只加载一次并且只由应用模块导入

    【讨论】:

    • RouterModule 应该在每个延迟加载的模块中导入,这是不可避免的
    • 路由器模块是不同的情况,每个模块都需要它自己的。我的意思是模块不需要它们自己的情况,它们可以使用共享实例。
    • 是的,所以他无法避免拥有 83 个实例,这是设计使然
    • 他可以很轻松地避开 83 个 http 模块和 translate 模块的实例。仅仅因为他不能消除所有重复并不意味着他不应该尽可能消除它。
    猜你喜欢
    • 2014-05-24
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多