tree shaking 是现代打包工具在构建时通过静态分析移除未引用的 es module 代码的过程;仅对 es module 有效,需生产模式、正确语法、合理配置 sideeffects 并验证生效。

Tree Shaking 是 Webpack、Rollup、Vite 等现代打包工具在构建时自动识别并移除未被引用的 JavaScript 模块代码的过程,前提是代码使用 ES Module(import/export)语法。它不是运行时行为,而是在静态分析阶段完成的“死代码消除”。
确保使用 ES Module 语法
Tree Shaking 只对 ES 模块有效,CommonJS(require/module.exports)无法被静态分析,因此不会被 shake。
- ✅ 正确:用
export const foo = ...和import { foo } from './utils.js' - ❌ 无效:用
module.exports = { foo }或const utils = require('./utils') - ⚠️ 注意:即使入口文件是 ES Module,若依赖的第三方库用了 CommonJS,其内部未使用的导出也无法被 shake
避免副作用干扰(sideEffects)
某些模块虽然没有显式导出,但执行时会产生副作用(如修改全局变量、打补丁、注册事件),打包工具默认不敢删——除非你明确声明哪些文件无副作用。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 在
package.json中配置:"sideEffects": false→ 表示整个包无副作用,所有未引用模块都可删"sideEffects": ["*.css", "*.scss"]→ 只有这些文件有副作用,其余 JS 全部可 shake - 不写
sideEffects字段,或设为true,工具会保守处理,跳过 shake
启用生产模式 + 模块优化
Tree Shaking 默认只在生产模式(mode: 'production')下生效,且需开启相关优化选项:
- Webpack:确保
mode: 'production',它会自动启用optimization.usedExports: true(标记导出是否被使用)和optimization.concatenateModules: true(作用域提升) - Vite / Rollup:默认开启,无需额外配置;但若用了动态
import(),其内容不会被 shake(因为是运行时决定) - 注意:
console.log、debugger等语句不会被自动移除,需靠TerserPlugin压缩阶段清理
检查是否生效的小技巧
验证 Tree Shaking 是否起作用,不要只看最终 bundle 大小(可能被压缩掩盖),而是看中间产物:
- Webpack:加
--stats=verbose,查看usedExports字段是否为true,或用 Webpack Bundle Analyzer 查看模块引用关系 - Rollup/Vite:启用
build.rollupOptions.output.manualChunks或生成.map文件后搜索未引用的函数名 - 简单测试:写一个只
export不import的函数,构建后搜索该函数名,若在最终代码中不存在,说明 shake 成功
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










