Tree Shaking 在 Vite 中需模块写法、构建配置和第三方库支持三者协同才生效;仅 ES 模块有效,须显式导出、禁用 CommonJS、精调 treeshake 配置、声明 sideEffects、规避动态引用等陷阱,并通过构建报告验证效果。

Tree Shaking 在 Vite 中不是“开了就有效”的功能,它依赖模块写法、构建配置和第三方库支持三者协同。Vite 8+ 默认使用 Rolldown 作为 bundler,Tree Shaking 能力更强,但若代码或依赖不符合前提,体积优化效果会大打折扣。
确保模块语法合规
Tree Shaking 只对 ES 模块(import/export)生效,CommonJS(require/module.exports)会被完全跳过分析:
- 项目内所有工具函数、工具类必须用
export function或export const显式导出,避免export default { a, b }这种对象聚合写法 - 禁止混用
import和require;若引入旧版库(如普通 lodash),务必切换为lodash-es - 检查第三方库的
package.json是否含"type": "module"、"exports"或"module"字段,这是 ESM 入口的明确信号
精调 Vite 构建配置
Vite 默认开启 Tree Shaking,但关键行为需手动加固:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在
vite.config.js中启用严格模式:build: { rollupOptions: { treeshake: { moduleSideEffects: 'strict', propertyReadSideEffects: false } } } - 全局无副作用时,在项目根目录
package.json添加"sideEffects": false;若含 CSS 或初始化脚本,改用数组精确声明:"sideEffects": ["*.css", "src/main.ts"] - 禁用开发专用代码:配合
define注入环境变量,让if (import.meta.env.DEV) { ... }在构建时被 Terser 完全剔除
规避常见“摇不动”陷阱
即使语法正确,某些写法仍会让 Tree Shaking 失效:
立即学习“Java免费学习笔记(深入)”;
- 避免
import * as utils from './utils'—— 改用import { debounce } from './utils' - 不要把导出函数赋值给动态 key:
obj[flag] = someFn会阻断识别;静态字面量 key(如obj.a = fn)才安全 - 组件库按需引入要配对:比如 Element Plus 必须用
import { ElButton } from 'element-plus',且不额外引入样式文件(其内部已处理) - 检查构建产物:用
vite build --report生成report.html,确认未使用函数是否真的没出现在 chunk 中
Tree Shaking 不是黑盒压缩,而是基于静态结构的精准裁剪。写法决定上限,配置决定下限,验证决定是否真正落地。

















