Node.js 26 发布:Temporal API 与运行时现代化

Node.js 26 的发布标志着该平台在现代化其核心 API 和引擎方面迈出了重要一步。虽然版本升级带来了常规的性能改进和依赖更新,但最引人注目的新增功能是默认启用了 Temporal API,解决了 JavaScript 生态系统中长期存在的一个痛点:日期和时间处理。

作为“Current”版本的标准做法,Node.js 26 将在未来六个月内作为前沿版本,然后在 10 月进入长期支持(LTS)阶段。对于开发者而言,这次发布与其说是关于单一的“杀手级功能”,不如说是清理历史包袱并集成现代 TC39 提案的累积效应。

Temporal API 的到来

Node.js 26 中最受期待的变化是现在默认启用的 Temporal API。多年来,JavaScript 开发者一直依赖过时的 Date 对象,该对象因其混乱的 API 和对时区及日历系统的支持不足而广受批评。为了填补这一空白,社区一直严重依赖 Moment.js、Luxon 和 date-fns 等第三方库。

有了 Temporal,Node.js 直接在运行时中提供了一个强大且功能丰富的替代方案。正如 Hacker News 社区成员所指出的,这是向平台原生日期/时间处理迈出的受欢迎的一步:

"Moment 和 Luxon 相当不错,但合理的日期/时间处理理应直接内置在平台中。"

V8 14.6 与新语言特性

Node.js 26 将 V8 JavaScript 引擎更新至版本 14.6.20.33。这次更新不仅仅是为了提升原始速度;它还为运行时带来了几个值得注意的 TC39 提案:

Map Upsert

[Weak]Map.prototype.getOrInsert()getOrInsertComputed() 方法引入了一种更高效的处理缓存类模式的方法。有趣的是,一些开发者注意到这里对 "upsert" 的定义在语义上发生了变化。虽然传统上被视为 "Update or Insert"(更新或插入),但 V8 的实现侧重于 "Get or Insert"(获取或插入)。

Iterator Sequencing

新增的 Iterator.concat() 允许更轻松地对迭代器进行排序,从而简化了开发者处理数据流和复杂迭代逻辑的方式。

现代化平台:移除与弃用

Node.js 26 继续了激进的“SEMVER-MAJOR”变更的趋势,以移除过时代码并减轻核心团队的维护负担。关键的移除项包括:

  • http.Server.prototype.writeHeader():现已完全移除。开发者必须迁移到 writeHead()
  • 遗留的 Stream 模块:内部的 _stream_wrap_stream_readable_stream_writable_stream_duplex_stream_transform_stream_passthrough 模块已被清除。
  • TypeScript Transforms--experimental-transform-types 标志已被移除,这标志着运行时处理类型转换的方式发生了转变。
  • Corepack:Corepack 的文档已被移除,且用户注意到它不再随 Node.js 26 一起发布,这可能会影响那些将其作为安装 pnpm 的主要方法的用户。

其他值得注意的更新

  • Undici 8:默认 HTTP 客户端已更新至版本 8.0.2,继续提高网络请求的性能和可靠性。
  • 构建要求:最低 GCC 要求已提升至 13.2,并且不再支持 Python 3.9。
  • Crypto 增强:该版本包含了对 crypto 模块的多次更新,包括对 KeyObject API 的原始密钥格式支持以及非对称密钥导入的统一。

社区观点

虽然该版本发布后普遍受到好评,但社区仍在继续推动那些他们认为核心库中缺失的功能。一些开发者对内置的 SQLite 模块仍带有实验性标签表示失望,而另一些人则感叹缺乏原生的 WebSocket 服务器实现,以简化部署并提高安全性。

对于想要升级的用户,建议审计您对遗留的 httpstream 方法的使用情况,以避免破坏性变更。一旦完成向 Temporal 的迁移,对重型日期处理库的需求可能会最终开始减少。

Sources