数据采集日期: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。两点体感:
- 冷启动很快。Duration 分解里 tests 占 63%、transform 20%、import 11%------v5 宣传的性能优化在小项目上就能看出底子,worker 开销只占 6%。
- 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 版本升了,其他的都是小钱。