资讯 Node.js 24.20.0 LTS "Krypton" 发布:AsyncLocalStorage 作用域、权限模型增强、WASM JSPI 等新特性解读

2026-09-07 01:12:54

Node.js 24.20.0 LTS "Krypton" 发布:AsyncLocalStorage 作用域、权限模型增强、WASM JSPI 等新特性解读

Node.js 官方博客发布 24.20.0 LTS 版本,代号 "Krypton",由 Antoine du Hamel 发布。这是 Node.js 24.x LTS 线的重要版本更新,包含多项值得关注的新特性和改进:async_hooks 模块为 AsyncLocalStorage 添加 using 作用域支持、buffer 模块添加 end 参数、permission 权限模型添加 permission.drop 方法和 --permission-audit 标志、loader 模块实现 package maps、stream 模块添加 node:stream/iter 实现、test_runner 测试运行器添加 context.log() 和 test:log 事件、wasm 模块启用 JSPI(JavaScript Promise Integration)等。本文基于 Node.js 官方发布说明,系统解读这些新特性的技术细节、使用方法和实际价值。

背景:Node.js 24 LTS 线

Node.js 24 简介

Node.js 24 是 Node.js 的当前 LTS(长期支持)版本线:

  • 2025 年 10 月发布初始版本
  • 进入 LTS 维护阶段
  • 代号 "Krypton"
  • 获得长期安全和稳定性维护
  • 生产环境推荐使用
  • 持续接收新特性和改进

LTS 版本的特点

Node.js LTS 版本的特点:

  • 稳定性优先:重点关注稳定性和安全性
  • 长期维护:获得 30 个月的长期维护
  • 谨慎添加新特性:新特性经过充分测试后才添加
  • 向后兼容:保持 API 稳定性,避免破坏性变更
  • 生产就绪:适合生产环境使用
  • 企业友好:企业可以放心升级和使用

24.20.0 的定位

24.20.0 是 24.x LTS 线的第 20 个小版本:

  • 包含多项 SEMVER-MINOR 级别的新特性
  • 包含大量 bug 修复和改进
  • 更新根证书到 NSS 3.125
  • 添加新的协作者
  • 保持向后兼容
  • 推荐所有 24.x 用户升级

核心新特性详解

1. AsyncLocalStorage 的 using 作用域支持

特性概述

async_hooks 模块为 AsyncLocalStorage 添加了 using 作用域支持(SEMVER-MINOR),由 Stephen Belanger 贡献。这是 AsyncLocalStorage 的重要改进,使得异步上下文的管理更加简洁和安全。

什么是 AsyncLocalStorage

AsyncLocalStorage 是 Node.js 提供的异步本地存储机制:

  • 在异步操作链中传递数据
  • 类似于线程本地存储(Thread-Local Storage)
  • 每个异步上下文有独立的存储
  • 不会互相干扰
  • 常用于请求 ID、用户信息、日志上下文等

传统用法的问题

传统的 AsyncLocalStorage 用法:

const { AsyncLocalStorage } = require('async_hooks');
const als = new AsyncLocalStorage();

// 传统用法
als.run(store, () => {
  // 异步操作
  doSomethingAsync();
});

传统用法的问题:

  • 需要嵌套回调函数
  • 代码结构不够直观
  • 容易忘记在 run 回调中执行
  • 与 async/await 配合不够优雅
  • 作用域结束时需要手动清理

using 作用域的新用法

using 作用域支持使得 AsyncLocalStorage 的使用更加简洁:

const { AsyncLocalStorage } = require('async_hooks');
const als = new AsyncLocalStorage();

// using 作用域用法
using (als.enter(store)) {
  // 异步操作
  await doSomethingAsync();
}
// 作用域结束后自动退出

using 作用域的优势:

  • 代码更直观:不需要嵌套回调
  • 自动清理:作用域结束后自动退出上下文
  • 与 async/await 完美配合:可以在 using 块中使用 await
  • 更安全:不会忘记退出上下文
  • 更好的可读性:代码结构更清晰

