tree shaking 需es模块语法、正确工具配置与代码写法协同:禁用commonjs、设babel modules: false、webpack production模式下启用usedexports/sideeffects/concatenatemodules,并在package.json声明sideeffects,最后通过构建产物验证。

Tree Shaking 不是开关一按就生效的功能,它依赖打包工具在构建时对 ES 模块的静态分析。要让它真正起作用,得从项目结构、工具配置和代码写法三方面协同设置。
确保使用 ES 模块语法并避免破坏静态分析
这是最基础也是最关键的一步。Tree Shaking 只对 import/export 有效,CommonJS(require/module.exports)无法被静态识别,会直接失效。
- 所有源码必须用
export function xxx()或export const xxx = ...明确导出,避免export default { a, b }这类“对象大杂烩”写法 - 引入时优先用具名导入:
import { debounce } from 'lodash-es',而不是import _ from 'lodash' - 禁用 Babel 将 ES 模块转成 CommonJS:在
@babel/preset-env中设modules: false,否则 import/export 会被编译掉
Webpack 中启用 Tree Shaking 的关键配置
Webpack 5+ 在 mode: "production" 下默认开启 Tree Shaking,但需确认以下几项未被覆盖或误关:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
optimization.usedExports: true—— 标记每个导出是否被引用(Webpack 默认已开) -
optimization.sideEffects: true或false—— 启用副作用分析,配合package.json中的"sideEffects"字段使用 -
optimization.concatenateModules: true—— 合并模块,提升摇树精度(Webpack 5 默认开启) - 确保没有手动覆盖
optimization.minimize: false,否则 Terser 不会执行最终剔除
声明副作用,让工具敢“摇”
有些文件虽没导出,却执行了全局操作(如注入 CSS、监听事件、修改原型),打包工具不敢删它们。这时需在 package.json 中明确说明:
- 若整个包无副作用,写
"sideEffects": false - 若有少量副作用文件(如 CSS、入口初始化脚本),写成数组:
"sideEffects": ["*.css", "src/init.js"] - 不写该字段,或设为
true,Webpack 会跳过该包的 Tree Shaking
验证是否真的生效
别只看文档,动手检查才可靠:
- 构建后打开 dist 文件,搜索
/* unused harmony export—— 有则说明已被标记,Terser 后续会删 - 用
webpack-bundle-analyzer查看依赖图,未使用的模块不应出现在产物中 - 故意加一行
import { unusedFn } from './utils',再构建对比体积变化;若体积没涨,说明已被成功摇掉
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










