

近日,Node.js 官方团队正式发布了 Node.js v24.0.0 版本,这是一个具有里程碑意义的重大更新。作为 "Current" 版本,它将在未来六个月内引领 Node.js 的发展方向,并将于今年 10 月份进入长期支持(LTS)阶段。此次更新带来了诸多重要变化,包括 V8 JavaScript 引擎升级至 13.6 版本、npm 升级至 11 版本,以及多项性能优化和 API 改进。
本文将深入解析 Node.js v24.0.0 的重要更新内容,帮助开发者快速了解这些变化对项目开发的影响。无论你是 Node.js 老手还是新手,这些变化都值得你重点关注。
Node.js v24.0.0 最引人注目的变化之一是将 V8 JavaScript 引擎升级到了 13.6 版本。这一升级由 Michaël Zasso 在 PR #58070 中完成,带来了多项 JavaScript 新特性:
Float16Array 是一种新的类型化数组,用于处理半精度浮点数(16 位),可以在需要较低精度但高性能和内存效率的场景中使用,如:
// 创建一个包含3个元素的Float16Array
const float16 = new Float16Array(3);
float16[0] = 1.5;
float16[1] = 2.5;
float16[2] = 3.5;
console.log(float16); // Float16Array(3) [ 1.5, 2.5, 3.5 ]通过新的 using 和 await using 语法,开发者可以更好地管理需要显式释放的资源:
{
using file = openFile("example.txt");
// 使用文件...
} // 文件在这里自动关闭
asyncfunctionexample() {
awaitusing connection = awaitdbConnect();
// 使用数据库连接...
} // 连接自动关闭新增的 RegExp.escape 方法可以转义字符串中的特殊字符,使其在正则表达式中按字面值匹配:
const userInput = "Hello*World?";
const escapedInput = RegExp.escape(userInput);
const regex = new RegExp(escapedInput);
console.log(regex.test("Hello*World?")); // trueWebAssembly 现在支持 64 位内存,使其能够处理更大的数据集:
const memory = new WebAssembly.Memory({ initial: 1, maximum: 10, index64: true });新增的 Error.isError 方法可以检查一个值是否为 Error 或其子类的实例:
const err = new TypeError("Type error");
console.log(Error.isError(err)); // true
console.log(Error.isError("not an error")); // falseNode.js v24.0.0 集成了最新的 npm 11 版本,由 npm 团队在 PR #56274 中贡献。这一版本带来了多项重要改进:
在 Node.js v24.0.0 中,AsyncLocalStorage 现在默认使用 AsyncContextFrame 实现,由 Stephen Belanger 在 PR #55552 中提交。这一变化提供了更高效的异步上下文跟踪实现,改善了性能并使 API 在高级用例中更加健壮。
const { AsyncLocalStorage } = require('node:async_hooks');
// 创建一个 AsyncLocalStorage 实例
const storage = new AsyncLocalStorage();
// 现在默认使用 AsyncContextFrame 实现
storage.run({ user: 'john' }, () => {
// 获取存储的上下文
const context = storage.getStore();
console.log(context.user); // 输出 'john'
});此外,新版本还增加了两个选项:
// 设置默认值
const storage = new AsyncLocalStorage({ defaultValue: { user: 'guest' } });
// 设置名称,用于调试
const storage = new AsyncLocalStorage({ name: 'userContext' });URLPattern API 现在被暴露为全局对象,由 Jonas Badalič 在 PR #56950 中实现。这使开发者可以无需显式导入就能使用这个强大的 URL 模式匹配系统:
// 之前需要导入
// const { URLPattern } = require('node:url');
// 现在可以直接使用全局对象
const pattern = new URLPattern({ pathname: '/users/:id' });
const result = pattern.exec('https://example.com/users/123');
console.log(result.pathname.groups.id); // 输出 '123'这大大简化了 URL 路由匹配的编码工作,特别是在构建 Web 服务器时。
Node.js v24.0.0 中,实验性的权限模型得到了改进,标志从 --experimental-permission 简化为 --permission,这表明该功能正逐渐趋于稳定,可以更广泛地应用:
# 启动带有权限限制的 Node.js 程序
node --permission app.js权限模型允许开发者限制脚本的文件系统访问、网络操作和子进程创建等权限,提高应用程序安全性:
// 允许特定文件读取权限
node --permission --allow-fs-read=/tmp/myfile.txt app.js
// 允许特定网络访问
node --permission --allow-net=example.com app.jsNode.js v24.0.0 中的测试运行器模块现在会自动等待子测试完成,无需手动 await 测试 Promise,这使编写测试更加直观,减少了未处理 Promise 相关的常见错误:
// 之前需要手动 await
test('parent test', async (t) => {
await t.test('subtest 1', async () => {
// 测试内容
});
await t.test('subtest 2', async () => {
// 测试内容
});
});
// 现在无需手动 await
test('parent test', async (t) => {
t.test('subtest 1', async () => {
// 测试内容
});
t.test('subtest 2', async () => {
// 测试内容
});
// 父测试会自动等待所有子测试完成
});此外,测试运行器还添加了全局设置和拆卸功能:
describe('setup and teardown', () => {
setup(() => {
// 在所有测试前执行
console.log('Setting up test environment');
});
teardown(() => {
// 在所有测试后执行
console.log('Cleaning up test environment');
});
it('test one', () => {
// 测试内容
});
it('test two', () => {
// 测试内容
});
});Node.js v24.0.0 包含了 Undici 7,这为 HTTP 客户端能力带来了众多改进,包括更好的性能和对更新的 HTTP 功能的支持:
const { fetch } = require('undici');
async function fetchData() {
const response = await fetch('https://example.com/api');
const data = await response.json();
console.log(data);
}
fetchData();Undici 是 Node.js 中 fetch() API 的底层实现,这一升级使 Node.js 的 HTTP 客户端功能更加强大和高效。
Node.js v24.0.0 继续改进内置的 SQLite 模块,增加了多项新功能:
location() 方法setReturnArrays 方法到 StatementSyncconst { DatabaseSync } = require('node:sqlite');
// 创建数据库连接
const db = new DatabaseSync(':memory:', { timeout: 5000 });
// 检查是否在事务中
console.log(db.inTransaction); // false
// 开始事务
db.exec('BEGIN TRANSACTION');
console.log(db.inTransaction); // true
// 准备语句并设置返回数组
const stmt = db.prepare('SELECT * FROM users');
stmt.setReturnArrays(true);Node.js v24.0.0 中弃用或移除了多个 API,开发者需要注意更新代码:
1. 运行时弃用 url.parse():应使用 WHATWG URL API 代替
// 弃用
const url = require('url').parse('https://example.com/path');
// 推荐
const url = new URL('https://example.com/path');2. 移除已弃用的 tls.createSecurePair
// 不再可用
const pair = tls.createSecurePair();
// 应使用 tls.TLSSocket 代替
const socket = new tls.TLSSocket(rawSocket);3. 运行时弃用 SlowBuffer
// 弃用
const buf = new SlowBuffer(10);
// 推荐
const buf = Buffer.allocUnsafeSlow(10);4. 运行时弃用不使用 new 实例化 REPL
// 弃用
const repl = require('repl').start();
// 推荐
const repl = new (require('repl').REPLServer)();5. 弃用不使用 new 的 Zlib 类
// 弃用
const gzip = require('zlib').createGzip();
// 推荐
const gzip = new (require('zlib').Gzip)();6. 弃用在 child_process 中向 spawn 和 execFile 传递 args
// 弃用
child_process.spawn('node', ['--version'], { args: ['--check'] });
// 推荐
child_process.spawn('node', ['--version', '--check']);从 Node.js v24 开始,移除了对 MSVC 的支持,现在需要使用 ClangCL 在 Windows 上编译 Node.js:
# 使用 ClangCL 编译
set CC=clang-cl
set CXX=clang-cl
vcbuild.bat这一变更可能会影响在 Windows 上进行 Node.js 原生模块开发的开发者,需要相应地调整构建工具链。
除了上述主要变化外,Node.js v24.0.0 还包含一系列其他值得注意的更新:
Node.js v24.0.0 在性能方面进行了多项优化: