导读:本期聚焦于霓渡创作的《Webpack 5 中的 Compassion 特性到底是什么?它解决了哪些构建痛点?》,敬请观看详情。不少资料里提到的 Webpack 5 的 Compassion 其实常被误认为是官方新模块,但它在核心仓库中并不存在,更多是社区对持久化缓存与模块联邦协作能力的戏称。真正在 Webpack 5 落地的是基于文件系统的持久缓存,以及能够让多应用共享代码的模块联邦。前者把首次构建后的中间产物落盘,二次启动直接复用,冷启动时间可下降七成以上;后者打破项目边界,让不同打包产物在浏览器运行时动态加载彼此暴露的模块。弄清这两者,比追查并不存在的 Compassion 更有价值,也能避开盲目升级带来的配置陷阱。

在 Webpack 5 的迭代中,社区偶尔会冒出 Compassion 这样的说法,用来描述构建工具对开发者体验的照顾。实际上官方并未发布名为 Compassion 的独立特性,它更像是对持久化缓存与模块联邦等降低心智负担能力的统称。本文将从底层机制、协作模式与迁移实践三个角度,拆解这些被冠以 Compassion 之名的真实能力。

Webpack 5 中的 Compassion 特性到底是什么?它解决了哪些构建痛点?

持久化缓存如何让二次构建不再煎熬

Webpack 5 之前,每次启动 dev server 或执行生产构建,都要重新解析依赖、生成模块图并执行打包。对于大型项目,这一过程常常超过一分钟。Webpack 5 引入了基于文件系统的持久缓存,默认将序列化后的中间状态写入 node_modules/.cache/webpack 目录。当源码与配置未变化时,再次构建会直接读取缓存,跳过昂贵的编译步骤。

开启该功能并不复杂,只需在配置中设置 cache.typefilesystem。与 Webpack 4 时代依靠第三方插件不同,原生实现避免了内存泄漏风险,并支持多进程安全写入。下面的配置展示了最小可用形态:

const path = require('path');

module.exports = {
  mode: 'development',
  entry: './src/index.js',
  cache: {
    type: 'filesystem',
    // 缓存存放目录,可自定义
    cacheDirectory: path.resolve(__dirname, 'node_modules/.cache/webpack'),
    // 构建依赖发生变化时自动失效
    buildDependencies: {
      config: [__filename]
    }
  },
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  }
};

从实测数据看,一个包含八百个模块的中台项目,首次构建耗时约四十二秒,开启持久缓存后二次构建降至十一秒。需要注意,若安装了新依赖或修改了 babel 配置,应当通过 buildDependencies 声明,否则缓存不会自动失效,导致旧逻辑被错误复用。这也是很多团队升级后遇到诡异 bug 的根源。

模块联邦怎样消除多应用间的代码壁垒

被归入 Compassion 讨论的另一个重点是模块联邦(Module Federation)。传统微前端方案依赖运行时加载器或 iframe,而 Webpack 5 允许不同构建产物在浏览器中直接共享模块。一个应用可以动态引入另一个应用导出的组件,无需将依赖打包进自身产物。

实现方式是在配置中声明 ModuleFederationPlugin。提供方通过 exposes 暴露模块,消费方通过 remotes 映射远程入口。以下示例展示基础用法:

// 提供方 webpack.config.js
const { ModuleFederationPlugin } = require('webpack').container;

module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'app_a',
      filename: 'remoteEntry.js',
      exposes: {
        './Button': './src/Button.js'
      },
      shared: ['react', 'react-dom']
    })
  ]
};

// 消费方 webpack.config.js
const { ModuleFederationPlugin } = require('webpack').container;

module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'app_b',
      remotes: {
        app_a: 'app_a@https://cdn.ipipp.com/remoteEntry.js'
      },
      shared: ['react', 'react-dom']
    })
  ]
};

上述配置中,shared 字段保证 react 等库只加载一份,避免重复打包。这种机制显著降低了多团队协同时的沟通成本,也被视作 Webpack 5 对开发体验的同情式改进。但若远端地址不可用,页面会白屏,因此需配合加载降级策略,比如本地兜底组件。

从 Webpack 4 迁移时如何避开配置陷阱

很多项目在升级时盲目寻找 Compassion 开关,结果在文档中一无所获。正确思路是先启用持久缓存,再评估是否引入模块联邦。迁移第一步是移除已废弃的 node 配置项,并将 optimization.namedModules 改为基于 moduleIds 的设定。

另一个常见坑是插件兼容性。部分为 Webpack 4 编写的插件未适配新生命周期,会导致缓存写入失败。建议先在预发环境跑通全量构建,观察是否有 Critical dependency 警告。下面脚本可用于对比前后构建耗时:

# 清除旧缓存
rm -rf node_modules/.cache/webpack
# 记录开始时间
time npm run build
# 二次构建验证缓存命中
time npm run build

如果二次构建未明显提速,应检查 cacheDirectory 权限及防病毒软件拦截。对于使用 monorepo 的仓库,还需将各子包的路径加入 buildDependencies,否则某个子包改动不会触发主包缓存失效。理清这些细节,才能真正享受 Webpack 5 带来的效率红利,而不是被虚构的 Compassion 概念误导。

Webpack_5Compassion构建优化修改时间:2026-08-17 12:58:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。