编程 Node.js 24 LTS:AsyncLocalStorage 换了实现,fetch 开始认环境代理

2026-09-14 21:04:28

Node.js 24 LTS:AsyncLocalStorage 换了实现,fetch 开始认环境代理

Node.js 24 在 2025-10 进入 LTS,代号 Krypton,当前最新版本为 24.21.0(2026-09-08)。发布页与完整变更记录:

  • 发布页:https://nodejs.org/en/blog/release/v24.20.0
  • 变更日志:https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V24.md

这一版没有靠单个大特性撑场,更多是把前几个大版本里打磨过的组件收进 LTS:AsyncLocalStorage 换底层实现、Permission Model 转稳定、内置 SQLite 继续补 API。对 Node 后端和工具链来说,下面几处值得在升级前过一遍。

AsyncLocalStorage 默认切到 AsyncContextFrame

AsyncLocalStorage 的默认实现从基于 async_hooks 换成了 AsyncContextFrame。上下文传播不再让每个异步操作都走一遍 async hooks 基础设施,高吞吐场景下的请求追踪、per-request 日志中间件(Express/Fastify)开销更低。

同时新增两个选项:defaultValue 在没有活动 store 时给默认值,name 用于调试和堆快照标签。

这是行为变更,不是纯性能优化。边界场景——尤其是依赖 async_hooks 时序或自定义 hook 的代码——需要实际跑一遍再上生产。

fetch() 通过 NODE_USE_ENV_PROXY 支持代理

fetch() 现在可以用环境变量 NODE_USE_ENV_PROXY 读取代理配置,不必再手动往 undici 里塞 dispatcher。Undici 同步升级到 7。对需要在容器或企业网络里出网的 Node 服务,少了一层封装代码。

Permission Model 转稳定

权限模型从实验状态转为稳定,flag 名也正式改掉:

  • --experimental-permission--permission
  • 新增 permission.drop
  • 新增 --permission-audit

之前因为 experimental 前缀不敢在 CI 里固定的配置,现在可以写进启动脚本。

node:sqlite 继续补成熟度

内置的 node:sqlite 这版补了若干实用 API:

  • createAggregateFunction():注册自定义聚合函数
  • location():获取数据库文件路径
  • DatabaseSync 新增超时选项,用于处理锁争用
  • prepared statement 新增 setReturnArrays()

对本地工具、CLI、边缘缓存这类场景,已经能少带一个原生依赖。

V8 13.6:Float16Array、using、RegExp.escape

V8 升到 13.6(属于 Chromium 136)。语言与运行时侧的变化:

  • Float16Array
  • 显式资源管理:using / await using
  • RegExp.escape
  • WebAssembly Memory64
  • Error.isError
  • URLPattern 暴露为全局

using 对需要在函数退出时释放句柄、锁或临时文件的工具代码比较直接,不用再写 try/finally 包一层。

测试运行器自动等待子测试

node:test 这版把子测试的生命周期收进运行时:自动等待子测试结束,不再需要手动 await 一个 promise。同时 test()t.test() 不再返回 Promise,调用点如果之前靠返回值做链式等待,需要改。

另外新增:全局 setup/teardown、context.log()test:log 事件。

其他值得带上的改动

  • node:stream/iter:stream 新增迭代器实现
  • buffer:新增 end 参数
  • crypto:支持通过 STORE loaders 加载私钥,支持 post-quantum 加密
  • assert.partialDeepStrictEqual() 稳定
  • fs.globSyncbuffer.byteLength 性能改进
  • HTTP/2 优雅关闭

破坏性变更

升级前重点核对这几项:

  • Windows 上移除 MSVC 支持,改 ClangCL
  • macOS 最低 13.5,Xcode 最低 16.1
  • 移除 http.OutgoingMessage_headers / _headerNames
  • 移除 fs.truncate() 传文件描述符的形式
  • 移除 tls.createSecurePair()
  • fs.dirent.path 改为 parentPath
  • 移除 ppc 32 位与 s390 32 位支持

弃用清单

这些还可用,但已经进入运行时弃用:

  • url.parse(),改用 WHATWG URL API
  • SlowBuffer
  • REPL 不用 new 实例化
  • Zlib 类不用 new
  • child_processspawn / execFileargs
  • 直接使用 fs.F_OK / fs.R_OK / fs.W_OK / fs.X_OK 常量

对已在 22 或更早版本上的服务,建议先把 AsyncLocalStorage 相关中间件和自定义 async_hooks 在 24 上跑一遍压测,再处理 fs.truncate()tls.createSecurePair() 这类已经移除的调用点。

复制全文 生成海报 Node.js JavaScript 运行时 LTS 升级

推荐文章

程序员茄子在线接单