← Electron.js与Node.js区别 module.exports与exports区别 →

Node.js LTS与Current版本区别:发布节奏、支持周期与生产选型依据

著
原创 2026-10-20 Node.js 已有人查阅

一、先厘清“稳定版”这个词的歧义

原始材料把“StableVersion”作为与LTS并列的概念,这个表述容易造成误解。Node.js官方文档中并不存在一个叫“Stable”的独立版本类型。版本状态只有三种:Current、ActiveLTS、MaintenanceLTS,以及最终的End-of-Life。

所谓“稳定版”,在日常讨论中通常指代Current版本,即新发布的大版本。它确实可以运行,也经过测试,但它的支持窗口和LTS不同。把Current称为“稳定版”会让人误以为它比LTS更适合生产,恰好与官方建议相反。

官方文档的措辞是明确的:生产环境应用应当仅使用ActiveLTS或MaintenanceLTS版本。Current版本面向的是库作者和需要提前验证新特性的场景,不是生产部署的推荐目标。

二、历史规则:偶数进LTS,奇数只活六个月

在Node.js26及之前,发布节奏是每半年一个大版本,通常在四月和十月。偶数版本(如22、24)在六个月的Current阶段结束后进入ActiveLTS,获得总计约30个月的支持。奇数版本(如23、25)在六个月的Current阶段结束后直接进入End-of-Life,不会获得LTS状态。

这个规则的成因在官方博客中有解释:奇数版本的实际采用率很低,大多数用户等待LTS;奇偶区分对新手造成困扰;许多组织跳过奇数版本,只升级到LTS。十年来积累的数据促成了调度调整。

当前的实际状态可以作为参照:Node.js24(Krypton)处于ActiveLTS,支持到2028年4月;Node.js22(Jod)处于MaintenanceLTS,支持到2027年4月;Node.js26处于Current,预计2026年10月进入LTS。

三、即将发生的变更:Node.js27起每年一版,全部转为LTS

从Node.js27开始(2026年10月起生效),发布周期改为每年一次,每个大版本在六个月的Current阶段和六个月的Alpha阶段之后,一律进入LTS。奇偶区分取消,不再有“奇数版本不进入LTS”的规则。

新的阶段结构是:Alpha六个月(早期测试,允许semver-major变更)、Current六个月(稳定化)、LTS三十个月(安全修复与关键bug修复),从首次Current发布到End-of-Life总计约36个月。

这个变更对生产团队的实际影响是:如果你原本只升级LTS版本,除了版本号变化之外,升级路径的节奏基本不变。但Alpha阶段的引入意味着愿意提前测试的团队有了一个比Nightly更可控的早期反馈渠道,官方建议将Alpha版本尽早纳入CI,否则无法在问题影响用户之前报告bug。

四、验证当前版本状态的方式

原始材料中给出的命令node-peprocess.release.lts是有效的。返回一个代号字符串(如'Krypton'或'Jod')表示该版本是LTS;返回undefined表示不是LTS。

更完整的验证方式可以同时查看版本号和LTS状态:

console.log('版本:', process.version);
console.log('LTS 代号:', process.release.lts ?? '非 LTS(Current 或 EOL)');

在CI或容器启动脚本中加入这条检查,可以避免因基础镜像未更新而误用已EOL的版本。Azure的文档也强调本地开发环境、CI/CD环境、宿主运行时和SDK应使用一致的Node.js版本,版本不一致可能导致语法错误、已弃用API行为差异或安全弱点。

五、从LTS升级时容易被忽视的三类阻塞点

LTS之间的升级(例如从Node.js22到24)看起来跨度不大,但实际需要检查的点不限于应用代码本身。

