[email protected]:现已成为 npm 默认版本,并提供 LTS 时间表
Express v5.0.0 于去年 9 月 9 日发布,但我们并未将其设为 npm 上的 latest
版本。许多人问我们为什么以及何时会这样做,坦率地说,我们当时还没有准备好进行这一跃进。如果您在过去一年没有关注该项目的动态,我们一直在努力复兴该项目,当我们推出初始的 v5 版本时,仍有许多悬而未决的问题。所以,首先让我们快速回顾一下这些悬而未决的问题。
文档更新
我们很久没有更新文档、提供迁移指南,甚至没有完全审查一些停滞不前的 v4/5 文档。从那时起,我们得到了大量优秀贡献者的帮助,使情况大为改善。与任何基于志愿者的开源项目一样,我们喜欢有助于我们改进的贡献,因此在您升级时,请继续打开 PR 以修复我们遗漏的任何问题。
迁移支持
我们知道版本之间的迁移可能具有挑战性,尤其是在涉及 Express 这样广泛使用的框架发生重大变化时。这就是为什么我们致力于提供一个解决方案,以简化部分过程并减少对开发人员的影响。
感谢 Sebastian 和 Filip 的巨大努力,我们开发了一个新的 codemod 包,专门用于方便从 Express v4 迁移到 v5,以及未来的主要版本。这个包自动化了许多必要的代码更改,最大限度地减少了手动工作,使升级尽可能顺畅和高效。
但是,我们知道并非所有更改都可以自动化。一些重大更改,例如新的路径路由匹配语法,需要开发人员手动修改。您可以在我们的原始发布公告中阅读有关 v5 带来的所有重大更改的更多信息。
有关迁移过程以及如何使用 codemod 包的更多详细信息,请查看仓库的 README 和迁移指南。
生态系统兼容性
Express 生态系统是其最强大的资产之一。它可追溯到 Node.js 的早期,是保持 Express 流行的支柱。当它十年没有主要版本发布时,从中间件到文档的一切都需要更新。我们希望确保人们有时间更新所有这些内容,然后我们才让所有人迁移。我们特别关心我们庞大的初学者用户群,他们可能不知道他们正在阅读的博客文章与他们从 npm i express
获得的不兼容。
我们认识到在重大升级过程中一些摩擦是不可避免的,但由于 NestJS 的 Kamil 等生态系统合作伙伴在我们将 express
设置为 latest
之前努力更新,我们希望能走在前沿。正如我上面所说,我们始终欢迎帮助,以便为那些跟随您之后的人提供更轻松的过渡,PR 是您能给予的最好支持。
长期支持
我们一直在讨论 v5 发布后如何支持 v4,但我们没有定义明确的指导方针或预期,而且我们(仍然没有)关于我们计划的最终用户文档。虽然我们在这里仍有进展要做,但我们有一个拟议的 LTS 策略,这将成为我们即将发布的文档的基础。我们非常欢迎对此提出意见,以便我们能够确保其清晰传达并被社区接受。
此外,此后我们宣布与 HeroDevs 建立合作关系,以帮助那些不太能够更新的公司。当 v4 EOL 临近时,我们将提供有关其如何运作的更多信息。
支持阶段和成为最新版本
“成为最新版本”意味着什么?如果您不熟悉 npm dist-tags
的工作原理,latest
标签是用户运行 npm install express
时将获得的版本。这很重要,因为它意味着它是“默认安装版本”,并将触发近 1700 万周下载量从我们当前的最新 v4.21.2 迁移到 v5。当我们开始这一过渡时,我们希望用户、公司和其他组织清楚地了解这对支持意味着什么。为了帮助实现这一点,我们制定了 LTS 策略,该策略定义了我们的 3 个支持阶段,并为 v4 何时进入 EOL 设定了目标日期。
Express 主要版本将经历三个支持阶段
CURRENT
(当前):新主要版本在发布时被指定为CURRENT
。它可用,但在 npm 上不是latest
版本,最短为 3 个月。ACTIVE
(活跃):在最短 3 个月期限后,并且技术委员会(TC)同意其稳定和安全后,ACTIVE
版本在 npm 上被标记为latest
,最短为 12 个月。MAINTENANCE
(维护):当一个新主要版本变为ACTIVE
时,前一个主要版本进入MAINTENANCE
阶段,为期 12 个月。
当前 (CURRENT)
- 新主版本将经历一个短暂的强化期,以确保稳定性、安全性以及生态系统库/资源的兼容性。
- 我们将努力确保不包含任何破坏性更改,但在该期限内保留进行安全或高优先级破坏性修复的权利。
CURRENT
系列将接收所有类型的活跃工作,包括:bug 修复、安全补丁、新功能和弃用通知。- 建议用户使用
CURRENT
系列,并根据其风险承受能力尽快升级。
活跃 (ACTIVE)
ACTIVE
系列将接收所有类型的活跃工作,包括:bug 修复、安全补丁、新功能和弃用通知。- 对于用户而言,
ACTIVE
系列在任何给定时间都被认为是最新且支持最好的版本。
维护 (MAINTENANCE)
MAINTENANCE
系列将仅接收安全补丁或高优先级错误修复。- 强烈建议用户升级到
CURRENT
或ACTIVE
版本。
拟定时间表
对于现有版本线,我们将设定以下阶段日期:
主要版本 | 当前 (CURRENT) | 活跃 (ACTIVE) | 维护 (MAINTENANCE) | EOL (生命周期结束) |
---|---|---|---|---|
4.x | 2025-04-01 | *不早于 2026-10-01 | ||
5.x | 2024-09-11 | 2025-03-31 | **不早于 2026-04-01 | **不早于 2027-04-01 |
6.x | ***不早于 2026-01-01 |
如您所见,这意味着 v5.1.0 被标记为 latest
表明我们已从 CURRENT
阶段进入 ACTIVE
阶段,这通过将 v4 移至 MAINTENANCE
阶段而启动了 v4 的 EOL 倒计时。我们认识到 v4 是一个特殊情况,它在 Node.js 本身的大部分历史中都是唯一的 主要版本。正因为如此,我们希望保持灵活性并提供更长时间的支持。我们希望为生态系统做最好的事情,因此请将这些视为目标而非承诺。
*: v4 是一个特殊情况,我们可能会延长 MAINTENENCE 支持
**: v5 MAINTENENCE 和 EOL 日期由 v6 发布时间决定,这些日期反映了如果我们在 2025-10-01 发布 v6 的最早日期
***:v6 的工作尚未正式开始,这只是根据我们提出的政策可以发布的最早日期。
最后,v5.1.0 中有何变化
此次发布主要侧重于支持众多旧版 Node.js 版本所带来的技术债务,以及其他停滞但未在 v5.0.0 发布前完成的工作。
Express 5.1.0 主要变更
- 在
res.send()
中添加对Uint8Array
的支持 - 将所有剩余的依赖项过渡到使用
^
范围,而非锁定版本 - 添加 package.json funding 字段以突出显示我们的 OpenCollective
- 在
res.sendFile()
中添加了对 ETag 选项的支持 - 添加了通过
res.links()
添加多个具有相同 rel 链接的支持 - 性能:使用循环处理 acceptParams
- 请参阅变更日志 v5.1.0
依赖项已更新
我们还投入时间准备了 Express 所依赖的几个包的发布。这些包中的大多数都被其他库和框架作为独立库使用。
- [email protected]
- 移除 Brotli &
AsyncLocalStorage
的旧版 node.js 支持检查 - 移除
unpipe
&destroy
- 移除 Brotli &
- [email protected]
- 恢复
debug
。现在使用router
范围而非express
。 - 移除
setImmediate
的旧版 node.js 支持检查 - 弃用非原生 Promise 支持
- 移除
after
、safe-buffer
、array-flatten
、setprotoypeof
、methods
、utils-merge
- 恢复
- [email protected]
- 移除
headersSent
、setImmediate
和 http2 支持的旧版 node.js 支持检查 - 移除
unpipe
- 移除
- [email protected]
感谢与展望
非常感谢过去一年所有参与 Express 的人,所有贡献者的工作都令人难以置信,没有他们我们无法做到。如果您无法亲自成为贡献者,请考虑要求您的公司在 OpenCollective 上为项目提供资金支持。
展望未来,我们很高兴能保持发展势头。如果您尚未阅读,我们的2024 回顾 + 2025 愿景博客文章阐述了我们过去的成就和未来的方向。这包括性能优化范围包、更好的自动化、安全强化等等。
一项重要举措是我们的新性能工作组,专注于识别和修复 Express 中长期存在的瓶颈。我们很感激能得到主权技术基金 (STF) 的支持,他们正在帮助我们投资于核心基础设施的长期可持续性和性能。此外,我们将努力改进我们的 Typescript DX,并采取下一步措施改进网站。
是的,v6 的讨论已经开始升温。请密切关注更新,一如既往,我们将在 issues 中见!
非常感谢 @wesleytodd、@blakeembrey、@bjohansebas、@UlisesGascon、@Phillip9587、@carpasse、@jonchurch、@ctcpip、@inigomarquinez、@carlosstenzel、@crandmck、@chrisdel101、@dpopp07、@Ayoub-Mabrouk、@jonkoops、@IamLizu、@marco-ippolito、@ipreencekmr、@ShubhamOulkar、@raksbisht、@jeffreybaird、@dougwilson、@mertcanaltin、@GeorgeShvab、@RobinTail、@EvanHahn、@rhodgkins、@cengizcmataraci、@Shantanugupta43、@italojs、@ljharb、@MaoShizhong、@aroyan、@Binilkks、@danielgindi、@papandreou、@jsoref、@bigbigDreamer、@broofa、@CommanderRoot、@andvea、@juanarbol、@agungjati、@alexandercerutti、@pr4j3sh、@hamirmahal、@slagiewka、@Abdel-Monaam-Aouini、@sazk07、@bhavya3024、@joshbuker、@almic、@FDrag0n、@Dmitry-Kondar、@attrid、@kristof-low、@gireeshpunathil、@UzairJ99、@choi2021、@hayden36、@joharkhan99、@peterh-capella、@johnburnett、@nicolasgandrade、@axhuwastaken、@abhijeetpandit7、@peterdanwan、@rehmansheikh222、@corydalis10、@mgsantos177、@wilyJ80、@LuiGeeDev、@juliogarciape、@aelmardhi、@Ahmed1monm、@erensarac、@tomasz13nocon、@tianbuyung、@GreyTearsDev、@aastha-cse、@krzysdz、@Miguelrom、@bnoordhuis、@MehfoozurRehman、@EasonLin0716、@grjan7、@mishrasur7、@gregfenton、@zareefhasan、@Tejas150、@jpricardo、@nikeee、@dotnetCarpenter、@engpetermwangi、@msimerson、@fetsorn、@manoharreddyporeddy、@lancatlin、@mifi、@meowingwhitey、@sheplu、@krsriq、@ravibisht、@wojtekmaj、@aqeelat、@melikhov-dev、@alexstrat、@isnifer、@TorstenDittmann、@Uzlopak、@gurgunday、@kurtextrem、@hdtmccallie、@proudparrot2、@bewinsnw、@jonboulle、@alexander-akait、@alxndrsn、@DimitriPapadopoulos、@greggman、@jkbach、@julien-c、@risu729、@JohnSimumatik、@dhouck、@pedro-php、@aminerol、@robertsky、@ipetrouchtchak-fi、@tinhochu、@Lord-Kamina、@joshkel、@raiandexter0607、@NateEag、@rmhaiderali、@ljeda
编辑此页面