webstorm边栏运行vitest需严丝合缝三处:node≥20.0.0且手动指定真实可执行路径、vitest.mjs入口用文件选择器精准定位、vitest.config.ts置于根目录并手动指定路径,缺一不可。

WebStorm 里点一下边栏图标就跑 Vitest,不是靠“自动识别”,而是三处路径和版本必须严丝合缝:Node ≥20.0.0、vitest.mjs 真实路径、vitest.config.ts 在根目录且被手动指定。
Node 解释器必须手动指向 v20+ 可执行文件
WebStorm Settings → Languages & Frameworks → JavaScript → Node.js 里显示的“Project”别名,90% 是假的。终端里 node -v 输出 v20.12.0,但 IDE 实际运行时仍用系统默认 v18,就会直接报 ERR_UNSUPPORTED_ESM_URL_SCHEME。
- 别信自动检测:点开文件选择器,精准选中
/path/to/node-v20.12.0/bin/node(macOS/Linux)或C:\Program Files\nodejs\node.exe(Windows) - 若用
nvm或nvm-windows,切完版本后必须重启 WebStorm,否则 IDE 缓存旧路径 - 在 WebStorm 内置终端执行
which node和node -v,结果必须与设置页里选中的路径一致
vitest.mjs 入口路径不能手输,得用文件选择器逐层定位
pnpm monorepo 下,vitest 很可能不在 node_modules/vitest,而在 node_modules/.pnpm/vitest@4.0.7_... 子目录里。WebStorm 手输路径或依赖自动发现,基本找不到,直接报 Cannot find module 'vitest'。
- 进 Run → Edit Configurations → Vitest → 找到
Vitest package字段,点击右侧文件选择按钮 - 逐层打开
node_modules,找到真实的vitest.mjs(Vitest 4+ 推荐 ESM 入口,比bin/vitest.js更稳) - 顺手检查项目
package.json:确保仍有"type": "module"和完整"exports"字段,删了会导致 WebStorm 解析不到正确入口
vitest.config.ts 必须置于根目录并在运行配置中手动指定路径
WebStorm 不像命令行那样自动向上查找配置。它默认只认项目根目录下的 vitest.config.js 或 vitest.config.ts;如果放错位置(比如在 tests/ 子目录下),或用了非标准名(如 vitest.conf.mjs),就会退回到内置默认行为:不加载 environment、不识别 setupFiles、甚至忽略 include 规则——结果就是 DOM API 报错、mock 不生效、测试文件根本不出现在运行列表里。
- 创建运行配置时,在 Run → Edit Configurations → Vitest 页面,务必填上
Config file字段,指向你的真实配置路径 - 如果配置是
vitest.config.ts,确保项目已装ts-node或 WebStorm 的 TypeScript 服务已启用(否则解析失败无提示) - 配置中
environment: "jsdom"和globals: true必须显式声明,否则边栏图标不会注入运行能力
边栏绿色三角点不了?先绕过 --testNamePattern 参数 bug
WebStorm 2025.2+ 自动生成的运行命令,会把 --testNamePattern 拼成 --testNamePattern = "^test name$"(等号后多空格),而 Vitest 只认 --testNamePattern="^test name$"。现象是控制台输出带前导空格和问号的乱码字符串,测试静默跳过或全量执行。
- 临时解法:不点边栏图标,右键测试文件 → 选 Run "
xxx.test.ts",走文件级运行,完全绕过参数拼接 - 长期解法:进 Vitest 运行配置 →
Vitest options栏填入--testNamePattern="^your test name$",并勾选Use --testNamePattern - 验证是否修好:点开配置里的
Modify options→ 看最终命令行,确认--testNamePattern=后面是紧贴双引号的,中间没空格
最易被忽略的是:调试必须用测试旁专用 Debug 图标,而不是普通 Node.js Debug 按钮——后者跳过 environment 初始化,断点不命中、defineComponent 未定义、mock 失效,全是这个原因。











