Node.js 24 正式进入 LTS:生产环境升级指南与实战要点

2026-06-18 33 预计阅读时间: 1 分钟
来源: nodejs.org AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:7 分钟

Node.js 24.17.0 标志着 v24 分支正式进入长期支持(LTS)阶段,代号「Jod」。这意味着从实验性 Current 版本到生产级稳定版的过渡已经完成,团队和企业可以放心地将 Node.js 24 纳入部署计划。下面梳理这次 LTS 版本的核心变化和落地实操。

LTS 意味着什么

Node.js 的发布策略是:新大版本先以 Current 身份发布,经过约 6 个月的社区验证后进入 LTS。进入 LTS 后,该分支会持续 30 个月获得安全补丁和关键 bug 修复,不再引入破坏性变更。对于生产环境来说,LTS 是唯一推荐的运行版本。

v24 进入 LTS,意味着之前在 Current 阶段积累的所有新特性——V8 升级、内置 WebSocket、require(esm)、内置 SQLite 等——现在有了稳定承诺,可以正式用于生产。

值得关注的生产级特性

require(esm):同步加载 ESM 模块

这是 v22 起引入、v24 进一步稳定的特性。在 CJS 文件中可以直接 require() 一个 ESM 模块,不再需要动态 import() 的异步包装。对于逐步从 CJS 迁移到 ESM 的项目,这大幅降低了改造成本。

// legacy.cjs — 传统 CommonJS 文件
const { doSomething } = require('./modern-lib.mjs');

doSomething();
// 不再需要 async wrapper 或 dynamic import

注意:被 require 的 ESM 模块不能包含顶层 await,否则会抛错。

内置 WebSocket 客户端

v22 起实验性引入,v24 已稳定。不再需要 wsundici 的 WebSocket 子模块来做基础客户端通信。

const ws = new WebSocket('wss://echo.websocket.org');

ws.addEventListener('open', () => {
  ws.send('hello from built-in WebSocket');
});

ws.addEventListener('message', (event) => {
  console.log('收到回显:', event.data);
});

内置 SQLite

node:sqlite 模块在 v22 实验引入,v24 继续完善。适合轻量本地存储、测试 fixture、嵌入式场景。

const { DatabaseSync } = require('node:sqlite');

const db = new DatabaseSync(':memory:');

db.exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
db.exec('INSERT INTO users (name) VALUES ("alice")');

const stmt = db.prepare('SELECT * FROM users');
console.log(stmt.all());
// [{ id: 1, name: 'alice' }]

db.close();

内置测试_runner 增强

node:test 继续演进,支持 --test 直接运行目录、snapshot 测试、mock 改进等。对于不想引入 Jest/Vitest 的小型项目,内置 runner 已经够用。

# 直接运行整个测试目录
node --test src/__tests__/

# 只跑匹配模式的文件
node --test --test-name-pattern='auth' src/__tests__/

权限模型(Permission Model)

--allow-fs-read--allow-fs-write--allow-env 等权限开关在 v24 进一步稳定,可以限制脚本对文件系统和环境变量的访问范围,降低供应链攻击风险。

# 只允许读取 /app/data 目录,禁止其他文件系统访问
node --allow-fs-read=/app/data --allow-fs-write=/app/logs server.mjs

升级实战:从 v22 LTS 迁移到 v24 LTS

下面是一个典型的升级检查流程,可以直接在项目根目录执行:

# 1. 安装 Node.js 24(以 nvm 为例)
nvm install 24
nvm use 24

# 2. 确认版本
node -v  # 应输出 v24.17.0 或更高

# 3. 检查依赖兼容性
npm ls --long  # 查看所有依赖的 engines 字段

# 4. 全量跑测试
npm test

# 5. 如果用了 TypeScript,重新生成类型
npx tsc --noEmit

# 6. 检查是否有废弃 API 警告
node --deprecation-warning server.mjs

关键迁移注意点:

  • V8 升级带来的行为变化:部分正则表达式边界行为、Intl 格式化细节可能和 v22 不同,跑完测试后重点检查日期/货币格式化输出。
  • fs 模块同步方法性能:v24 对同步 I/O 做了优化,但如果你大量使用 fs.readFileSync,建议趁机改为异步版本。
  • 原生模块(C++ addons):V8 版本升级意味着 NAN/Node-API 绑定可能需要重新编译。优先使用 Node-API(node-api)而非 NAN 的依赖更安全。

生产环境部署建议

场景 建议
新项目 直接用 v24 LTS,启用 ESM + 内置 test runner
现有 v22 LTS 项目 等一个补丁版本(24.17.1+)再升级,先在 CI 中并行跑 v24 测试
容器镜像 更新 Dockerfile 基础镜像:FROM node:24-slim
Lambda/云函数 等平台官方支持 v24 runtime,不要自行打包 runtime

Dockerfile 示例

FROM node:24-slim

WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY . .

# 启用权限模型限制文件系统访问
CMD ["node", "--allow-fs-read=/app", "--allow-fs-write=/app/logs", "server.mjs"]

什么时候不急着升级

  • 你的项目依赖大量 C++ addon 且上游还没适配 v24 的 V8。
  • 你在用云平台(AWS Lambda、GCF 等)且官方 runtime 还停留在 v22。
  • 团队没有完整的自动化测试覆盖,无法验证 V8 行为差异。

在这些情况下,继续用 v22 LTS 完全合理——它还有两年多的支持周期。v24 LTS 的意义是给你一个稳定的新选项,而不是强制迁移。

小结

Node.js 24.17.0 进入 LTS,把过去半年在 Current 分支上打磨的特性正式交付给生产环境。require(esm)、内置 WebSocket、内置 SQLite、权限模型、增强的 test runner——这些不再是实验标签下的玩具,而是有 30 个月稳定承诺的工具。升级前跑一遍完整测试,关注 V8 行为差异和 C++ addon 兼容性,其余可以直接推进。


相关推荐