Vite中esbuild用于依赖预构建和生产压缩,可通过optimizeDeps.exclude精简预构建、esbuildOptions.minify开启预构建压缩、build.esbuild配置target/pure优化生产压缩,需避免配置陷阱并清除缓存。

Vite 默认用 esbuild 处理依赖预构建和代码压缩,速度快、开箱即用。但要真正榨干它的性能,得在 vite.config.ts 里精准调参,而不是只靠默认值。
明确 esbuild 的两个关键作用场景
esbuild 在 Vite 中分两阶段工作:
- 开发阶段的「依赖预构建」(把 node_modules 里的 CJS/UMD 转成 ESM)
- 生产构建时的「JS/CSS 压缩」(若
build.minify设为'esbuild')
这两处都能通过 esbuildOptions 或 build.esbuild 配置优化。
精简预构建,跳过已兼容 ESM 的包
很多现代库(如 vue-demi、lodash-es、@vueuse/core)本身已是原生 ESM,Vite 却仍会把它拉进预构建流程,白白耗时。用 optimizeDeps.exclude 排除它们:
export default defineConfig({
optimizeDeps: {
exclude: ['vue-demi', 'lodash-es', '@vueuse/core']
}
})这样 esbuild 就不会去解析、转换这些包,预构建时间明显缩短,尤其对大型 monorepo 项目效果显著。
开启预构建阶段的轻量压缩
Vite 的 optimizeDeps.esbuildOptions 支持传入 minify: true:
optimizeDeps: {
esbuildOptions: {
minify: true
}
}注意:这仅压缩预构建产物(即 node_modules/.vite/deps/ 下的 .js 文件),不作用于业务代码;它能减小内存占用、加快后续模块解析,但不会影响最终打包体积。
立即学习“Java免费学习笔记(深入)”;
生产构建中合理选用 esbuild 压缩模式build.minify: 'esbuild' 是默认值,适合绝大多数场景——压缩快、体积省、支持 target 控制语法降级。但要注意:
- 它不删除
console和debugger,如需彻底清理日志,必须切到terser - 若项目含大量 TypeScript,可加
target: 'es2020'避免过度降级,提升压缩率build: { minify: 'esbuild', esbuild: { target: 'es2020', pure: ['console.log', 'console.warn'] // 主动标记可移除的全局调用 } }其中
pure是 esbuild 5.0+ 新增特性,配合tree-shaking更激进地删掉被标记的副作用调用。
避免常见陷阱
- 不要给
esbuildOptions错误地加jsx: 'automatic'等与业务无关的选项,它只用于预构建,不处理.tsx源码 -
esbuild的drop类参数(如drop: ['console'])在 Vite 里不生效,那是 Terser 的写法 - 修改
esbuildOptions后务必清空node_modules/.vite缓存,否则配置可能不触发
不复杂但容易忽略


















