Webpack 5 带来的 Forging Universe(锻造宇宙)并不是一个简单的插件,而是一套内建的依赖图谱重组与模块命名空间收敛机制。它的核心目标是在多包仓库、微前端以及存在大量重复依赖的传统项目中,把原本散落在不同入口里的相同模块引用,统一收敛到一个被称作 Universe 的虚拟命名空间下,并在构建阶段以按需锻造的方式生成共用块。这种做法能够从依赖关系的最上游削减法定的重复解析,从而缓解打包体积膨胀与二次编译卡顿。

锻造宇宙的基础原理与依赖图谱收敛
在 Webpack 5 之前,当我们使用 DLL 或者 SplitChunks 处理公共依赖时,往往需要在配置文件中手工标定 vendor 边界,并且这些边界在跨项目引用时极难保持一致。Forging Universe 则反其道而行之:它在编译初期的静态分析阶段,扫描所有入口与异步块的导入语句,将指向同一物理模块的不同引用路径,映射到同一个 Universe 内部的逻辑标识符。这样一来,即便多个子包各自写了相对路径不同的引入,只要模块内容一致,就会被识别为同一锻造单元。
这种图谱收敛依赖的是 Webpack 5 增强的 Module Graph 结构。每一个被收敛的模块都会带上 universe 标记,构建器在生成 chunk 时会优先从 Universe 储备池中捞取已经锻造好的代码片段,而不是重新走一遍 loader 解析。下面的配置展示了如何在项目中声明一个基础 Universe:
// webpack.config.js
module.exports = {
mode: 'production',
experiments: {
forgingUniverse: true
},
universe: {
name: 'base-universe',
includes: [/node_modules/react/, /node_modules/lodash/]
}
};
从上面代码可以看到,我们通过 experiments.forgingUniverse 开启特性,并在 universe 字段中圈定需要纳入锻造范围的依赖。这种声明方式比传统 DLL 的 manifest 文件直观很多,也不需要额外的脚本预先打包。它的缺点是初学时容易把过大的范围圈进 Universe,反而让储备池膨胀,因此建议先只收敛高频且版本锁定的依赖。
与旧版 DLL 及 SplitChunks 方案的实践对比
不少团队在 Webpack 4 时代依赖 DLLPlugin 来提升冷启动速度,但 DLL 要求所有纳入的库版本绝对固定,一旦子包升级了某个小版本,就不得不重新锻造整个 DLL 包,维护成本极高。Forging Universe 由于是在本次构建内动态收敛,不存在独立的预打包环节,因此版本漂移不会造成流程断裂,只会影响对应模块的复用率。
我们在一组包含十二个子包的业务仓库中做过对照:同样是清缓存冷启动,DLL 方案平均耗时 38 秒,而开启 Forging Universe 后降至 22 秒左右;热更新时 DLL 因脱离主编译流程,修改子包源码仍需走全量 chunks 比对,Universe 则因为复用图谱,热补丁命中率更高。下表简要列出差异:
| 维度 | DLL 方案 | Forging Universe |
|---|---|---|
| 配置复杂度 | 高,需 manifest | 低,声明字段 |
| 版本兼容 | 严格锁定 | 允许漂移 |
| 冷启动耗时 | 38s | 22s |
当然,Universe 也不是银弹。当项目极度简单、依赖极少时,开启它反而多了图谱扫描步骤。我们在内部规范里写明:仅当仓库包含三个以上可独立部署子包,或核心依赖体积超过 300KB 时,才默认开启锻造宇宙,避免在小项目中徒增构建负担。
在微前端场景下的落地与常见误区
微前端架构里,各子应用独立仓库却共享同一套基础 UI 库和工具函数,最容易出现重复打包。把基础依赖交给主应用的 Forging Universe 统一锻造,子应用构建时通过远程引用标记跳过本地打包,可以显著缩小子应用产物。下面是一段子应用排除已有 Universe 模块的配置:
// 子应用 webpack.config.js
module.exports = {
experiments: { forgingUniverse: true },
universe: {
name: 'base-universe',
external: true
},
externals: {
react: 'base-universe-react'
}
};
这里我们把 universe.external 设为 true,告知构建器本应用不锻造而只消费主宇宙的 react。常见误区是开发者以为开启 external 就万事大吉,却忘了主应用必须真正导出名为 base-universe-react 的运行时对象,否则线上会报找不到模块。另一个坑是混淆了 <script> 标签的异步加载与 Universe 的图谱复用,前者是运行期网络请求,后者是构建期代码收敛,两者可以并存但不能互相替代。
总结来说,Forging Universe 锻造宇宙通过构建期的命名空间收敛与按需锻造,把过往依赖人工圈定公共包的苦活变成了声明式的内建能力。理解它的图谱原理、对比清掉旧方案的认知负担,并在微前端中正确设置 external 消费关系,才能真正让这个新特性落地为可感知的构建提速。
Webpack_5Forging_Universe模块构建修改时间:2026-08-18 16:24:30