当前位置:首页 > 技术分析 > 正文内容

node.js v24.0.0 正式发布!10大重磅更新助力开发者,性能大幅提升


近日,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 老手还是新手,这些变化都值得你重点关注。

一、核心引擎升级:V8 13.6 带来新特性

Node.js v24.0.0 最引人注目的变化之一是将 V8 JavaScript 引擎升级到了 13.6 版本。这一升级由 Micha"el Zasso 在 PR #58070 中完成,带来了多项 JavaScript 新特性:

1. Float16Array 支持

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 ]

2. 显式资源管理

通过新的 usingawait using 语法,开发者可以更好地管理需要显式释放的资源:

{
  using file = openFile("example.txt");
// 使用文件...
} // 文件在这里自动关闭

asyncfunctionexample() {
awaitusing connection = awaitdbConnect();
// 使用数据库连接...
} // 连接自动关闭

3. RegExp.escape 方法

新增的 RegExp.escape 方法可以转义字符串中的特殊字符,使其在正则表达式中按字面值匹配:

const userInput = "Hello*World?";
const escapedInput = RegExp.escape(userInput);
const regex = new RegExp(escapedInput);
console.log(regex.test("Hello*World?")); // true

4. WebAssembly Memory64

WebAssembly 现在支持 64 位内存,使其能够处理更大的数据集:

const memory = new WebAssembly.Memory({ initial: 1, maximum: 10, index64: true });

5. Error.isError

新增的 Error.isError 方法可以检查一个值是否为 Error 或其子类的实例:

const err = new TypeError("Type error");
console.log(Error.isError(err)); // true
console.log(Error.isError("not an error")); // false

二、npm 11:包管理器全面升级

Node.js v24.0.0 集成了最新的 npm 11 版本,由 npm 团队在 PR #56274 中贡献。这一版本带来了多项重要改进:

  1. 1. 性能提升:安装和更新包的速度明显加快
  2. 2. 改进的安全特性:更好的依赖审计和漏洞检测
  3. 3. 更好的兼容性:与现代 JavaScript 包更好地兼容
  4. 4. 工作空间改进:更强大的 monorepo 管理能力
  5. 5. 命令行体验优化:更友好的错误信息和命令行界面

三、AsyncLocalStorage 默认使用 AsyncContextFrame

在 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 成为全局对象

URLPattern API 现在被暴露为全局对象,由 Jonas Badalic 在 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.js

六、测试运行器增强

Node.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', () => {
    // 测试内容
  });
});

七、Undici 7 更新

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 客户端功能更加强大和高效。

八、SQLite 模块增强

Node.js v24.0.0 继续改进内置的 SQLite 模块,增加了多项新功能:

  1. 1. 位置方法:添加了 location() 方法
  2. 2. 事务检测:添加了检测事务的 getter
  3. 3. 超时选项:为 DatabaseSync 添加了超时选项
  4. 4. 数组返回设置:添加 setReturnArrays 方法到 StatementSync
  5. 5. 聚合函数支持:添加了聚合函数
