核心目标是跳过已原生支持ESM、体积小、无需转换的依赖,如vue、vue-router@4+、dayjs、axios等纯ESM包,以及mitt、nanoid等轻量库,或已CDN引入的jspdf等大型库,需通过package.json验证"type":"module"或"exports"字段确保安全排除。

在 Vite 中配置预构建排除项(optimizeDeps.exclude),核心目标是跳过那些**已原生支持 ESM、体积小、无需转换**的依赖,从而减少预构建耗时、加快开发服务器启动,并避免冗余处理引发的兼容性问题。
哪些依赖适合 exclude?
不是所有第三方包都该进预构建流程。以下类型可安全排除:
-
纯 ESM 格式包:如
vue、vue-router@4+、pinia、dayjs、axios—— 它们的package.json明确声明"type": "module"或提供"exports"字段指向 ESM 入口 -
极轻量工具库:如
lodash-es(注意:它本身是 ESM,但若项目中混用 CJS 版本则需谨慎)、mitt、nanoid,体积通常小于 5KB,直接加载无压力 -
已通过 CDN 引入的大型库:比如
jspdf、pdfjs-dist,若已在 HTML 中用<script>标签引入并挂载为全局变量,就该从预构建中排除,避免重复打包
exclude 的正确写法与常见陷阱
配置错误容易导致运行时报错 not a module 或模块解析失败,关键看格式是否真正兼容浏览器原生 ESM:
- ✅ 正确示例:
exclude: ['vue', 'dayjs', 'axios']—— 确认它们在 node_modules 中确实是 ESM 输出 - ❌ 错误做法:
exclude: ['lodash']——lodash是 CommonJS 包,必须保留预构建;应改用lodash-es并确认其 ESM 属性后再考虑排除 - ⚠️ 注意上游依赖:
some-esm-package若内部依赖了cjs-dep,不能只 exclude 前者,而要把cjs-dep加入include - ? 验证方法:进入对应包的
node_modules/xxx/package.json,检查是否有"type": "module"或合规的"exports"字段
配合 include 和缓存提升整体效果
单独设 exclude 不够,需与 include 协同,并保障缓存稳定:
立即学习“Java免费学习笔记(深入)”;
- 明确
include大体积或非 ESM 依赖,如'monaco-editor/esm/vs/editor/editor.api',避免模糊写成'monaco-editor' - 将缓存目录移至项目内,防止 CI 或重装
node_modules后丢失:cacheDir: './node_modules/.vite-cache' - 不建议日常启用
force: true,仅在验证预构建行为或 CI 构建时临时开启
合理 exclude 不是“删代码”,而是让 Vite 把力气花在刀刃上——只转真正需要转的,其余交给浏览器直连。操作简单,但判断要准。


















