tree shaking 在 commonjs 中无法生效,因其依赖静态分析而 commonjs 是运行时动态加载;需转为 esm(import/export)、设"type": "module"或.mjs后缀,优先选用原生 esm 库如 lodash-es,并避免混用 require。

Tree Shaking 在 CommonJS 中无法真正生效,这不是配置问题,而是原理限制。
它根本不能在 CommonJS(require / module.exports)环境下工作——因为 Tree Shaking 依赖静态分析,而 CommonJS 的导入导出是运行时动态决定的,打包工具无法在编译阶段确定哪些代码被使用、哪些没被用。
所以不存在“在 CommonJS 中配置 Tree Shaking”的有效方案。但你可以做这几件事来绕过这个限制:
把项目代码全部转为 ESM
使用import/export替代require/module.exports;确保.js文件被当作 ES 模块处理(可通过package.json中设置"type": "module",或用.mjs后缀)。转换第三方 CommonJS 库(有限效果)
像 Rollup 的@rollup/plugin-commonjs或 Webpack 的resolve.alias+babel-plugin-transform-commonjs可尝试将 CommonJS 转成 ESM 形式。
⚠️ 注意:转换后仍可能丢失可摇性(例如module.exports = { a: 1, b: 2 }转成export default { a: 1, b: 2 },就变成默认导出,无法按需剔除单个属性)。优先选用原生 ESM 的库
查看目标库的package.json:是否有"type": "module",或"exports"字段明确指向.mjs/./dist/index.esm.js等 ESM 入口。比如lodash-es就是专为 Tree Shaking 设计的 ESM 版本,比lodash(CommonJS)更易摇掉未用函数。避免混写
即使主项目用了 ESM,如果某个文件里写了require('./utils'),就会中断静态分析链,导致整个模块无法被摇。这种“混合写法”是常见翻车点。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