const { 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. 1. 运行时弃用 url.parse():应使用 WHATWG URL API 代替
// 弃用
const url = require('url').parse('https://example.com/path');

// 推荐
const url = new URL('https://example.com/path');
  1. 2. 移除已弃用的 tls.createSecurePair
// 不再可用
const pair = tls.createSecurePair();

// 应使用 tls.TLSSocket 代替
const socket = new tls.TLSSocket(rawSocket);
  1. 3. 运行时弃用 SlowBuffer
// 弃用
const buf = new SlowBuffer(10);

// 推荐
const buf = Buffer.allocUnsafeSlow(10);
  1. 4. 运行时弃用不使用 new 实例化 REPL
// 弃用
const repl = require('repl').start();

// 推荐
const repl = new (require('repl').REPLServer)();
  1. 5. 弃用不使用 new 的 Zlib 类
// 弃用
const gzip = require('zlib').createGzip();

// 推荐
const gzip = new (require('zlib').Gzip)();
  1. 6. 弃用在 child_process 中向 spawn 和 execFile 传递 args
// 弃用
child_process.spawn('node', ['--version'], { args: ['--check'] });

// 推荐
child_process.spawn('node', ['--version', '--check']);

十、Windows 平台变更

从 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 还包含一系列其他值得注意的更新:

  1. 1. stream 模块改进:捕获并转发来自 dest.write 的错误,以及更好地处理 Duplex.from() 中的生成器销毁
  2. 2. fs 模块优化:改进了 globSync 性能,修复了多个 bug
  3. 3. crypto 模块增强:修复了跨域 ArrayBuffer 验证等问题
  4. 4. worker 模块:添加了 worker.getHeapStatistics() 方法
  5. 5. util 模块:添加了 types.isFloat16Array() 方法,修复了对象格式化问题
  6. 6. http2 模块:添加了原始头数组支持到 h2Session.request() 方法
  7. 7. repl 模块:增加了对多行历史记录的支持

性能优化亮点

Node.js v24.0.0 在性能方面进行了多项优化:

  1. 1. buffer 模块性能提升:改进了 byteLength 性能
  2. 2. url 模块优化:提升了 canParse() 方法对非单字节字符串的性能
  3. 3. module 模块改进:提升了 getPackageType 性能
  4. 4. AsyncLocalStorage 优化:通过新的 AsyncContextFrame 实现提供更好的性能
  5. 5. V8 引擎优化:V8 13.6 带来了多项性能改

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/4436.html

分享给朋友:

“node.js v24.0.0 正式发布!10大重磅更新助力开发者,性能大幅提升” 的相关文章

「云原生」Containerd ctr,crictl 和 nerdctl 命令介绍与实战操作

一、概述作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockershim。在V1.24起的版本的kubelet就彻底移除了dockershim,改为默认使用Conta...

HTML5+眼球追踪?黑科技颠覆传统手机体验

今天,iH5工具推出一个新的神秘功能——眼动追踪,可以通过摄像头捕捉观众眼球活动!为了给大家具体演示该功能的使用,我做了一个案例,供大家参考。实际效果如下:案例比较简单,就是通过眼动功能获取视觉焦点位置,剔除用户看中的牌。现在,舞台的属性中多了一个“启用眼动”的选项,另外,还多了一个“启用摄像头”的...

vue 开发规范

项目运行指南(#项目运行指南)开发本地环境(#开发本地环境)开发相关插件/工具(#开发相关插件工具)开发规范(#开发规范)vue(#vue)【数据流向】(#数据流向)【慎用全局注册】(#慎用全局注册)【组件名称】(#组件名称)【组件中的 CSS】(#组件中的-css)【统一标签顺序】(#统一标签顺序...

快来看看重构了 365 天的 vue3.5 这次到底更新了啥

新人求关注?,点击右上角 ↗? 关注,博主日更,全年无休,您的关注是我的最大的更新的动力~ 感谢大家了 就在 9 月 1 号,迭代了一年多的 Vue 3.5 终于发布了,这次发布的代号是 "天元突破 红莲螺岩"。这是一个机器人动画片的名字,相信喜欢看动漫的小伙伴应该很熟悉从更新的 C...

什么是异步,什么是同步,啥意思?

概述:本文讨论了程序设计领域的同步、异步和多线程的一些基本概念。同步异步这两个词翻译的其实不通。我是不知道这两个词是啥意思。同步:步伐整齐;异步:步伐不整齐。大概这个意思,但是在编程设计领域啥意思?国人的烦恼多来自于不明确的翻译所造成的后果。异步对应的英文是Asynchronous。这个词的含义是“...

面试题:同步和异步的区别

作者:雅克的一府来源:http://www.52rd.com/Blog/Detail_RD.Blog_imjacob_4832.html答案一:1.异步传输 通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步。所谓异步...