Node.js 24 发布:内置测试运行器增强、JavaScript 引擎升级与全局 URLPattern API

21 阅读4分钟

最新发布的 Node.js 24 并非简单的增量更新,它带来了切实改进,直击开发痛点,并为服务端 JavaScript 开辟了新的可能性。本文将深入解析更新日志,聚焦那些真正值得关注的重要特性。

内置测试运行器增强

Node.js 24 的内置测试运行器现在能智能管理测试生命周期,不再需要为子测试显式添加 await 语句。这个看似微小的改进,解决了早期版本中测试套件容易出现的隐晦错误。

对比新旧测试模式:

import assert from "node:assert";
import { test } from "node:test";
import { setTimeout } from "node:timers/promises";

test("父测试", (t) => {
  t.test("第一个检查", async (t) => {
    await setTimeout(1000);
    assert.strictEqual(2 + 2, 4);
  });

  t.test("第二个检查", (t) => {
    assert.strictEqual(1 + 1, 2);
  });
});

在 Node.js 23 及更早版本中,上述代码会因"测试未在父测试结束前完成"而失败:

Node.js 23中子测试因缺少await而失败

开发者被迫为每个子测试添加显式 await

test("父测试", async (t) => {
  await t.test("第一个检查", async (t) => { ... });
  await t.test("第二个检查", (t) => { ... });
});

Node.js 24 现在能自动检测并等待子测试完成,使测试代码更简洁,减少竞态条件和时序错误的风险:

Node.js 24中子测试无需await即可通过

JavaScript 引擎升级

Node.js 24 搭载 V8 13.6 引擎,带来多项新特性:

正则表达式转义

新增原生方法 RegExp.escape() 可安全转义正则表达式中的特殊字符,避免动态插入用户输入时出现语法错误:

console.log(RegExp.escape(`转义符号如:.+*?()|[]{}^$`));
// 输出:\x45scaping\x20symbols\x20like\x3a\x20\.\+\*\?\(\)\|\[\]\{\}\^\$

增强的错误处理

传统错误检测方法如 instanceof 在不同执行环境(如 Node.js vm 上下文)中会失效。新增的 Error.isError() 方法能准确识别 Error 实例:

console.log(Error.isError(new Error())); // true
console.log(Error.isError(new TypeError())); // true
console.log(Error.isError({ name: "Error", message: "错误" })); // false

WebAssembly 内存扩展

支持 64 位内存寻址(Memory64),突破 32 位指针的 4GB 内存限制,最高可达 16GB。但性能会有 10%-100%+ 的下降,主要源于显式内存边界检查的开销。

紧凑浮点存储

新增 Float16Array 类型数组,为机器学习、图形处理和科学计算等场景提供内存高效的浮点存储方案。

URLPattern API 全局化

URLPattern 构造函数现在全局可用,无需显式导入:

const apiRoute = new URLPattern({ pathname: "/api/:resource/:id" });
const matches = apiRoute.test("https://example.com/api/users/123");

权限模型正式发布

Node.js 20 引入的实验性权限模型现已稳定,命令行标志从 --experimental-permission 简化为 --permission。该特性提供对文件系统、网络连接等敏感操作的细粒度控制:

脚本因缺少权限而失败

HTTP 与网络升级

内置 Undici 7 带来显著改进:

  • 更严格的 fetch() 规范合规
  • 预置拦截器包括重定向、重试、请求转储等
  • 基于 SQLite 的响应缓存,支持跨进程共享
  • 新的 WebSocketStream 实现
  • 替代 throwOnErrorresponseError 拦截器

异步上下文追踪优化

AsyncLocalStorage API 采用新的底层实现 AsyncContextFrame,为跨异步操作的上下文追踪(如请求跟踪)带来显著性能提升。如需回退旧实现,可使用 --no-async-context-frame 标志。

NPM 11 更新

捆绑的 npm 升级至 v11,主要改进:

  • 支持 Node ^20.17.0 || >=22.9.0
  • 安装性能优化
  • 增强的安全漏洞检测
  • 移除 npm hook 命令
  • npm init 新增类型提示

npm init新增类型提示

废弃与移除

逐步淘汰的旧 API:

  • 传统 URL 解析器(url.parse()
  • 已弃用的 TLS 方法如 tls.createSecurePair()
  • new 实例化的 REPLServerZlib
  • SlowBufferBuffer.allocUnsafeSlow() 替代

升级建议

Node.js 24 将在 2025 年 10 月进入 LTS 阶段,提供支持至 2028 年 4 月。推荐使用版本管理工具如 Mise 进行多版本管理:

mise use -g node@24

建议重点测试:

  1. 新语言特性应用场景
  2. 废弃 API 的替代方案
  3. 安全敏感应用的权限模型

完整变更请参阅 Node.js 24 官方发布说明。如需参与后续版本开发,可查看 GitHub 上的待解决问题贡献指南


原文地址blog.appsignal.com/2025/05/09/…
作者:Damilola Olatunji

如果您觉得内容对您有帮助,欢迎收藏、点赞、分享

欢迎关注公众号【前端小石匠】,一起学习,共同进步~