v22→v26 新特性总览
本教程共 76 篇 · 第 75 篇 · 更新于 2026-07-25 · 约 7 分钟阅读
75. v22→v26 新特性总览
本节目标:Node.js 从 v22 到 v26 这几年最值得关注的变化。有些是 syntax sugar,有些是能改变你工作流的特性。读完这一章,你会对「现在的 Node.js 能干什么」有一个更新的认知。
原生运行 TypeScript(自 v22.18 起)
这可能是近几年 Node.js 最大的用户体验升级。
以前写 TypeScript,你得装 typescript、配 tsconfig.json、跑 tsc 编译,或者折腾 ts-node、tsx 这些 runner。现在,如果你的 TypeScript 代码只用到「可擦除语法」(类型注解、接口、import type 等),直接就能跑:
node server.ts
Node.js 内部会走一个叫 type stripping 的流程:把类型标注抹掉,剩下的纯 JavaScript 直接执行。底层用的是 Amaro loader,不需要 tsconfig.json。
// server.ts —— 直接 node server.ts 就能跑
import { createServer } from 'node:http';
interface User {
name: string;
age: number;
}
const greet = (user: User): string => {
return `Hello, ${user.name}`;
};
createServer((req, res) => {
res.end(greet({ name: 'Node.js', age: 15 }));
}).listen(3000);
但有几个限制:
enum、参数属性、namespace 这些需要代码生成的高级语法不支持,因为它们不能简单「抹掉」。- Node.js 只管执行,不帮你做类型检查。开发时还是建议配一个
tsc --noEmit做检查。 - 自 v22.18.0+ 默认开启,v24 LTS 已稳定。v22.18 之前的版本需要加
--experimental-strip-types。
Tip原生 TS 最适合中小型脚本和快速原型。大型项目仍然建议完整配置 TypeScript 编译流程,因为你可能需要装饰器、自定义 transform 等高级特性。
权限模型(自 v20 实验,v24 稳定)
Node.js 以前被诟病的一点:一旦运行一个脚本,它就能读你硬盘上的任何文件、发任何网络请求。浏览器有同源策略和沙箱,Node.js 却像脱缰的野马。
从 v20 开始实验、v24 正式稳定的 Permission Model,给了你一个白名单机制:
# 只允许读取 /data 目录下的文件
node --permission --allow-fs-read=/data app.js
# 只允许访问特定域名
node --permission --allow-fs-read=* --allow-fs-write=/tmp --allow-child-process app.js
常见权限 flag:
| Flag | 作用 |
|---|---|
--allow-fs-read=路径 | 允许文件读取 |
--allow-fs-write=路径 | 允许文件写入 |
--allow-child-process | 允许创建子进程 |
--allow-worker-threads | 允许 worker_threads |
--allow-wasi | 允许 WASI |
代码里也能动态检查:
import { permission } from 'node:process';
if (permission.has('fs.read', '/etc/passwd')) {
// 有权限才读
}
这对运行第三方脚本或者 CI 环境特别有用。你可以限制一个工具只能读写它的工作目录,防止恶意或 buggy 的依赖把你系统搞乱。
Warning权限模型目前不能限制网络请求(不能用
--allow-net这种 flag)。如果你需要沙箱网络,还得配合 Docker 或者防火墙。
内置 SQLite(自 v22 实验,v24 稳定)
以前要在 Node.js 里用 SQLite,得装 better-sqlite3 或 sqlite3 这些原生模块,安装时经常因为编译环境缺失而报错。
从 v22 开始,Node.js 内置了 node:sqlite 模块:
import { DatabaseSync } from 'node:sqlite';
const db = new DatabaseSync(':memory:');
db.exec(`
CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT)
`);
const insert = db.prepare('INSERT INTO users (name) VALUES (?)');
insert.run('Alice');
insert.run('Bob');
const query = db.prepare('SELECT * FROM users');
console.log(query.all());
API 设计接近 better-sqlite3 的同步风格,简单直接。对于中小型应用、测试环境、本地缓存,内置 SQLite 完全够用了。
node —run:替代 npx 跑脚本(自 v22)
package.json 里的 scripts 你肯定写过:
{
"scripts": {
"dev": "node --watch server.js",
"test": "node --test"
}
}
以前跑这些脚本要用 npm run dev 或者 npx。npm 本身有几百毫秒的启动开销,因为它要先解析整个包树。
现在可以直接:
node --run dev
node --run test
node --run 会读取 package.json 里的 scripts 并执行,跳过 npm 的解析过程,启动更快。自 v22 起可用,v24 已稳定。
Note
node --run目前不支持pre/post生命周期钩子。如果你的脚本依赖pretest自动执行,还是得用npm run。
内置 fetch 与 WebSocket 客户端
Node.js v18 引入了全局 fetch,v24 已经完全稳定。这是基于 undici 的实现,和浏览器的 fetch API 对齐:
const res = await fetch('https://api.example.com/data');
const data = await res.json();
同样稳定的还有 WebSocket 客户端(node:websocket 模块)。以前要写 WebSocket 客户端得装 ws 包,现在内置了标准 API。
Tip内置 fetch 的默认 keep-alive 和超时行为与浏览器略有不同。生产环境里发大量请求,还是建议细读 undici 的文档,或者直接用
undici包获取更细粒度的控制。
内置 Test Runner(自 v18 实验,v20+ 成熟)
测试不再需要非得装 Jest 或 Mocha。Node.js 内置了 node:test 和 node:assert:
import { describe, it } from 'node:test';
import assert from 'node:assert';
describe('math', () => {
it('should add', () => {
assert.strictEqual(1 + 1, 2);
});
});
运行:
node --test
自 v20 起已经很成熟,支持 mock、并发执行、覆盖率报告。对于不想引入额外依赖的项目,内置 test runner 是个轻量选择。
发布节奏变更:v27 起年度制
Node.js 传统上每 6 个月发一个大版本(4 月/10 月),奇数版本 6 个月后 EOL,偶数版本进入 LTS。这个节奏从 v27 开始改为年度制:
- 每年一个大版本
- 6 个月 Current(外加 6 个月 Alpha)
- 之后全部进入 LTS
对用户的影响:
- 版本号涨得慢了,不用频繁面对 breaking changes
- 但每个版本的 LTS 支持期可能缩短,升级窗口要盯紧
- 生产环境继续跟 LTS 走,别追 Current
其他值得留意的变化
util.styleText(v22+):给终端输出上色,替代手拼 ANSI 转义码。ArrayBuffer传输优化:v24 起structuredClone和 worker 之间传递大 Buffer 更快。- Maglev 编译器:V8 的新中层编译器,在 v24 中默认启用,启动速度和内存占用都有改善。
navigator.userAgent:v21+ 可用,方便写同构代码时判断运行环境。
版本选择建议(2026 年)
| 场景 | 推荐版本 | 理由 |
|---|---|---|
| 新项目/生产环境 | v24 LTS | 稳定、长期支持、特性齐全 |
| 想尝鲜原生 TS、新 V8 | v26 Current | 最新特性,但可能有生态兼容问题 |
| 遗留项目维护 | v22 Maintenance | 仅安全更新,计划迁到 v24 |
| 还在用 v20 或更低 | 立刻升级 | v20 已 EOL,不再有安全补丁 |
Node.js 这些年的进化方向很明确:减少外部依赖(内置 SQLite、fetch、test runner)、提升安全(权限模型)、拥抱 TypeScript(原生运行)。下一个大版本还会带来什么,值得保持关注。