Tree Shaking 在第三方库上生效需满足三条件:库为原生 ESM、导入方式精准(命名/路径导入)、无副作用干扰;它与按需加载互补而非替代,须验证产物确认是否真正生效。

Tree Shaking 在第三方库上起效,不是靠“加个配置就自动瘦身”,而是需要库本身可被静态分析、引入方式精准、副作用不干扰,三者缺一不可。它和按需加载(如组件自动导入、路径级导入)是互补手段,不是替代关系。
选对库:必须是原生 ESM 支持的版本
CommonJS 格式的库(比如普通 lodash、moment)无法被 Tree Shaking 分析,因为 require 是运行时行为。构建工具看不到你到底用了哪个函数。
- 优先用官方提供的 ESM 变体:用
lodash-es替代lodash,用date-fns替代moment,用Element Plus或Ant Design Vue(非 UMD 版)替代旧版 Ant Design React - 检查库的
package.json是否含"module": "es/index.js"或"type": "module"字段——这是 ESM 入口的关键标识 - 避免“伪 ESM”:有些库虽有
module字段,但内部仍用export default { ... }打包成一个大对象,这会阻断具名导出识别,应选每个函数单独export function xxx()的结构
写对导入:命名导入 + 显式路径,禁用全量引用
导入写法直接决定构建工具能否建立“使用关系”。import * as xx 或 import xx from 'xxx' 会让整个模块保留在 bundle 中。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确写法:
import { debounce, throttle } from 'lodash-es'或import debounce from 'lodash-es/debounce' - ❌ 错误写法:
import _ from 'lodash'、import * as antd from 'antd'、import antd from 'antd' - Vue/React 模板中也要同步:写了
<el-button>就得确保已import { ElButton }并注册,否则构建工具无法关联,可能退化为全量加载或运行时报错
管住副作用:别让工具“不敢删”
如果一个模块执行时会改全局、注入样式、操作 DOM,构建工具会保守保留整个文件——哪怕你只调用了一个小函数。
立即学习“Java免费学习笔记(深入)”;
- 在项目根目录
package.json中设置"sideEffects": false,表示默认无副作用 - 有真实副作用的文件必须显式列出:
"sideEffects": ["*.css", "*.scss", "src/polyfill.js"] - 避免在模块顶层写
console.log('init')、document.body.appendChild(...)、Element.prototype.xx =这类语句;把副作用逻辑封装进函数里再导出
验证是否真生效:别信感觉,看产物
Tree Shaking 不是开关一开就万事大吉。很多项目配置看似正确,实则因某处副作用或导入写法问题,根本没摇掉任何代码。
- 构建后打开 dist 目录下的 JS 文件,搜索一个你明确没使用的函数名(如
someUnusedHelper),确认它不存在 - Vite 项目运行
vite build --report,打开生成的report.html查看依赖图谱 - Webpack 项目用
webpack-bundle-analyzer插件,直观对比模块大小与引用链 - 临时加一行
import { unusedFn } from 'lodash-es',再构建看体积是否变化——不变说明已被成功摇掉

















