Vitest 5 正式发布实测:Node 22 起步、expect 内联、poll 超时会挂,3.8 亿月下载量的测试框架本周换代

数据采集日期:2026-09-06|实测环境:Windows 11 / Node.js v22.14.0 / npm 11.12.1 / Vitest 5.0.0

JavaScript 周收官这篇,聊本周生态里最硬的一件事:Vitest 5.0.0 在 9 月 3 日正式发布(npm 发布时间 2026-09-03T12:24:30Z,GitHub Release 同日 12:19:51Z)。距离 4.0.0(2025-10-22)差不多十一个月,一次攒足了破坏性变更的大版本。

我在本地 Node 22 环境装了一份真跑了一遍,顺带把本周 GitHub 新星和包注册表的数据榜一起盘了。

一、本周 JS 生态新发现

1. Vitest 5.0.0:性能主题的大版本,破坏性变更清单很长

官方 Release Notes 开宗明义:"This release focuses on performance and brings a lot of new features while fixing long-standing bugs."

对现有项目影响最大的几条破坏性变更(摘自官方 v5.0.0 Release Notes):

变更 影响
Require Node.js 22 and Vite 6.4 Node 18/20 直接出局,CI 镜像得先升级
Inline expect package @vitest/expect 独立包没了,直接内联进主包
Replace loupe.inspect with pretty-format 快照/断言失败时的序列化输出格式会变,存量 inline snapshot 可能要重录
expect.poll 超时改为直接 fail 以前超时静默通过的行为没了,靠这个"特性"写的水测试会当场爆红
Remove sequential 选项,改用 concurrent 配置迁移
attachmentsDir 默认路径改为 .vitest/attachments/ .vitest-attachements/(对,官方原来就拼错了)废弃
hoistable 方法(vi.mock 等)必须在顶层作用域 写在函数体里的 vi.mock 会直接抛错

还有个细节挺有意思:Release Notes 的 contributor 署名里赫然出现了 Claude Opus 5 (1M context)OpenAI Codex------AI 以贡献者身份参与主流开源项目的 release credit,这在两年前还不可想象。

仓库现状(api.github.com 当日实查):17,059 stars / 1,963 forks / 385 open issues

2. drizzle-orm 1.0 进入 rc 阶段

TypeScript ORM 里势头最猛的 drizzle-orm,stable 线还是 0.45.2,但 1.0.0-rc.4 已在 6 月底放出(当日 GitHub Releases 实查),rc.1 起引入了 JIT mappers 和新 casing API 两个大动作。0.x 版本号跑了这么多年,1.0 落地会是下半年 TS 数据层的一件大事。

3. 本周 GitHub 新面孔(近 7 天创建,按 star 排序)

api.github.com search API 实查(created:>2026-08-30, sort=stars):

  • lnkiai/m3e-canvas(TypeScript,4,128 stars,9/2 创建)------在浏览器里画 Material 3 Expressive 设计稿,再一键转成 vibe-coding prompt。设计工具 + AI 编码上下文的缝合怪,四天冲上四千星。
  • ashemag/human-atlas(TypeScript,1,001 stars,9/5 创建)------开源 3D 人体解剖浏览器,2,234 个 BodyParts3D 网格、系统分层、爆炸视图。昨天刚建仓就破千星。
  • shadcn-ui/cn(TypeScript,1,193 stars,8/31 创建)------shadcn 官方出手做的 Tailwind 类名合并引擎,要替代 clsx + tailwind-merge(本周三那篇已实测过,8~11 倍于旧组合)。

一个观察:本周新星的头部项目全部是 TypeScript,且一半跟 AI 工作流(vibe-coding prompt、agent skill)沾边。JS 生态的增量重心已经彻底倒向 TS + AI 工具链。

二、动手实测:Vitest 5.0.0 在 Node 22 上真跑一遍

环境:Windows 11,Node.js v22.14.0(刚好踩线满足 v5 的 Node 22 要求),npm 11.12.1。

bash 复制代码
mkdir vitest5_lab && cd vitest5_lab
npm init -y
npm install vitest@5.0.0
# added 37 packages in 9s

依赖树只有 37 个包,安装 9 秒,这个体量对一个大版本来说相当克制。

被测模块(math.js):

javascript 复制代码
// Node.js v22.14.0 / ESM
export function fib(n) {
  if (n < 2) return n;
  return fib(n - 1) + fib(n - 2);
}

export async function fetchUser(id) {
  await new Promise((r) => setTimeout(r, 10));
  return { id, name: `user-${id}` };
}

测试文件(math.test.js)特意覆盖了几个 v5 变更点------expect.poll 新语义、pretty-format 快照、test.for 存在性:

javascript 复制代码
// Vitest 5.0.0
import { describe, it, expect, vi } from 'vitest';
import { fib, fetchUser } from './math.js';

describe('fetchUser (async)', () => {
  it('expect.poll retries until truthy (v5: fails on timeout now)', async () => {
    let ready = false;
    setTimeout(() => { ready = true; }, 30);
    await expect.poll(() => ready, { timeout: 1000 }).toBe(true);
  });
});

