Skip to content

Vitest 5.0 正式发布:性能优先,Node.js 22 起步 ​

译注:本文编译自 Vitest 官方发布的 v5.0.0 Release Notes,原文链接见文末。该版本聚焦性能改进,同时引入多项新特性并修复了长期存在的缺陷。官方同步发布了公告博客,建议结合阅读。

Vitest 5 已正式发布。这是一个以性能为核心的大版本,在带来大量新功能的同时,也清理了多项历史遗留问题。由于包含较多破坏性变更,升级前需仔细评估。

破坏性变更:环境与配置全面收紧 ​

本次升级最直接的门槛是运行环境要求:必须使用 Node.js 22 与 Vite 6.4。此外,配置解析逻辑被重构,配置解析与服务器创建过程分离,内联项目默认继承根配置,并支持嵌套项目。

若干长期存在的默认行为被调整:

  • 每个测试前默认清空 mock(clearMocks),此前需手动开启;
  • toHaveTextContent 改为严格匹配,新增 toMatchTextContent 作为宽松替代;
  • expect.poll 在函数未按时返回结果时直接判定失败,而非静默等待;
  • 异步断言未被 await 时测试将失败,避免漏测;
  • 不再从祖先目录查找配置文件。

包结构也有调整:expect 与 @vitest/runner 被内联,后者不再单独发布;webdriverio 包被移除;多个废弃入口点被删除。loupe.inspect 被 pretty-format 取代。

新特性:报告、覆盖率与浏览器测试 ​

报告体系引入 createReport API 与 .vitest 报告目录约定,默认报告器可通过 configDefaults.reporters 访问,并支持非分片多环境运行的报告合并。HTML 报告器默认输出改为 .vitest,且支持单文件输出。

覆盖率方面,V8 现在可追踪 node:child_process 与 node:worker_threads 上下文,thresholds.perFile 支持传入对象,thresholds.autoUpdate 可接收上一轮阈值作为参数,并迁移至 @vitest/istanbuljs 系列包。

浏览器测试获得多项增强:支持 DOM 快照 trace 视图、在 locator 元素报错时展示 aria 树、page.mark 支持自定义 kind、context.mark 用于自定义命令追踪,以及 watch UI 中的 trace 实时更新。UI 侧新增编辑器源码位置高亮、键盘导航 trace 步骤、trace 选择状态持久化到 URL 等能力。

其他值得关注的特性包括:vi.when() 的创建、TypeScript 构建模式支持、可切换的 injectCjsGlobals 选项、fsModuleCache 提升为顶层选项、--repeats CLI 选项、-p 作为 --project 简写,以及 vm 池中支持 require(esm)。

缺陷修复与稳定性 ​

本次修复覆盖范围较广,重点集中在并发与进程管理:

  • 修复 sequence.concurrent: true 与顶层 test(..., { concurrent: false }) 的冲突,并废弃 sequential API 与选项;
  • 修复 worker 崩溃导致测试挂起、worker 意外退出时的错误提示、vm 池对 cgroupsv2 内存限制的遵循;
  • 修复 watch 模式下并发重启的竞态、类型检查进程崩溃时误报成功、--typecheck 的假成功问题;
  • 修复浏览器模式下 disableConsoleIntercept 未生效、iframe 通信握手超时、浏览器无响应时挂起等问题;
  • 修复 vi.mock() 提升、doMock() 队列顺序、importOriginal 与优化器配合等 mock 相关问题。

此外,benchmark 公共 API 被重写,并新增可插拔的 benchmark provider API。

升级建议 ​

Vitest 5 的破坏性变更数量较多,建议按以下顺序推进:先将 Node.js 升级至 22、Vite 升级至 6.4;再检查配置文件中是否依赖旧的配置查找路径、sequential 选项与废弃入口点;最后关注 mock 清理默认值与异步断言的新行为,这两项可能让原本通过的测试暴露真实问题。

原文链接 ​