Node.js 26.3.0 发布:Current 版本线持续演进,这些能力值得上手

2026-06-01 21 预计阅读时间:1 分钟
来源:nodejs.org AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:7 分钟

Node.js 26 进入 Current 版本线后,社区关注度一直不低。26.3.0 作为最新的小版本更新,除了常规的依赖升级和缺陷修复,也意味着 26 系列的各项实验性功能正在逐步站稳脚跟。如果你还在 22 或 24 上观望,现在是认真评估迁移时机的好节点。

TypeScript 类型剥离:从实验到可用

Node.js 26 系列最受瞩目的能力之一是 --experimental-strip-types。它的原理很简单:运行时不做类型检查,只把 TypeScript 的类型注解"剥掉",然后当作 JavaScript 执行。这意味着你不再需要 ts-nodetsx 或预编译步骤就能直接跑 .ts 文件。

26.3.0 中该功能继续积累稳定性改进。实际体验下来,对于脚本工具、内部 CLI、一次性数据处理这类场景,它已经够用。

# 确认你的 Node 版本
node -v
# v26.3.0

# 直接运行 TypeScript 文件
node --experimental-strip-types ./scripts/migrate-db.ts

一个最小可运行示例——假设你有一个读取环境变量并打印的小脚本:

// config-check.ts
interface DbConfig {
  host: string;
  port: number;
  database: string;
}

function loadConfig(): DbConfig {
  return {
    host: process.env.DB_HOST ?? "localhost",
    port: Number(process.env.DB_PORT ?? 5432),
    database: process.env.DB_NAME ?? "app_dev",
  };
}

const config = loadConfig();
console.log(JSON.stringify(config, null, 2));
# 无需 tsc 编译,直接执行
node --experimental-strip-types config-check.ts

需要注意的边界:类型剥离不处理 enumnamespaceparameter properties 等需要运行时转换的语法。如果你的代码大量依赖这些特性,还是得走编译路径。但对于类型注解为主的现代 TS 代码,这条路已经通畅。

require(esm):同步加载 ESM 模块不再是禁区

长久以来,CJS 和 ESM 的互操作是 Node.js 生态的痛点之一。require() 加载 ESM 模块在 22 中以实验姿态引入,26 系列中该能力持续打磨。26.3.0 依然通过 --experimental-require-module 标志开放。

实际意义:你可以在老项目的 CJS 入口文件里直接 require() 一个 ESM 包,不用为了一个新依赖把整个项目改造成 ESM。

// legacy-app/index.cjs
const { format } = require("new-esm-lib/index.mjs");

console.log(format("hello from CJS"));
node --experimental-require-module legacy-app/index.cjs

限制依然存在:被 require() 的 ESM 模块不能包含顶层 await,也不能是异步的 ESM 边界。遇到这些情况,运行时会抛出明确的错误,不会静默失败。

V8 引擎与底层性能

26.3.0 搭载的 V8 版本随小版本更新同步推进。对开发者来说,最直接的感受来自几处:

  • 正则表达式优化:V8 对部分正则模式的匹配路径做了 JIT 改进,大文本场景下能观察到毫秒级差异。
  • structuredClone 性能:深拷贝大对象时比手动 JSON 序列化快一个数量级,且支持更多类型(如 MapSetArrayBuffer)。
  • Web API 兼容度fetchWebSocketReadableStream 等 Web 标准 API 在 26 中已不再标记实验,可以直接用于生产。

一个 structuredClone 的实用对比:

// deep-copy-demo.mjs
const bigData = {
  users: Array.from({ length: 100_000 }, (_, i) => ({
    id: i,
    name: `user_${i}`,
    tags: new Set(["active", "verified"]),
  })),
  mapping: new Map([[1, "admin"], [2, "editor"]]),
};

// 方式一:structuredClone(支持 Map/Set)
const cloned = structuredClone(bigData);
console.log(cloned.mapping instanceof Map); // true

// 方式二:JSON 序列化(丢失 Map/Set)
const jsonCopy = JSON.parse(JSON.stringify(bigData));
console.log(jsonCopy.mapping); // {} — Map 信息丢失

实用清单:升级前该确认什么

26.3.0 本身是增量更新,但如果你打算从 22 或 24 跳到 26 Current,以下检查点值得过一遍:

检查项 说明
实验性标志 --experimental-strip-types--experimental-require-module 等标志在 26 中仍带 experimental 前缀,生产环境使用需评估风险容忍度
依赖兼容性 部分 npm 包的 CJS/ESM 双发行在 26 下行为可能不同,跑一遍 npm install && npm test
node:sqlite 26 中 node:sqlite 仍为实验模块,API 可能变动,不建议核心路径依赖
--experimental-network-imports 远程 ESM import 功能仍在实验阶段,安全与缓存策略未定
LTS 时间线 26 将在 2025 年 10 月进入 Active LTS,届时实验性功能会进一步收敛

快速验证脚本,确认你的项目在 26.3.0 下是否正常:

# 切换到项目目录后执行
nvm install 26.3.0
nvm use 26.3.0
npm ci && npm test

# 如果有 TypeScript 脚本,试一下类型剥离
node --experimental-strip-types ./src/main.ts

写在最后

26.3.0 没有炸裂式的新功能,但它代表的是一条趋势线:TypeScript 直接运行、CJS/ESM 互操作、Web 标准 API 稳定化——这些能力从实验走向可用,才是 Current 版本线真正的价值。如果你有内部工具或新项目在规划,不妨在 26.3.0 上做一轮小规模验证,等 10 月 LTS 发布时就能平滑切换。


相关推荐