describe('v5 surface checks', () => {
  it('snapshot serialization via pretty-format', () => {
    expect({ a: 1, b: [2, 3] }).toMatchInlineSnapshot(`
      {
        "a": 1,
        "b": [
          2,
          3,
        ],
      }
    `);
  });

  it('test.for exists', () => {
    expect(typeof it.for).toBe('function');
  });
});

npx vitest run --reporter=verbose 真实输出(未修饰):

复制代码
 RUN  v5.0.0 C:/Users/.../vitest5_lab

 ✓ math.test.js > fib (sync) > computes base cases 2ms
 ✓ math.test.js > fib (sync) > computes fib(20) 1ms
 ✓ math.test.js > fetchUser (async) > resolves user object 24ms
 ✓ math.test.js > fetchUser (async) > expect.poll retries until truthy 68ms
 ✓ math.test.js > v5 surface checks > snapshot serialization via pretty-format 9ms
 ✓ math.test.js > v5 surface checks > vi.fn mock works 1ms
 ✓ math.test.js > v5 surface checks > test.for title $ variable 0ms

 Test Files  1 passed (1)
      Tests  7 passed (7)
   Duration  329ms (tests 63%, transform 20%, import 11%, worker 6%)

7/7 通过,全程 329ms。两点体感:

  1. 冷启动很快。Duration 分解里 tests 占 63%、transform 20%、import 11%------v5 宣传的性能优化在小项目上就能看出底子,worker 开销只占 6%。
  2. pretty-format 的 inline snapshot 是双引号 JSON 风格 ,和旧版 loupe.inspect 的输出(单引号、不同缩进)肉眼可辨地不一样。存量项目升 v5 后,第一次跑测试大概率会看到一批 snapshot 不匹配------不是你的数据变了,是序列化器换了。官方给的解法是 vitest --update 重录,但重录前最好人工扫一眼 diff,防止把真 bug 一起"录"进去。

升级建议就一句话:先升 Node 22,再升 Vitest 5,snapshot 重录前先 review diff

三、生态数据榜(当日 API 实查)

npm 月下载量(api.npmjs.org,2026-07-31 ~ 2026-08-29):

月下载量 备注
typescript 1,046,800,600 10 亿俱乐部唯一成员
vite 691,897,347 v8.2.2(latest),8.3.0-beta.0 已开
eslint 645,416,586 v10.10.0
vitest 381,320,980 是 jest 的 2 倍
jest 189,874,950 ---
mocha 58,064,892 ---

测试框架赛道,vitest 对 jest 的下载量优势已经拉到 2:1,v5 发布只会加固这个格局。

主流包 latest 版本速览(registry.npmjs.org dist-tags 当日实查):

latest 在途版本
typescript 7.0.2 7.1.0-dev.20260906.1(今天的 nightly)
react 19.2.8 19.3.0-canary
next 16.3.4 ---
vite 8.2.2 8.3.0-beta.0
vitest 5.0.0 ---
zod 4.5.4 ---
nuxt 4.5.2 ---
hono 4.13.7 ---
drizzle-orm 0.45.2 1.0.0-rc.4
oxlint 1.81.0 ---
bun 1.4.2 ---

回顾这个 JS 周(8/31~9/6)出过的五篇:TypeScript 7 原生编译器接管 npm 主线 + Bun 1.4 换 Rust 运行时(周一)、TS7 迁移实测撞硬错误(周二)、shadcn 官方 cn 库实测快 8~11 倍(周三)、oxlint 的 .gitignore 静默跳过陷阱(周四)、零依赖 TS 终端 UI 库(周五)。串起来看,本周 JS 生态的主旋律非常清晰:工具链底层集体换血------编译器换原生(TS7)、运行时换 Rust(Bun 1.4)、类名合并换引擎(cn)、lint 换 Rust(oxlint)、测试框架大版本换代(Vitest 5)。JS 写的工具正在被系统语言重写一遍,而生态位一个没丢,反而都更快了。

四、一句话总结

Vitest 5 用"Node 22 起步 + expect 内联 + poll 超时即挂"三板斧完成换代,3.8 亿月下载量对 jest 的 2:1 碾压说明社区早已用脚投票------升级窗口就在眼下,先把 CI 的 Node 版本升了,其他的都是小钱。

相关推荐
雪芽蓝域zzs2 小时前
Vue3 defineProps` / `defineEmits` 是编译器宏,不需要手动 import 导入
前端·javascript·vue.js
whyweplay2 小时前
Elpis:从Json Schema 到 页面
前端·javascript
大牧师2 小时前
Nest.js 微服务入门教程
开发语言·javascript·后端·微服务·node.js·nest.js·nest
低代码布道师3 小时前
外包项目管理平台全栈实战课02搭建数据底座:Next.js + PostgreSQL + Prisma 7
开发语言·javascript·postgresql·全栈开发
志尊宝3 小时前
Vue3 零基础每日笔记(004):模板语法初识——插值表达式、v-bind、v-on 一次学会
javascript·vue.js·笔记
JeffongTan12 小时前
在LWC中镶嵌VF Page获取用户IP
前端·javascript·salesforce
不cong明的亚子14 小时前
web live多屏互动平台
javascript·经验分享·音视频
dsyyyyy110116 小时前
JS复习,难点,易错点总结
开发语言·javascript·ecmascript