Vite 的 manualChunks 配置不生效是怎么回事? 司空圣恩 提问于 2026-02-27 10:48:22 阅读 62 优化 我在 Vite 项目里想用 manualChunks 把 lodash 单独打包,但 build 之后发现它还是被打进 vendor 里了,根本没拆出来。 我试过在 vite.config.js 里这样配: build: { rollupOptions: { output: { manualChunks: { lodash: ['lodash'] } } } } 但完全没用,是不是写法有问题?还是说要配合其他配置才行? 开发工具构建工具 我来解答 赞 14 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 Mr.克培 Lv1 问题很可能是 lodash 被 Vite 的 optimizeDeps 预构建了,预构建的依赖会直接打包,不会触发 manualChunks。 解决办法是从 optimizeDeps 中排除 lodash: export default defineConfig({ optimizeDeps: { include: [] }, build: { rollupOptions: { output: { manualChunks: { lodash: ['lodash'] } } } } }) 或者用函数式写法更稳: manualChunks(id) { if (id.includes('lodash')) return 'lodash'; } 回复 点赞 2026-03-19 09:15 シ鑫丹 Lv1 你这个写法本身没问题,标准写法确实是这么配的,但 Vite 在底层会自动合并 manualChunks,如果你项目里用了 build.rollupOptions.output.manualChunks,但没关掉 Vite 自带的自动分包策略,那它可能会被覆盖掉。 关键点是:Vite 默认开启了 build.rollupOptions.output.manualChunks 的自动处理(比如把 node_modules 里的包都归到 vendor),你需要显式地禁用它的自动逻辑,或者用函数式写法覆盖它。 最简单的办法是改用函数式写法,比如这样: export default defineConfig({ build: { rollupOptions: { output: { manualChunks(id) { if (id.includes('lodash')) { return 'lodash' } } } } } }) 或者如果你坚持用对象写法,得确认你没在别的地方(比如插件)动态改过 manualChunks,也最好把 Vite 默认的自动拆分关掉,比如: export default defineConfig({ build: { rollupOptions: { output: { manualChunks: { lodash: ['lodash'] } } }, // 禁用 Vite 默认的自动拆分逻辑(vite 5+) chunkSizeWarningLimit: 1000, rollupOptions: { output: { manualChunks: { lodash: ['lodash'] } } } } }) 不过更推荐用函数式写法,因为对象写法有时候会被 Vite 内部逻辑合并掉,函数式写法更可控。 另外记得检查下你用的 Vite 版本,vite 5 之后默认的 rollup 行为改过,有些老配置可能不兼容。如果还是没生效,跑个 vite build --debug 看下 rollup 的 output.manualChunks 配置是不是被覆盖了,经常是被插件偷偷改了。 回复 点赞 5 2026-02-27 11:00 加载更多 相关推荐 2 回答 71 浏览 Vite的manualChunks配置后组件还是单独打包怎么办? 我在用Vite开发React项目时,想通过manualChunks把四个公共组件打包到同一个chunk里,但配置后每个组件还是单独生成了文件... 项目结构是这样的,四个组件分布在不同页面: // v... 丹丹 优化 2026-01-30 16:11:34 2 回答 48 浏览 Vite 的 manualChunks 配置怎么让第三方库单独打包? 我在用 Vite 做项目,想把像 lodash、axios 这些第三方库单独打成 vendor 包,但配置了 manualChunks 后发现它们还是被打进 main.js 里了,根本没拆出来。我试过... 打工人路阳 优化 2026-03-07 16:04:23 1 回答 50 浏览 Vite迁移后publicPath配置不生效怎么办? 我从Webpack迁移到Vite,原来在Webpack里用publicPath: '/static/'设置静态资源前缀,现在Vite里改成了base: '/static/',但打包后的CSS和JS路径... ლ婉琳 工具 2026-03-21 08:10:20 2 回答 31 浏览 Vite 里怎么自定义 esbuild 的 JSX 配置? 我用 Vite 搭了个 React 项目,想改 esbuild 的 jsxFactory 配置,但不知道在哪配。试过在 vite.config.js 里加 build.esbuild,但好像没生效? ... a'ゞ付敏 前端 2026-03-09 21:49:20 2 回答 112 浏览 为什么切换到Vite后Sass配置不生效?Webpack和Vite的CSS处理配置有何不同? 我之前用Webpack配置了Sass,现在迁移到Vite后样式文件报错说找不到变量,但代码明明没改啊。之前在vue.config.js里通过chainWebpack添加了sass-loader,现在换... ❤丽丽 前端 2026-02-18 21:47:33 2 回答 71 浏览 迁移Vite到4.x后react插件配置报错怎么办? 今天升级Vite到4.x后,react插件配置突然报错了。之前用vite-plugin-react时这样写的: import react from '@vitejs/plugin-react' exp... 哲玮(打工版) 工具 2026-02-17 10:23:28 2 回答 45 浏览 Vite配置Library模式打包后导出的文件无法被其他项目引入怎么办? 我在用Vite的Library模式打包一个工具库时遇到问题,按照文档配置了library选项,但打包生成的umd文件在另一个项目里引入时一直报错:Uncaught TypeError: Cannot ... Air-卫红 前端 2026-02-15 10:24:34 2 回答 52 浏览 Vite+React项目中配置别名后无法导入组件,路径报错怎么办? 在用Vite搭建React项目时,我按文档配置了@别名指向src目录,但导入组件时总提示404错误。比如这样写: // vite.config.js import { defineConfig } f... 迷人的晟华 框架 2026-02-14 19:05:26 2 回答 40 浏览 Vite打包时如何正确配置Rollup排除node_modules中的特定包? 我在用 Vite 构建 Vue3 项目,想通过 Rollup 配置把某个第三方库(比如 lodash-es)从打包结果中排除,但试了几次都没成功,build 后还是被打包进去了。 我查了文档,在 vi... 小婉琳 前端 2026-03-27 07:59:22 1 回答 56 浏览 Vite 的 HMR 到底是怎么知道我改了哪个模块的? 最近在用 Vite 开发 Vue 项目,发现改个组件保存后浏览器自动更新了,但我不太明白它是怎么精准定位到具体模块并只更新那一部分的。我试过在控制台看 network,发现有 /__vite_hmr ... 树行酱~ 前端 2026-03-26 21:12:19
optimizeDeps预构建了,预构建的依赖会直接打包,不会触发 manualChunks。解决办法是从 optimizeDeps 中排除 lodash:
或者用函数式写法更稳:
build.rollupOptions.output.manualChunks,但没关掉 Vite 自带的自动分包策略,那它可能会被覆盖掉。关键点是:Vite 默认开启了
build.rollupOptions.output.manualChunks的自动处理(比如把 node_modules 里的包都归到 vendor),你需要显式地禁用它的自动逻辑,或者用函数式写法覆盖它。最简单的办法是改用函数式写法,比如这样:
或者如果你坚持用对象写法,得确认你没在别的地方(比如插件)动态改过 manualChunks,也最好把 Vite 默认的自动拆分关掉,比如:
不过更推荐用函数式写法,因为对象写法有时候会被 Vite 内部逻辑合并掉,函数式写法更可控。
另外记得检查下你用的 Vite 版本,vite 5 之后默认的 rollup 行为改过,有些老配置可能不兼容。如果还是没生效,跑个
vite build --debug看下 rollup 的 output.manualChunks 配置是不是被覆盖了,经常是被插件偷偷改了。