
2026Vitest 升级 PNPM 10 兼容避坑手册——5步修复【免费下载链接】vitestNext generation testing framework powered by Vite.项目地址: https://gitcode.com/GitHub_Trending/vi/vitest你刚把 pnpm 升到 10Vitest 测试套件连跑起来这一步都没到pnpm install直接报ERR_PNPM_LOCKFILE_BREAKING_CHANGEesbuild 的 postinstall 被拦fake-timers 相关用例集体挂掉。改 3 处配置全在pnpm-workspace.yaml 按顺序跑 5 条命令PNPM 10 兼容问题收尾。证据全部来自本仓库的真实配置可直接照抄。 快速自检30秒确认你是否中招在仓库根目录跑下面 3 条命令命中 2 条以上就在本文范围内。head -1 pnpm-lock.yaml # 命中lockfileVersion: 9.0 grep packageManager package.json # 命中pnpm10.x 或 11.x ls patches/ | grep -c patch # 命中4再补两条人工判断lockfile 已是 9.0 协议本地 pnpm 还是 9.x —— 验证pnpm --version与锁文件首行对不上workspace 配置声明了trustPolicy、allowBuilds这类 pnpm 10 字段 —— 验证grep -c trustPolicy\|allowBuilds pnpm-workspace.yaml本仓库输出 3patches/有 4 个精确版本补丁注册表指向它们 —— 验证grep -A8 ^patchedDependencies pnpm-workspace.yaml本仓库 4 条全中pnpm-lock.yaml首行lockfileVersion: 9.0pnpm-workspace.yaml 声明 4 个patchedDependencies和 9 个allowBuilds。你的项目只要是 monorepo workspaces patches 结构就在同一条故障线上。 底层原因拆解3个机制不是5个现象升 PNPM 10 后表面有 5 类报错锁文件、依赖解析、补丁、脚本环境、并行资源。根因只有 3 个机制。修机制现象一起消失。机制一lockfile 协议升级与 trustPolicy 信任校验现象pnpm 9.x 对着 9.0 锁文件跑报ERR_PNPM_LOCKFILE_BREAKING_CHANGE升到 pnpm 10 后每次 install 又比之前慢 15-20s。根因pnpm 10 把默认 lockfile 换成 9.0并默认开启trustPolicy: no-downgrade供应链校验每次安装都核对提交的锁文件。ci.yml 里的注释直接写明了这个开销~15-20s on every job。修复把 pnpm 对齐到package.json的packageManager字段CI 里再用环境变量PNPM_CONFIG_TRUST_LOCKFILE: true跳过逐 job 校验lint job 保留一次完整校验兜底锁文件没被篡改。下面两条命令检出仓库锁定的 pnpm 版本是读取 9.0 锁文件的前提。corepack enable corepack prepare pnpm11.24.0 --activate.npmrc里的provenancetrue是同一层的供应链校验开关装好 pnpm 后默认生效不用额外处理。机制二workspace 映射与 allowBuilds 白名单声明现象pnpm install输出Ignored build scripts: esbuild, swc/core, sharp, ...测试运行时报esbuild: failed to start service。根因pnpm 10 把配置入口收拢到pnpm-workspace.yaml同时第三方包构建脚本默认改为禁止执行白名单从onlyBuiltDependencies改名allowBuilds写在旧位置.npmrc不再生效。修复本仓库在 pnpm-workspace.yaml 里声明了 6 条 workspace 映射docs、packages/*、examples/*、test/*等和 9 个构建包白名单你的项目照抄对应清单即可。这段配置的作用是放行 esbuild、sharp 的 postinstall保证原生二进制能装好。allowBuilds: esbuild: true swc/core: true sharp: true机制三patchedDependencies 补丁与版本绑定现象依赖升版本后pnpm install报补丁冲突或者补丁静默不生效vi.useFakeTimers()相关用例全挂。根因注册表 key、补丁文件名、实际解析版本三处必须严格对齐任何一处漂移补丁就失效。本仓库 4 个补丁全是精确版本sinonjs__fake-timers15.4.0、acorn8.11.3、cac6.7.14、rrweb-snapshot2.1.1。以 patches/ 里的 fake-timers 补丁为例它把包内require(timers)替换为 vitest 注入的__vitest_required__fake timer 才能在 node 环境下接管全局计时器。补丁丢了这条链路直接断。修复版本跳变后按新版本重新生成补丁文件名同步改名注册表 key 同步更新。这两条命令重新生成补丁文件文件名仍遵循包名版本.patch约定。pnpm patch sinonjs/fake-timers15.4.0 pnpm patch-commit 临时目录 # 编辑完临时目录后执行 PNPM 10 兼容完整修复走一遍Step 1 → Step 5下面是完整操作时间线从 Step 1 抄到 Step 5 即完成不用回头翻前文。Step 1检出 pnpm 版本corepack不可省略老 pnpm 读不了 9.0 锁文件后面所有报错都从这一步错开始。corepack enable corepack prepare pnpm11.24.0 --activateStep 2重装并核对锁文件不可省略只有干净安装一次才能确认注册表、补丁、白名单全部生效。pnpm install head -1 pnpm-lock.yaml # 期望 lockfileVersion: 9.0Step 3声明构建脚本白名单不可省略漏掉它esbuild 静默丢失 postinstall安装阶段不报错跑测试时才暴露。allowBuilds: esbuild: true swc/core: true sharp: true追加到 pnpm-workspace.yaml。Step 4核对 patchedDependencies 三处对齐不可省略文件名、注册表 key、解析版本缺任何一处补丁就静默失效。grep -A8 ^patchedDependencies pnpm-workspace.yaml ls patches/Step 5CI 关闭逐 job 信任校验不可省略每个 job 省 15-20【免费下载链接】vitestNext generation testing framework powered by Vite.项目地址: https://gitcode.com/GitHub_Trending/vi/vitest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考