Webpack 开启 Tree Shaking 后,Vue 组件里的未使用方法为啥没被删掉?

百里翌萌 阅读 18

我用 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>
我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
上官妍妍
改一下就行,问题出在 Vue 单文件组件的 methods 是通过对象字面量定义的,Webpack 的 Tree Shaking 识别不了这种动态结构,因为它没法静态分析出哪些方法被用了、哪些没被用。

Tree Shaking 只对 ES Module 的 import/export 生效,而 Vue 的 export default { methods: { ... } } 是 CommonJS 风格的对象,Webpack 默认认为整个对象都有可能被用到,所以不会删掉任何字段。

解决方案有两个:

一个是升级到 Vue 3 +