vite 首次加载慢主因是依赖预构建未覆盖关键模块,需手动在 optimizedeps.include 中明确添加 lodash-es、@element-plus/icons-vue 等高频依赖,并排除类型包,启动时通过控制台和 network 验证生效。

Vite 的首次加载慢,多数时候不是 Vite 本身慢,而是依赖预构建没覆盖到关键模块,导致浏览器在请求时被迫同步编译,卡在那一秒甚至几十秒。TypeScript 项目尤其明显——类型检查本身不拖慢加载,但若依赖(比如 lodash-es、@element-plus/icons-vue、axios)没被提前预构建,TS 源码一跑,这些依赖就跟着动态加载、逐个转 ESM,瀑布式请求瞬间压垮浏览器。
关键不在“写 TS”,而在“让 Vite 知道哪些依赖必须提前打包”。
明确 include 需预构建的依赖
Vite 默认只处理 vue、vue-router 等少数核心库。你项目里真正高频、多入口、或含大量子模块的依赖,得手动加进 optimizeDeps.include:
-
lodash-es:600+ 个文件,不预构建=600+ 并发请求 -
@ant-design/icons-vue或@element-plus/icons-vue:图标组件按需导入,但未预构建时每个<icon></icon>都触发新请求 -
axios:虽小,但常被封装层多层引用,动态导入路径易逃过自动扫描 -
date-fns、zod、valibot等函数式工具库:ESM 格式但模块粒度细,同样面临请求爆炸
配置示例(vite.config.ts):
export default defineConfig({
optimizeDeps: {
include: [
'lodash-es',
'@element-plus/icons-vue',
'axios',
'date-fns',
'zod'
],
exclude: ['your-local-utils'], // 本地包无需预构建
}
})
处理动态导入和插件间接依赖
import() 引入的模块(如路由懒加载、条件加载的 UI 组件)不会被 Vite 自动扫描到。如果你用 defineAsyncComponent 加载某个图标组件,而该组件内部又用了 @iconify/vue,那这个库很可能漏掉。
解决办法有两个:
- 把这类库直接加进
include列表(最稳) - 或配合
entries显式声明入口,让 Vite 提前分析:optimizeDeps: { include: ['@iconify/vue'], entries: ['./src/main.ts', './src/router/index.ts'] }
避免把 TypeScript 类型包塞进 include
@types/*、typescript、@typescript-eslint/* 这些纯类型定义,不参与运行时加载,放进 include 不仅无效,还可能延长预构建时间。它们影响的是编辑器提示和 tsc 检查,跟页面加载无关。
启动时验证是否生效
改完配置后,启动 vite dev,留意控制台输出:
- ✅ 正确:看到类似
Pre-bundling dependencies: lodash-es, @element-plus/icons-vue... - ❌ 异常:仍提示
... needs to be pre-bundled或首次访问某页面时卡住几秒 → 说明还有遗漏依赖
打开浏览器 DevTools → Network 标签页,过滤 .js,观察首次加载是否只有几个大文件(如 _deps/lodash-es.js),而不是上百个 /node_modules/xxx/xxx.js。
不复杂但容易忽略。