实际应用场景

  • 请求追踪:在 HTTP 请求处理中存储请求 ID
  • 日志上下文:在日志中添加上下文信息
  • 多租户:在异步操作中传递租户信息
  • 性能监控:在异步链中传递性能数据
  • 错误处理:在错误中添加上下文信息

2. Permission 权限模型增强

特性概述

Node.js 的权限模型(Permission Model)在 24.20.0 中得到显著增强,添加了两个重要特性:

  • permission.drop() 方法(SEMVER-MINOR),由 Rafael Gonzaga 贡献
  • --permission-audit 命令行标志(SEMVER-MINOR),由 RafaelGSS 贡献

什么是 Node.js 权限模型

Node.js 权限模型是一种安全机制:

  • 限制 Node.js 进程可以访问的资源
  • 控制文件系统访问
  • 控制子进程创建
  • 控制 Worker 线程创建
  • 控制原生模块加载
  • 提升应用安全性

permission.drop() 方法

permission.drop() 方法允许在运行时放弃权限:

const { permission } = require('node:process');

// 检查当前权限
if (permission.has('fs.read', '/etc/passwd')) {
  console.log('可以读取 /etc/passwd');
}

// 放弃特定权限
permission.drop('fs.read', '/etc/passwd');

// 放弃后无法再访问
try {
  fs.readFileSync('/etc/passwd');
} catch (e) {
  console.log('权限已被放弃');
}

permission.drop() 的价值:

  • 最小权限原则:使用后立即放弃不需要的权限
  • 降低攻击面:减少被利用的可能性
  • 安全降级:在完成敏感操作后降低权限
  • 细粒度控制:可以放弃特定资源的特定权限
  • 运行时动态调整:不需要重启进程

--permission-audit 标志

--permission-audit 标志启用权限审计模式:

node --permission-audit app.js

权限审计模式的特点:

  • 不实际阻止访问:记录但不阻止权限请求
  • 记录所有权限检查:记录应用请求的所有权限
  • 生成审计报告:输出权限使用报告
  • 帮助配置权限:了解应用需要哪些权限
  • 安全分析:分析应用的权限使用模式

--permission-audit 的使用场景:

  • 权限配置:确定应用需要的最小权限集
  • 安全审计:审计应用的权限使用
  • 迁移辅助:帮助现有应用迁移到权限模型
  • 调试:调试权限相关的问题
  • 合规:满足安全合规要求

3. WASM JSPI 启用

特性概述

wasm 模块启用了 JSPI(JavaScript Promise Integration),由 Guy Bedford 贡献(SEMVER-MINOR)。这是 WebAssembly 与 JavaScript 异步交互的重要改进。

什么是 JSPI

JSPI(JavaScript Promise Integration)是一种 WebAssembly 标准:

  • 允许 WebAssembly 代码调用返回 Promise 的 JavaScript 函数
  • WebAssembly 代码可以暂停并等待 Promise 解析
  • 不需要复杂的异步包装
  • 简化 Wasm 与 JS 的异步交互
  • 提升开发体验和性能

JSPI 解决的问题

在 JSPI 之前,Wasm 调用异步 JS 函数很困难:

  • Wasm 函数不能直接 await Promise
  • 需要复杂的回调机制
  • 需要手动管理 Wasm 栈的暂停和恢复
  • 代码复杂且容易出错
  • 性能开销大

JSPI 的工作原理

JSPI 的工作原理:

  • Wasm 调用返回 Promise 的 JS 函数时
  • Wasm 执行被暂停,栈被保存
  • JavaScript 事件循环继续运行
  • Promise 解析后,Wasm 栈被恢复
  • Wasm 从暂停处继续执行
  • 对 Wasm 代码来说,就像同步调用一样

