angular - 角度延迟加载重复模块
问题描述
我正在尝试将延迟加载集成到我的 Angular 应用程序中。
我有 4 个模块。每个模块都是延迟加载的。
- FirstPageWithTitleModule
- SecondPageWithTileModule
- ThirdPageWithTitleModule
- 随机模块
前 3 个模块正在导入我的自定义 TitleModule。
我的问题:如果所有路由都是lazyLoaded,TitleModule 会发生什么?它会生成 3 次并将其大小添加到lazyLoadedModule 中吗?或者它是否会以单一文件大小仅生成 1 次并在所有三个模块中使用?
解决方案
这是此示例的一个工作项目:stackblitz。
我正在回答这两个问题:
TitleModule
1. (title.module.ts) 会在包中出现多少次?
答:1。
由于是在多个依赖图sTitleModule
中导入的,
(每个 LazyLoaded 模块一个。例如loadChildren: () => import('app/first-page-with-title-module.module').then(m =>m.FirstPageWithTitleModule)
:)
Webpack 足够聪明,可以检测到这些多个引用,他将为共享模块(文件)创建一个单独的块。(Angular 作为 webpack 中的插件运行)
这是webpack 文档中与此场景相关的一个小示例。
在demo中:可以在控制台看到title-module.ts被webpack解析了1次。由于 webpack 只将模块(文件)推送到包中一次,因此它只需要读取一次,然后将其放在缓存中。
TitleModule
2.实例化多少次?
答案:3
每个loadChildren
回调最终都会在 Angular 源代码中结束并执行factory.create(parentInjector)
,这意味着将创建一个新的 NgModule 作为父路由的子路由。
所以现在我们有 3 个新的延迟加载模块:
- FirstPageWithTitleModule
- SecondPageWithTileModule
- ThirdPageWithTileModule
TitleModule
当他试图破译其装饰器的import
数组时,每个人都会创建对象。对象中不存在并且惰性模块不共享模块,InjectionTokens(providers),除非它们在共享的祖先注入器中。NgModule
TitleModule
parentInjector
在演示中:您可以在 console.log 中看到 TitleModule 实例化 3 次(每次输入路由时它都会实例化 - 除非它已经在此路由中创建) - 最大数量为 3。
推荐阅读
- php - 如何防止php脚本和mysql数据库创建另一行
- c# - Microsoft Service Fabric 和日志记录
- vue.js - Vee-Validate:具有多个条件的相关下拉列表
- django - 如何在 Django 项目中使用 Marzipano 360 媒体查看器?
- swift - 防止像 ScreenShieldKit 这样的用户截图
- javascript - 将 Container 组件连接到 ReactJs 中的 Redux 存储,但出现错误,提示 BrowserRouter 需要一个字符串但得到一个对象
- python - 使用 Pandas DataFrame 填补每日时间序列中的漏洞错过了 00:00 的漏洞
- javascript - 正确处理 Promise Rejections
- multithreading - 基础设施说我不能再创建线程,但我的程序还有更多工作要做,我该怎么办?
- python - GCP python错误:创建teamdrive时“用户对此文件没有足够的权限”