Tree Shaking需在manifest.json中显式启用,如mp-weixin或h5节点下配置optimization.treeShaking.enable: true;同时须确保ES模块语法、第三方库支持ESM、正确声明sideEffects。

manifest.json 里必须配对开启 treeShaking
Tree Shaking 不是默认打开的,uni-app 各端(H5、微信小程序等)都需要显式声明。只改 webpack 配置或 babel 设置没用,构建流程根本不走那条路径。
在 manifest.json 中对应平台节点下添加 optimization.treeShaking.enable: true,例如微信小程序:
{
"name": "my-app",
"mp-weixin": {
"optimization": {
"treeShaking": {
"enable": true
}
}
}
}
H5 端同理,但路径是 "h5": { "optimization": { "treeShaking": { "enable": true } } }。不写 enable 或写成 false,等于没开。
避免 commonjs 模块破坏摇树效果
uni-app 默认 babel 配置中 modules: 'commonjs' 会把 ES6 import/export 转成 require,导致 webpack 无法做静态分析,Tree Shaking 直接失效。
解决方式有二,优先选前者:
- 升级到
uni-app@3.9.0+(2026 年已稳定),该版本已修复自定义组件模式下modules: 'commonjs'导致的 Tree Shaking 失效问题 - 若无法升级,临时在
babel.config.js中强制设为modules: false,但需确认项目无运行时 require 动态加载逻辑,否则可能报Cannot find module
注意:modules: false 仅适用于你完全使用 ES6 模块语法的项目;混用 require() 和 import 会导致构建失败或摇树漏判。
第三方库要支持 ES Module 才能被摇
像 lodash、moment 这类早期采用 CommonJS 的库,默认引入整个包,import { debounce } from 'lodash' 也救不了——因为它的源码没用 export。
可行方案:
- 换用 ESM 友好替代:如
lodash-es替代lodash,date-fns替代moment - 手动指定子路径:用
import debounce from 'lodash/debounce',绕过入口 index.js - 检查库的
package.json是否含"type": "module"或"exports"字段,这是现代 ESM 支持的关键信号
别信“加了 sideEffects: false 就能摇”,如果库本身没导出、没按需引用,sideEffects 配置只是摆设。
自定义组件和 vue 文件里的副作用要声明
Tree Shaking 会把没被引用、又没声明副作用的文件整个删掉——比如你写了全局样式、uni.addInterceptor、或 App.vue 里直接执行的初始化逻辑,都算副作用。
在 package.json 里补上:
"sideEffects": [ "*.vue", "*.css", "*.scss", "static/**/*" ]
尤其注意:"*.vue" 必须显式列出,否则 import './components/MyButton.vue' 却没在任何地方 use 它,整个文件可能被误删。
另外,uni-app 的 onLaunch、onShow 等生命周期钩子不是自动注册的,如果只在某个页面里写了 onLaunch(() => {...}) 但没被任何模块 import,也可能被摇掉——得确保它们被主入口或插件机制实际调用。
真正卡住的地方往往不是配置开关,而是库的模块形态、副作用隐式触发、以及 vue 单文件里那些看似“只是写写”的代码——它们既没 export,也没被 import,却承担着关键行为。摇树不是魔法,它只认明确的导入导出关系和声明过的副作用。


















