核心是用工厂函数封装异步加载逻辑并缓存 promise 实例,确保同一模块标识只加载一次;工厂函数必须返回缓存的 promise,以反映加载中/失败状态、支持重试与 await,避免重复请求或状态丢失。

核心是用工厂函数封装异步加载逻辑,并借助闭包缓存 Promise 实例,确保同一模块标识只触发一次加载、多次调用共享结果。
为什么工厂函数必须返回 Promise 而非直接返回模块
异步模块(如远程配置、i18n 包、插件定义)加载有延迟、可能失败、需统一错误处理。若工厂函数同步返回模块对象,就无法反映加载中或失败状态;若每次调用都 new Promise,又会重复请求。只有返回一个被缓存的 Promise,才能真正实现“按需实例化”——首次调用触发加载,后续调用复用该 Promise 的生命周期。
- Promise 是“任务句柄”,代表一次确定的异步执行过程
- 缓存 Promise 可自然支持 .then/.catch,也兼容 await
- 失败后可重试(重新调用工厂函数),而缓存最终值则无法区分“未加载”和“加载失败”
闭包内维护模块级 Promise 缓存
用 Map 或普通对象在工厂函数外部作用域中保存「模块名 → 正在进行的 Promise」映射,确保相同 key 下不重复发起加载:
- 首次请求某模块时,动态 import() 并将返回的 Promise 存入缓存
- 后续请求同一模块,直接返回缓存中的 Promise,不再执行 import()
- 闭包隔离了缓存状态,避免全局污染,也防止外部误修改
支持参数化与多实例场景
当模块加载依赖运行时参数(如 locale、theme、tenantId),可将参数序列化为缓存 key:
- 例如 key = `chart-module-${locale}-${theme}`
- 这样不同语言+主题组合会各自缓存独立 Promise,互不影响
- 仍保持“同一参数组合下仅一次加载”,符合“按需实例化”的语义
配合容器做统一生命周期管理
在应用启动阶段,不急于加载所有模块,而是由容器(如 IApplication 实例)按需调用工厂函数,并集中处理加载状态、错误回退、超时控制等:
- 组件或插件通过容器获取模块,而非自行 import
- 容器可记录哪些模块已加载、哪些正在加载、哪些加载失败
- 便于实现预加载策略、离线降级、灰度发布等高级能力