实际应用场景

  • Wasm 应用开发:简化 Wasm 应用中的异步操作
  • 现有代码移植:更容易将现有同步代码移植到 Wasm
  • 网络请求:在 Wasm 中发起网络请求并等待响应
  • 文件操作:在 Wasm 中执行异步文件操作
  • 数据库访问:在 Wasm 中访问异步数据库 API

4. Loader Package Maps

特性概述

loader 模块实现了 package maps(包映射),由 Maël Nison 贡献(SEMVER-MINOR)。这是 Node.js 模块加载器的重要改进。

什么是 Package Maps

Package Maps 是一种模块解析机制:

  • 将包名映射到特定的模块路径
  • 支持条件映射(根据导入条件映射到不同路径)
  • 类似于 import maps 但在 Node.js 加载器层面实现
  • 更灵活的模块解析
  • 更好的模块别名支持

Package Maps 的用途

  • 模块别名:为模块创建别名
  • 条件加载:根据条件加载不同的模块实现
  • 测试替换:在测试中替换模块实现
  • 版本切换:在不同版本间切换
  • 路径简化:简化长路径的导入

5. Stream node:stream/iter 实现

特性概述

stream 模块添加了 node:stream/iter 实现,由 James M Snell 贡献(SEMVER-MINOR)。这是 Node.js 流的新实现方式。

什么是 node:stream/iter

node:stream/iter 是基于异步迭代器的流实现:

  • 使用异步迭代器作为流的基础抽象
  • 更简洁的流 API
  • 更好的与 async/await 配合
  • 更高的性能
  • 更简单的错误处理

与传统流的对比

传统 Node.js 流(Stream):

  • 基于事件发射器(EventEmitter)
  • 使用 pipe 方法连接流
  • 背压管理复杂
  • 错误处理需要小心
  • API 相对复杂

node:stream/iter:

  • 基于异步迭代器
  • 使用 for await...of 消费流
  • 背压自动管理
  • 错误处理更直观(try/catch)
  • API 更简洁

使用示例

const { createReadStream } = require('node:stream/iter');

// 使用异步迭代器读取文件
async function readFile() {
  const stream = createReadStream('file.txt');
  for await (const chunk of stream) {
    console.log(`收到 ${chunk.length} 字节`);
  }
}

6. Test Runner 增强

特性概述

test_runner 测试运行器添加了多项增强:

  • context.log() 方法(SEMVER-MINOR),由 Moshe Atlow 贡献
  • test:log 事件(SEMVER-MINOR),由 Moshe Atlow 贡献
  • TestStream 事件中报告 entryFile(SEMVER-MINOR),由 Moshe Atlow 贡献

context.log() 方法

context.log() 允许在测试中输出日志:

const { test } = require('node:test');

test('测试示例', (t) => {
  t.log('这是测试日志');
  // 测试逻辑
});

context.log() 的优势:

  • 测试相关的日志:日志与测试关联
  • 结构化输出:日志被结构化处理
  • 报告包含:日志包含在测试报告中
  • 调试友好:更容易调试测试
  • 不污染 stdout:不直接输出到 stdout

test:log 事件

test:log 事件允许监听测试日志:

const { test } = require('node:test');

process.on('test:log', (log) => {
  console.log(`测试日志: ${log.message}`);
});

entryFile 报告

TestStream 事件中报告 entryFile:

  • 知道每个测试来自哪个文件
  • 更好的测试报告
  • 更容易定位测试
  • 支持文件级别的测试统计

7. Buffer end 参数

特性概述

buffer 模块添加了 end 参数(SEMVER-MINOR),由 Robert Nagy 贡献。同时修复了 indexOf/lastIndexOf 中 end 参数的 bug。

end 参数的用途

end 参数允许指定搜索的结束位置:

const buf = Buffer.from('Hello World');

// 搜索到指定位置结束
const index = buf.indexOf('o', 0, 5); // 只在前5个字节中搜索
console.log(index); // 4

