精准配置optimizeDeps.include和exclude可提升Vite首屏加载速度:include显式声明首屏强依赖(如'lodash-es/debounce'、'monaco-editor/esm/vs/editor/editor.api'),exclude排除已原生ESM且轻量的包(如vue、dayjs),并启用缓存加固与预加载闭环。

在大型项目中,Vite 的首屏加载慢往往不是因为启动慢,而是浏览器首次请求关键模块时触发了大量串行预构建——尤其是遇到 TailwindCSS、Monaco Editor、ECharts 等重型依赖或深度导入(如 lodash-es/debounce)时。优化核心不是“禁用预构建”,而是让预构建更精准、更前置、更可控。
显式声明高频/首屏依赖到 include 列表
Vite 默认只对实际被 import 的包做预构建,但大型项目中常存在“间接依赖”或“条件加载路径”,导致首次访问页面时才触发构建。主动把首屏强依赖的包列进 optimizeDeps.include,可提前完成转换并缓存:
-
覆盖典型场景:Vue 生态(
vue、vue-router、pinia)、工具库(dayjs、axios)、UI 框架入口(element-plus或naive-ui的 esm 主入口) -
处理深度导入:如用到
lodash-es/debounce,直接写'lodash-es/debounce'而非仅'lodash-es',避免运行时逐个解析子模块 -
大体积专有模块单独声明:例如
'monaco-editor/esm/vs/editor/editor.api',比笼统写'monaco-editor'更高效,跳过大量未用代码
安全排除已原生 ESM 且轻量的包
对已明确支持 ESM、体积小(通常 <5KB)、无副作用的包执行 exclude,能减少预构建工作量,加快开发服务器冷启动,也避免因重复转换引发兼容问题:
-
典型可排除项:
vue、vue-router@4+、pinia、dayjs、mitt、nanoid——确认其package.json含"type": "module"或合规"exports" -
CDN 引入的库必须排除:如已在
index.html中通过<script src="https://cdn.jsdelivr.net/npm/jspdf@2.5.1/dist/jspdf.umd.min.js"></script>加载,则务必加exclude: ['jspdf'],否则 Vite 会尝试二次打包 -
警惕混用陷阱:若项目中同时用了
lodash(CJS)和lodash-es(ESM),不可 excludelodash;只对确认全量使用 ESM 版本的包操作
启用预构建压缩与缓存稳定性加固
预构建产物本身体积过大或缓存失效频繁,也会拖慢首次加载。两项关键配置能立竿见影:
立即学习“Java免费学习笔记(深入)”;
-
开启预构建阶段压缩:在
optimizeDeps.esbuildOptions中设minify: true,减小内存占用和传输体积(注意:仅影响预构建产物,不影响源码 HMR) -
固定缓存目录位置:设
cacheDir: './node_modules/.vite-cache',避免 CI 环境或重装node_modules后缓存丢失,强制全量重建 -
避免误触 force 重建:
optimizeDeps.force仅在调试预构建行为或 CI 构建流水线中临时启用,日常开发保持默认即可
配合插件实现首屏资源预加载闭环
预构建只是第一步,真正提升首屏体验还需让浏览器“提前知道要什么”。借助插件将预构建结果与运行时加载策略打通:
-
用
vite-plugin-preload自动注入<link rel="preload">:针对include列表中的包,在生成的 HTML 中自动添加预加载标签,确保主入口 JS 加载前,首屏依赖已开始下载 -
搭配
vite-plugin-pwa缓存预构建产物:将/node_modules/.vite/下的依赖 chunk 注册为 Workbox 静态资源,下次访问可离线复用 -
对 CSS-in-JS 或按需主题包做预连接:在
index.html中手动加<link rel="preconnect" href="https://fonts.googleapis.com">或<link rel="dns-prefetch" href="https://cdn.example.com">,减少跨域请求延迟


















