vitest多实例下断点跳过是因为默认并行执行启动多个子进程,而vscode调试器仅附加主进程;必须加--no-file-parallelism强制单进程串行执行,否则断点无效。

为什么Vitest多实例下断点总跳过
Vitest默认启用pool: 'threads'或pool: 'forks'时,每个测试文件会启动独立子进程,而VSCode调试器默认只attach主进程,子进程的断点自然不生效。这不是断点设错了,是调试器压根没看到那些进程。
必须加--no-file-parallelism才能让断点停住
这是最直接有效的开关,强制所有测试串行执行在单个进程中,避免调试器“顾此失彼”:
-
vitest --no-file-parallelism --test-timeout=0:终端手动验证是否能断在it()内部 - 若用
JavaScript Debug Terminal(终端右上角下拉选择),命令必须带这个参数,否则右键“Debug Test”可能静默忽略 - 别指望
launch.json里只配"args": ["run"]就完事——漏掉--no-file-parallelism,断点照样跳过
launch.json里autoAttachChildProcesses不是万能的
虽然配置"autoAttachChildProcesses": true理论上支持子进程,但Vitest的worker/fork机制与Node原生child_process.fork行为不完全一致,实测中仍常失效:
- 优先走
--no-file-parallelism路径,而非依赖自动附加 - 若必须并行(比如大型测试集),改用
pool: 'forks'+singleFork: true,让所有测试复用一个fork进程 -
"program": "${workspaceRoot}/node_modules/vitest/vitest.mjs"路径必须存在,用.cjs或.js后缀会报错找不到入口
Vue/React项目额外卡点:插件没注册,连解析都失败
哪怕--no-file-parallelism开了,如果测试文件里有defineComponent或JSX,而vitest.config.ts没显式引入@vitejs/plugin-vue或@vitejs/plugin-react,Vitest直接抛ReferenceError,根本跑不到断点位置:
- Vue项目必须写
import { defineConfig } from 'vitest/config'; import vue from '@vitejs/plugin-vue'; export default defineConfig({ plugins: [vue()] }) - React同理,
import react from '@vitejs/plugin-react';不能省 - Vite alias若指向未编译源码(如
src/),会导致source map断裂,断点映射到错误行号
真正卡住人的从来不是“怎么加断点”,而是“为什么断点设了却像没设一样”。多实例下,--no-file-parallelism是绕不开的第一步,其他所有配置都得在这个前提下验证。











