首页 / Node.js 教程 / v22→v26 新特性总览

Node.js 教程

v22→v26 新特性总览

本教程共 76 篇 · 第 75 篇 · 更新于 2026-07-25 · 约 7 分钟阅读

Node.js新特性v24v26LTS

75. v22→v26 新特性总览

本节目标:Node.js 从 v22 到 v26 这几年最值得关注的变化。有些是 syntax sugar,有些是能改变你工作流的特性。读完这一章,你会对「现在的 Node.js 能干什么」有一个更新的认知。

原生运行 TypeScript(自 v22.18 起)

这可能是近几年 Node.js 最大的用户体验升级。

以前写 TypeScript,你得装 typescript、配 tsconfig.json、跑 tsc 编译,或者折腾 ts-nodetsx 这些 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-sqlite3sqlite3 这些原生模块,安装时经常因为编译环境缺失而报错。

从 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 或者 npxnpm 本身有几百毫秒的启动开销,因为它要先解析整个包树。

现在可以直接:

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:testnode: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、新 V8v26 Current最新特性,但可能有生态兼容问题
遗留项目维护v22 Maintenance仅安全更新,计划迁到 v24
还在用 v20 或更低立刻升级v20 已 EOL,不再有安全补丁

Node.js 这些年的进化方向很明确:减少外部依赖(内置 SQLite、fetch、test runner)、提升安全(权限模型)、拥抱 TypeScript(原生运行)。下一个大版本还会带来什么,值得保持关注。