vite预构建优化核心是精准轻量地标准化依赖格式以支撑esm按需加载,而非替代它;应exclude已兼容esm的库(如vue、dayjs),include复杂esm包(如echarts),并配合动态导入实现真正按需。

在 Vite 构建中实现按需加载的预构建优化,核心不是“让所有依赖都按需”,而是**让预构建本身更精准、更轻量,从而支撑真正的按需加载行为**。Vite 的按需加载天然基于浏览器 ESM,而预构建(optimizeDeps)是为它扫清障碍——把不兼容的模块提前转成 ESM,同时跳过那些根本不需要转的模块。
明确预构建的目标:服务按需加载,而非替代它
Vite 开发时本就不打包整个应用,而是浏览器直接请求源码 + 依赖路径,由服务器动态编译返回。预构建只处理 node_modules 中的“非原生 ESM”依赖,比如 CommonJS 格式的 lodash 或 UMD 的 moment。它不改变业务代码的按需逻辑,但能让这些第三方模块被浏览器像原生 ESM 一样顺利 import() 加载。
- 预构建不是“提前打包业务代码”,而是“提前标准化依赖格式”
- 按需加载(如路由
import('./Page.vue'))由 Vite 的开发服务器原生支持,无需额外配置 - 真正影响按需效果的是:预构建是否快(启动快)、是否准(不误伤或遗漏)
用 exclude 跳过已兼容 ESM 的依赖,减少冗余转换
很多现代库已是纯 ESM,体积小、无副作用,浏览器可直接加载。把它们放进预构建,只会拖慢启动、增加缓存体积,还可能因 esbuild 转换引入意外行为。
- 典型可排除项:
vue、vue-router@4+、pinia、dayjs、axios、nanoid、mitt - 验证方法:进入
node_modules/xxx/package.json,确认含"type": "module"或合规"exports"字段 - 配置示例:
optimizeDeps: { exclude: ['vue', 'dayjs', 'axios'] } - ⚠️ 切勿排除
lodash(CJS)或moment(UMD),应改用lodash-es后再评估
用 include 确保关键依赖被预构建,避免运行时卡顿
某些大而复杂、解析耗时的包(如 echarts、monaco-editor/esm),即使声明了 ESM,也可能因内部嵌套多、导出逻辑重导致首次 import() 时编译延迟。显式 include 可强制其进入预构建流程,转化为更扁平、更易解析的 ESM 形式。
- 推荐写法:
include: ['echarts', 'monaco-editor/esm/vs/editor/editor.api'](精确到子路径,避免整包误包) - 不建议写
'monaco-editor'—— 它包含大量未用资源,会显著拉长预构建时间 - 配合
esbuildOptions.minify: true(仅限预构建阶段),进一步压缩输出体积
结合手动分包与动态导入,让按需加载真正落地
预构建优化解决的是“依赖怎么加载”,而业务层的按需加载靠的是代码组织方式。二者协同才能见效:
- 路由级拆分:
{ path: '/report', component: () => import('@/views/Report.vue') }→ Vite 自动生成Report.xxxx.js - 组件级懒加载:
const Editor = defineAsyncComponent(() => import('@/components/Editor.vue')) - 工具函数抽离:
src/utils/request.ts单独打包,提升复用和缓存命中率 - 避免全量引入:用
date-fns/startOfToday替代date-fns,减少 chunk 体积
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











