Vite预构建后依赖包体积反而变大了怎么办?

Mr-培静 阅读 106

我在项目里给某个第三方库用了vite optimizeDeps预构建,结果打包后的vendor.js比之前还大200kb,这是怎么回事?

之前配置是这样的:


optimizeDeps: {
  entries: ['index.html'],
  exclude: ['vue-demi'],
  include: ['lodash'],
  // 添加了预构建配置
}

尝试过删除node_modules和dist重新构建,还是没变化。用vite inspect看依赖图发现lodash被拆成了多个独立块,但其他未预构建的库反而合并得更好。是不是预构建参数设置有问题?

我来解答 赞 16 收藏
二维码
手机扫码查看
2 条解答
长孙彤彤
我遇到过类似情况,预构建反而让体积变大,通常不是配置错了,而是预构建的依赖没被正确复用。你这里用 include: ['lodash'] 其实有点问题——lodash 本身是模块化导出的(比如 import _ from 'lodash'import debounce from 'lodash/debounce'),但预构建会把它打包成一个整体 UMD 或 ESM 文件,反而把本来可以 tree-shaking 的部分“固化”了。

Vite 的 optimizeDeps 更适合那些本身没有良好 ESM 分包、或者依赖链深且静态分析困难的库(比如 old-school 的 jQuery 插件、某些打包不规范的包),而不是 lodash 这种本身就支持 tree-shaking 的库。

我的做法是先检查你项目里怎么用 lodash 的——如果只是用几个函数,比如 import debounce from 'lodash/debounce',那根本不需要预构建,Vite 默认就能 tree-shaking;只有当你用的是 import _ from 'lodash' 这种全量引入时,才可能需要预构建,但这时候你得配合 lodash-es 或者用 babel-plugin-lodash 来避免全量引入。

另外你看到 vendor.js 被拆成多个块,很可能是因为 Vite 把 lodash 预构建后生成了 .vite/deps/lodash.js 这样的缓存,但你的业务代码里其实没完全命中这个缓存(比如动态 import、条件引用),反而导致重复加载。

建议先删掉 include: ['lodash'],然后运行 vite --force 清掉预构建缓存再试一次。如果确实有性能问题,用 npm run build -- --report 看具体是谁占了体积——我之前遇到过 lodash-es 被重复打包两次的情况,一次是直接依赖,一次是间接依赖,这种得用 resolve.aliasoptimizeDeps.include 显式指定统一入口。

还有个小坑:如果你用了 optimizeDeps.exclude: ['vue-demi'],但没加 vue-demi 到 include,它不会被预构建,但 lodash 如果被它间接引用,也可能导致重复打包。总之预构建不是“加了就快”,它更像一种“强制提前绑定”的手段,用不好反而会变重。
点赞 4
2026-02-27 08:02
轩辕红凤
预构建导致体积变大确实可能是优化参数没配对。直接用这个配置试试:

export default {
optimizeDeps: {
entries: ['index.html'],
exclude: ['vue-demi', 'lodash'], // 把lodash排除掉
include: [], // 不要手动指定include,让Vite自己决定
},
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
return 'vendor'; // 强制合并第三方库到一个chunk
}
},
},
},
},
}


原因是你之前把 lodash 单独拎出来预构建了,结果它被拆成了小块。去掉手动指定的 include,让 Vite 自己判断哪些需要预构建,同时用 manualChunks 强制合并第三方库。

再跑一次 vite build 看看,应该能解决问题。如果还不行,可能就是那个第三方库本身的问题了,得换个库或者找作者反馈。
点赞 14
2026-01-30 17:03