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 已稳定。不再需要 ws 或 undici 的 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 兼容性,其余可以直接推进。