Webpack 开启 Tree Shaking 后,Vue 组件里的未使用方法为啥没被删掉?
我用 Webpack 5 + Vue 2 做项目,明明开启了 Tree Shaking,但发现一些没用到的 methods 还是被打包进去了,体积下不来。我试过把 mode 设成 production,也确认用了 ES6 模块语法,但好像对 Vue 单文件组件里的 methods 无效?
比如下面这个组件,我只用了 handleClick,但 handleUnused 也被打包了:
<template>
<button @click="handleClick">点我</button>
</template>
<script>
export default {
methods: {
handleClick() { console.log('used'); },
handleUnused() { console.log('unused!'); }
}
}
</script>
methods是通过对象字面量定义的,Webpack 的 Tree Shaking 识别不了这种动态结构,因为它没法静态分析出哪些方法被用了、哪些没被用。Tree Shaking 只对 ES Module 的
import/export生效,而 Vue 的export default { methods: { ... } }是 CommonJS 风格的对象,Webpack 默认认为整个对象都有可能被用到,所以不会删掉任何字段。解决方案有两个:
一个是升级到 Vue 3 +
,它默认生成的是 ES Module 代码,Tree Shaking 才能真正生效;另一个是继续用 Vue 2 的话,把方法拆成独立的
export function,比如:这样 Webpack 才能识别
handleUnused没被引用,从而在打包时删掉它。另外记得确认
package.json里没写"sideEffects": false把整个模块标记为无副作用(Vue 组件是有副作用的),或者至少把.vue文件排除掉:不然 Tree Shaking 会更不靠谱。