原生模块的ABI兼容性。链接V8API的C/C++插件可能需要针对新版本的V8重新编译。Node.js24的迁移指南指出,链接V8API的插件可能需要为V813.6更新,部分场景需要C++20支持(此前为C++17)。官方建议尽可能使用Node-API,因为它提供跨版本的ABI稳定性,但直接依赖V8内部接口的插件不自动获得这层保护。升级前应当识别依赖树中使用node-gyp的包,确认目标版本是否有兼容的预编译二进制或维护状态。

OpenSSL安全等级变更对外部集成的影响。Node.js24LTS搭载OpenSSL3.5,默认安全等级为2。这意味着低于2048位的RSA/DSA/DH密钥、低于224位的ECC密钥、使用RC4的密码套件会被拒绝。你的JavaScript代码可能兼容,但依赖旧密钥的内部API、数据库连接、代理或认证系统可能在升级后握手失败。这类问题不会在单元测试中暴露,需要针对TLS依赖做集成验证。

已移除API在运行时变成硬失败。Node.js的弃用周期通常较长,代码可能在多个大版本中带着弃用警告运行而不出错。但某个大版本会移除这些API。例如Node.js24移除了process.assert,若干fs和TLSAPI的行为也发生了变化。从较旧的LTS(如18或20)跨多个大版本升级时,累积的移除项会显著增加。在升级前用node--pending-deprecationapp.js或node--throw-deprecationapp.js运行,可以把潜在的弃用问题提前暴露为失败信号。

六、常见误区速查

以为“新版本就是最稳定的版本”。Current版本包含新特性,但支持窗口短,且可能包含尚未被广泛验证的变更。生产环境应使用LTS。

以为奇数版本也会在某个时间转为LTS。在Node.js26及之前,奇数版本直接EOL,不进入LTS。Node.js27起此规则取消,但在此之前奇数版本不应作为生产选择。

以为LTS意味着“功能冻结”。LTS阶段仍然会接收新特性,但官方描述是“经发布团队审核并确定适合该版本线的特性和修复”。Maintenance阶段才以关键bug和安全修复为主。

以为升级LTS只需要跑一遍应用的单元测试。原生模块、TLS依赖、容器基础镜像和CI配置都可能成为阻塞点。NodeSource的文章将这类问题归纳为“基础设施可能才是真正的阻塞者”。

七、延伸阅读与参考文献

Node.js官方版本页面,nodejs.cn,明确“生产环境应用应仅使用ActiveLTS或MaintenanceLTS”,并说明奇数版本在Node.js26前不进入LTS的历史规则。https://url.nodejs.cn/en/about/previous-releases

Node.js官方博客“Evolving the Node.js Release Schedule”,nodejs.org,说明Node.js27起改为年度发布、全部版本进入LTS的决策背景,以及Alpha阶段的设计意图。https://nodejs.org/en/blog/announcements/evolving-the-nodejs-release-schedule

Node.js Release Working Group调度表,GitHub,提供各版本InitialRelease、ActiveLTSStart、MaintenanceLTSStart、End-of-Life的精确日期,包括22.x、24.x、26.x的当前状态。https://github.com/nodejs/Release

Node.jsv22到v24迁移指南,nodejs.cn,列出OpenSSL3.5安全等级2对密钥长度的限制、C++插件对V8API的兼容要求,以及若干已移除API的codemod迁移路径。https://url.nodejs.cn/en/blog/migrations/v22-to-v24

NodeSource“Node.js Upgrade: 5 Things That Can Break Before You Migrate”,从原生模块、依赖引擎字段、OpenSSL/TLS、已弃用API、CI/容器配置五个维度列出LTS升级前需要检查的阻塞点。https://nodesource.com/blog/nodejs-upgrade-things-that-can-break-before-you-migrate

MicrosoftLearn“对Azure使用正确的Node.js版本”,说明LTS通常获得约30个月维护、Current版本仅支持六个月,以及生产环境不应使用Current的原因。https://learn.microsoft.com/zh-cn/azure/developer/javascript/choose-nodejs-version

← Electron.js与Node.js区别 module.exports与exports区别 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号