end 参数的价值:

  • 更精确的搜索:可以限定搜索范围
  • 性能优化:不需要搜索整个缓冲区
  • 部分处理:处理部分缓冲区时更方便
  • 与 Array 一致:与 Array.prototype.indexOf 的参数一致
  • 修复 bug:修复了之前 end 参数的行为问题

其他改进

根证书更新

  • 更新根证书到 NSS 3.125
  • 包含最新的可信根证书
  • 提升 HTTPS 连接的兼容性
  • 修复某些网站的证书验证问题
  • 由 Node.js GitHub Bot 自动更新

协作者添加

  • 添加 MikeMcC399 为协作者
  • 社区贡献者的认可
  • 社区驱动的开发模式
  • 更多的维护力量

Bug 修复

24.20.0 包含大量 bug 修复:

  • assert/util:修复 Maps 带 null key 时的 TypeError
  • async_hooks:使用 validateBoolean 验证 trackPromises
  • benchmark:修复 calibrate-n 选项处理
  • buffer:多项修复(Blob slice、copyArrayBuffer、行尾规范化、流泄漏等)
  • 以及更多模块的修复

升级建议

谁应该升级

  • 所有 Node.js 24.x 用户:推荐升级到 24.20.0
  • 使用 AsyncLocalStorage 的应用:benefit from using 作用域支持
  • 关注安全的应用:benefit from 权限模型增强和根证书更新
  • 使用 WebAssembly 的应用:benefit from JSPI 启用
  • 使用测试运行器的应用:benefit from 测试运行器增强
  • 遇到已知 bug 的应用:benefit from 大量 bug 修复

升级注意事项

  • 向后兼容:24.20.0 保持向后兼容,可以安全升级
  • 新特性是可选的:新特性都是添加性的,不影响现有代码
  • 测试:升级后建议运行完整的测试套件
  • 性能:某些场景可能有性能变化,建议基准测试
  • 权限模型:如果使用权限模型,注意新的 API 和行为
  • 监控:升级后密切监控应用行为

升级方法

# 使用 nvm 升级
nvm install 24.20.0
nvm use 24.20.0

# 使用官方安装包
# 从 nodejs.org 下载对应平台的安装包

# 使用 Docker
docker pull node:24.20.0

总结

Node.js 24.20.0 LTS "Krypton" 是 Node.js 24 LTS 线的重要版本更新,包含多项有价值的新特性和改进。核心新特性包括:AsyncLocalStorage 的 using 作用域支持(使异步上下文管理更简洁安全,与 async/await 完美配合,自动清理)、Permission 权限模型增强(permission.drop() 方法支持运行时放弃权限,--permission-audit 标志启用权限审计模式帮助配置最小权限)、WASM JSPI 启用(允许 WebAssembly 代码调用返回 Promise 的 JavaScript 函数并暂停等待,简化 Wasm 与 JS 的异步交互)、Loader Package Maps(灵活的模块解析和别名支持)、Stream node:stream/iter 实现(基于异步迭代器的流实现,更简洁的 API 和更好的背压管理)、Test Runner 增强(context.log() 方法、test:log 事件、entryFile 报告)、Buffer end 参数(更精确的搜索范围控制)。其他改进包括根证书更新到 NSS 3.125、添加新协作者、大量 bug 修复。24.20.0 保持向后兼容,推荐所有 Node.js 24.x 用户升级,特别是使用 AsyncLocalStorage、关注安全、使用 WebAssembly、使用测试运行器的应用。升级方法简单,可以通过 nvm、官方安装包或 Docker 快速升级。Node.js 24 LTS 线持续接收新特性和改进,展示了 Node.js 社区的活跃开发和对稳定性、安全性、开发者体验的持续关注。

来源:https://nodejs.org/en/blog/release/v24.20.0

推荐文章

程序员茄子在线接单