Vite 构建失败 esbuild 冲突 3 条路修好
【免费下载链接】viteNext generation frontend tooling. It's fast!项目地址: https://gitcode.com/GitHub_Trending/vi/vite
npm 装依赖报 ERESOLVE,或 vite build 直接说 esbuild 模块找不到?Vite 构建失败大多卡在版本区间对不上,跑完下面自检选一条路,命令直接复制。
🧭 先对号入座:你是不是这几个报错之一
报错基本就三类,先对一下原文,对上了后面少走弯路:
- npm 装依赖时直接拒绝:
npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! peer esbuild@"^0.27.0 || ^0.28.0" from vite@8.2.2触发条件:手动往 devDependencies 里加过 esbuild,或刚升过 Vite 主包之后重装依赖时出现。
- 构建时找不到原生二进制:
Error: Cannot find module '@esbuild/linux-x64' Require stack: node_modules/esbuild/lib/main.js触发条件:锁文件命中旧缓存,或 CI 干净环境里 esbuild 的 postinstall 脚本没跑完,JS 包和原生二进制版本对不上。
- 提示需要单独安装 esbuild:
Failed to load `transformWithEsbuild`. It is deprecated and it now requires esbuild to be installed separately.触发条件:较新版本 Vite 里 esbuild 是可选 peer 依赖,项目依赖树里根本没装 esbuild 包。
对上了就往下看,对不上先跑一遍自检。
🔍 跑一遍自检,确认卡在哪
先别慌,在项目根目录跑完三条命令,就能分清问题出在版本区间、安装缺失还是二进制残缺:
node -p "require('vite/package.json').peerDependencies.esbuild" npm ls vite esbuild node -e "console.log(require('esbuild').version)"- 第一条打印 Vite 声明的 esbuild 兼容区间:正常输出
"^0.27.0 || ^0.28.0"这样的区间字符串;异常输出 undefined,说明你这个 Vite 版本把 esbuild 写在 dependencies 里,改看dependencies.esbuild字段。 - 第二条看实际装了什么:正常是 vite 和 esbuild 各一行且都带版本号;异常是 esbuild 那行显示 empty 或 missing,大概率是它——包压根没装上。
- 第三条验证 esbuild 自身能否加载:正常输出一个和第一条区间匹配的版本号;异常直接抛 Cannot find module,说明装的是残缺包,删掉 node_modules 重装都救不回来,得换版本。
按结果分流:第二条报 missing、或版本落在第一条区间外,走「我用 npm」;你用 pnpm 且锁文件钉死旧版,走「我用 pnpm」;Vite 主包暂时动不了,走「主包暂时不能升」。
版本错配的后果不只是报错,esbuild 版本回退还会把冷启动时间拖慢,修完可以拿这张曲线对比一下前后差异。
🛠 按你的场景选一条路
三条路互斥,挑你命中的那条走,别混用,混用只会把依赖树搅得更乱。
我用 npm,peer 依赖冲突装不上
根因:esbuild 实际版本落在 vite peer 区间外。
第一行先打印当前 vite 到底要哪个区间,第二行装区间内的版本,示例按 Vite 8 写,其他版本以打印结果为准:
node -p "require('vite/package.json').peerDependencies.esbuild" npm install -D esbuild@^0.27.0验证:再跑npm ls esbuild,输出落在区间内,然后npm run build能走完即修好。
我用 pnpm,overrides 钉死了旧 esbuild
根因:lockfile 或 overrides 把 esbuild 钉在旧大版本。
在根 package.json 里加 overrides,强制整棵依赖树的 esbuild 统一到一个大版本,别指望pnpm update能穿透嵌套依赖:
{ "pnpm": { "overrides": { "esbuild": "^0.27.0" } } }加完重跑pnpm install,用pnpm why esbuild确认整棵树只剩一个版本,构建命令照常执行即可验证。
Vite 主包暂时不能升,只补 esbuild
根因:esbuild 没装,或版本对不上旧 vite 的声明。
旧版本 Vite 把 esbuild 写在 dependencies 里,第一行打印它声明的区间,第二行照着装,示例的 0.24.0 是官方 changelog 里当年回归发生时钉的版本,以第一行打印结果为准:
node -p "JSON.stringify(require('vite/package.json').dependencies.esbuild)" npm install -D esbuild@0.24.0验证:npm run build完整跑完且 dist 目录正常生成产物,说明版本已经对齐。
为什么偏偏卡在这两个版本之间
前面三路都是换版本,这里说清楚版本为什么这么敏感,花两分钟看懂,以后升级不用再踩同一个坑。
Vite 较新版本把 esbuild 从直接依赖降成了可选 peer 依赖,每个大版本只声明兼容一个窄区间,区间之外装什么都算冲突,而 esbuild 走 0.x 语义化版本,次版本号本身就代表破坏性变更,JS 包与 @esbuild/* 原生二进制必须严格同版本,差一位就是 Cannot find module 或 ERESOLVE。仓库当前声明可以直接查证:packages/vite/package.json 里 peerDependencies 写死了"esbuild": "^0.27.0 || ^0.28.0",devDependencies 里锁的是^0.28.2;CHANGELOG 里还留着 "pin to 0.24.0" 再 "unpin esbuild version" 的两条记录,就是当年 esbuild 0.24.1 回归现场的原始出处。
修完顺手把这仨坑堵上
一次修好容易,下个月升级再翻车才是常态,把下面三个口子顺手堵上:
- 把 esbuild 写进版本锁定字段:pnpm 用
pnpm.overrides,npm 用 package.json 的overrides,一行配置锁住整棵树,例如"pnpm": { "overrides": { "esbuild": "^0.27.0" } }。 - CI 一律按锁文件安装,和开发环境用同一条命令口径:pnpm 跑
pnpm install --frozen-lockfile,npm 跑npm ci,保证生产依赖树和本地逐字一致。 - 确认 esbuild 的安装脚本被允许执行:pnpm 10+ 要在 pnpm-workspace.yaml 的 allowBuilds 里写
esbuild: true,官方仓库就是这么配的,漏了这条二进制永远装不完整。
下次再撞见 ERESOLVE 或 esbuild 模块报错,先跑一遍自检再动手,两分钟就能定位。
【免费下载链接】viteNext generation frontend tooling. It's fast!项目地址: https://gitcode.com/GitHub_Trending/vi/vite
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考