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.isErrorURLPattern暴露为全局
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.globSync、buffer.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 APISlowBuffer- REPL 不用
new实例化 - Zlib 类不用
new child_process向spawn/execFile传args- 直接使用
fs.F_OK/fs.R_OK/fs.W_OK/fs.X_OK常量
对已在 22 或更早版本上的服务,建议先把 AsyncLocalStorage 相关中间件和自定义 async_hooks 在 24 上跑一遍压测,再处理 fs.truncate()、tls.createSecurePair() 这类已经移除的调用点。