预构建卡在“Pre-bundling dependencies”阶段通常是Vite依赖预构建因类型冲突、CJS/ESM混用、tsconfig配置过宽、动态require或VSCode插件干扰导致的死循环;应先删.vite/deps并--force重试,再逐项排查optimizeDeps、tsconfig.include/types、exclude列表及IDE扩展。

预构建卡在 “Pre-bundling dependencies” 阶段怎么办
这不是网络慢或磁盘满的问题,而是 Vite 的依赖预构建(optimizeDeps)在解析某些包时陷入死循环或类型冲突。常见现象是终端停在 Pre-bundling dependencies... 一行不动,CPU 占用飙升,.vite/deps 目录下只生成了部分文件甚至为空。
直接操作建议:
- 先删掉
.vite/deps目录(不是node_modules),再运行vite --force - 检查
package.json中是否存在混用 CJS/ESM 的“灰色地带”包,比如lodash(CJS)和lodash-es(ESM)同时存在 - 临时禁用预构建:在
vite.config.ts中加optimizeDeps: { disabled: true },验证是否真由它引起 - 若仅开发时卡,而
vite build正常,大概率是某 devDependency 的类型声明(如@types/node)被错误地参与了预构建
为什么改了 tsconfig.json 后 vite 预构建反而更慢
因为 TypeScript 编译配置会间接影响 Vite 的依赖分析逻辑。Vite 在预构建阶段会读取 tsconfig.json 中的 compilerOptions.types 和 include,如果里面包含大量非源码路径(比如 "./src/**/*" + "./types/**/*" + "./tests/**/*"),Vite 会尝试为所有匹配路径下的 import 语句做模块图推导,极易触发冗余扫描。
关键调整点:
立即学习“前端免费学习笔记(深入)”;
-
tsconfig.json的include应严格限定为["src/**/*.ts", "src/**/*.d.ts"],不要写["**/*.ts"] - 移除
compilerOptions.types中与运行时无关的类型包(如"jest"、"cypress"),它们不该出现在开发服务器启动链路里 - 确认没有在
compilerOptions.paths中配置指向node_modules子目录的别名,这会让 Vite 尝试解析本不该碰的第三方内部路径
第三方包含动态 require() 或 __dirname 导致预构建失败
Vite 预构建默认以 ESM 模式处理依赖,遇到 CommonJS 特有语法(尤其是未被 define 或 resolve.alias 拦截的 require('./xxx'))会直接报错或卡住。典型包包括 electron、sqlite3、某些老版本 axios 插件,以及带条件导出(conditional exports)但没适配 ESM 的库。
应对方式:
- 在
vite.config.ts的optimizeDeps.exclude中显式列出问题包名,例如:exclude: ['electron', 'sqlite3'] - 对必须用到的 CJS 包,配合
rollupOptions.external声明为外部依赖,避免被卷入构建流程 - 检查该包是否有 ESM 兼容版本(如
axios推荐用axios@1.7+,而非axios@0.x) - 不要试图用
alias把 CJS 路径映射成 ESM 文件——Vite 不会重写require调用,只会让路径解析失败
VSCode 插件干扰导致预构建响应延迟
某些 VSCode 扩展(特别是 TypeScript 类型检查类)会在保存时触发 tsc --noEmit --watch,与 Vite 的依赖图重建竞争文件句柄和内存资源。现象是:单独运行 vite dev 很快,但在 VSCode 里启动就卡 20 秒以上,且 process.memoryUsage().heapUsed 显示内存持续增长后停滞。
快速验证和解决:
- 关闭所有非必要扩展,只留
Volar和ESLint,再试启动 - 在 VSCode 设置中禁用
typescript.preferences.includePackageJsonAutoImports,这个选项会让 TS 服务主动扫描package.json依赖,与 Vite 冲突 - 检查
.vscode/settings.json是否启用了"typescript.preferences.importModuleSpecifier": "relative"—— 这个设置在大型 monorepo 中极易引发 TS 服务卡死,间接拖慢 Vite - 如果项目根目录有
jsconfig.json,确保它没启用"checkJs": true,否则 JS 文件也会被 TS 服务深度扫描
预构建卡死往往不是单点故障,而是多个配置层叠作用的结果。最有效的排查顺序是:先清缓存跑 --force,再逐个关闭可疑配置项,而不是一上来就改 Webpack 式的复杂插件链。真正卡住的地方,通常藏在你认为“无关紧要”的那一行 paths 或 types 里。


















