Tree Shaking 是通过静态分析剔除未使用 ES 模块代码的优化技术,依赖 import/export 语法、无副作用声明及生产模式配置三者协同生效。

Tree Shaking 是一种通过静态分析剔除未使用代码的优化技术,它依赖 ES 模块(import/export)的静态结构,只保留实际被引用的模块导出内容,从而减小最终打包体积。
确保使用 ES 模块语法
Tree Shaking 只对 ES 模块有效。CommonJS(require/module.exports)是运行时动态加载,无法被静态分析,因此无法被摇掉。
- 用
import { debounce } from 'lodash-es'替代const _ = require('lodash') - 优先选用支持 ES 模块的库,例如
lodash-es、date-fns(而非moment) - 自己的代码也坚持用
export和import,避免混合写法
避免副作用干扰摇树
如果模块有副作用(如执行全局逻辑、修改原型、调用立即执行函数),打包工具可能为安全起见保留整个模块,即使没显式引用。
- 在
package.json中声明"sideEffects": false(表示无副作用) - 若部分文件有副作用(如 CSS 导入、polyfill),可写成
"sideEffects": ["*.css", "src/polyfill.js"] - 避免在模块顶层写执行语句,把副作用逻辑封装进函数里再导出
启用生产模式与压缩工具
Tree Shaking 通常由打包器(如 Webpack、Vite、Rollup)在生产构建中自动触发,但需配合正确配置才能生效。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- Webpack 中确保
mode: 'production',并启用optimization.usedExports: true - Vite 默认开启,无需额外配置;检查
build.minify是否启用(如'terser') - 使用 Terser 压缩时,会进一步删除已标记为“未使用”的函数和变量
验证是否生效
不能只靠猜测,要实际检查产物或构建报告确认 Tree Shaking 起效。
- Webpack:加
--stats=verbose或用webpack-bundle-analyzer查看哪些模块被排除 - Vite:运行
vite build --report生成report.html分析依赖图 - 查看最终 bundle 源码,搜索未使用的导出名(如
export function unusedHelper())是否还存在
不复杂但容易忽略:语法、副作用、构建配置三者缺一不可。只要模块规范、无隐式副作用、构建设置正确,Tree Shaking 就能稳定帮你瘦身。

















