Node 2023 年度报告

大家好,这里是大家的林语冰。

Node TSC(技术指导委员会)核心团队共享了 2023 Node 发展的实用更新、团队如何确保 Node 的良好测试和可靠性、Node vendor 的依赖变化,以及 Node 安全性和 Web presence 的增强。

免责声明

本文属于是语冰的直男翻译了属于是,略有删改,仅供粉丝参考。英文原味版请传送 Node.js 2023 Year in An Article

2024 了,我决定总结 2023 年 Node 领域取得的成就。Node 正在迅速发展,对于普通用户而言,及时了解最新变化可能极具挑战。因此,本文旨在重点关注 2023 年 Node 领域发生的重大变化和讨论。

作为参考,2023 年对 nodejs/node#main 提交了 2641 次。虽然这些信息可能看起来微不足道,但我发现比较历史数据很有趣。

举个栗子,这是过去 10 年中 Node main 主分支的提交计数。

md 复制代码
Between Jan 1 2023 ~ Jan 1 2024 = 2641
Between Jan 1 2022 ~ Jan 1 2023 = 2629
Between Jan 1 2021 ~ Jan 1 2022 = 2683
Between Jan 1 2020 ~ Jan 1 2021 = 3390
Between Jan 1 2019 ~ Jan 1 2020 = 3953

看到像 Node 这样的成熟项目多年来不断取得显著进展,真是令人印象深刻。不幸的是,我没有历史数据,但我强烈怀疑 Node 今年迎来了大量的首次贡献者。这可能是由于各种研讨会等相关举措所致。

举个栗子,NodeConfEU 2023 举办了"您的第一个 Node 贡献"研讨会。我相信其他成员也会持续协助该项目的新贡献者。

Node 发布情况

2023 年,不同版本系列一共发布了 102 个版本,包括安全版本。

今年年初有 4 个活跃的版本系列:

  1. Node 14
  2. Node 16
  3. Node 18
  4. Node 19

Node 14/16/19 现已终止生命周期,Node 18 处于维护模式,这意味着该版本不再有常规版本。

这一年最终发布了以下活跃版本:

  1. Node 18(维护)
  2. Node 20(LTS)
  3. Node 21(当前)

因此,如果您没有在使用其中的某个版本,请及时升级。

在都柏林 Node 合作者峰会(NodeConfEU)期间,我们分析了 Node 二进制文件的下载统计数据,它证明了我们的观点,即用户没有尽快更新其二进制文件。

如图所示,即使 EOL(生命周期完结)版本仍然会收到大量下载,这对 Node 用户而言如履薄冰,因为它们在某些时候会使用易受攻击的版本。

因此,我们想到的一种假说是 ------ 我们的发布时间表太快了。我们正在讨论一项新提案,这仍需要发布者团队进行评估,但它建议将 Node 主版本减少到每年 1 次,而不是每年 2 次。

当检查上图时,尤其是关注 y 轴时,大家可能会推断 Node 下载量在 3 月 23 日达到了约 6_000 万的峰值。但是,这种解释具有误导性,因为它没有考虑 NodeSource 分布统计数据,而主要由生产二进制文件组成,不包括从非活动版本系列下载,比如 Node 8/10/12 等版本。

CITGM(Canary-In-The-Gold-Mine)的积极工作

@nodejs/releasers 在 Node 领域发挥着最关键的作用之一。它们确保我们在计算机上收到的版本的可靠性。为了实现这一目标,我们在所有支持的架构中使用了一套全面的测试,并根据变化运行特定的测试,比如 V8。

此外,对于每个版本,我们都会执行 CITGM,它本质上会请求 lookup.json 中列出的所有模块,并使用新的二进制前景运行其测试套件。如果出现任何问题,我们会进行调查。

然而,CITGM 需要一组功能强大的机器才能正确运行所有测试。不幸的是,我们在这方面有点有限,导致测试之间出现一些并发错误。这是因为某些测试需要并行运行;否则,CITGM 将需要数年时间才能完成。

另一个挑战在于,确保 lookup.json 中列出的模块是最新的。有时,模块会被存档,或者可能永远不会支持较新版本的 Node,或者它们可能根本不可靠,这早已司空见惯。

因此,类似的举措屡见不鲜:

  • 宣布 CITGM 模块破产
  • 删除忽略的模块

否则,我们可能会发现自己正在处理一个不可靠的 CITGM,从而使我们对潜在的重大变化视而不见。

Node 项目的新方向

自 2022 年以来,Node 现在比以往任何时候都更容易受到重大变化的影响。新型依赖正在被集成到 Node 内核中,并且新型内置模块正在开发中。这扩大了 Node 作为平台的服务范围。

然而,在我看来,这种新方案可能会导致对维护和潜在攻击向量的担忧。另一方面,它还为开发者提供了支持,并降低了使用恶意库的风险,尽管在本机端执行操作会对性能产生影响。

下图仅供参考,我一直在密切监视各个版本的 Node 的二进制大小,显而易见,新型依赖和功能的添加会直接影响二进制大小。

除非我们在异常受限的环境中运行,否则 100MiB 应该不会引起重大事故。

新型依赖

2023 年,Node 发布了 3 个新型依赖:

  1. Ada:用现代 C++ 编写的符合 WHATWG 要求的快速 URL 解析器
  2. simdutf:Unicode 例程(UTF8、UTF16、UTF32)解析器
  3. simdjson:使用常用 SIMD 指令和微并行算法来有效解析 JSON 的库

所有这些库都重点关注性能,使 Node 能够达到全新的优化峰值。

OpenSSL 3.0.x 相对于 QUIC 的成本

从 Node 16 开始,Node 使用来自 quictls 团队的 openssl 分支。这是将 QUIC 协议引入 Node 的第一步。但是,OpenSSL 版本 3.0.x 明显慢于 OpenSSL 3.2.x。从 Node 的角度来看,迁移到 OpenSSL 3.2.x 有两点比较困难:

  1. OpenSSL 3.2.x 不完全支持 QUIC,尽管 Node 尚未提供 QUIC 支持。
  2. OpenSSL 3.2.x 不是 LTS(长期支持)系列,对于 Node 中的 LTS 系列而言,在其生命周期结束后发布可能包含漏洞的版本完全达咩。

持续的性能进化

Node 在性能方面持续稳定发展。本节不会深入学习具体的数字数据,而是重点关注在性能领域已表现出明显进步的举措和拉取请求。

一项显著优化是将 libuv 升级到 1.45.0 版本。在此版本中,在 Linux 上启用了 IO_URING,从而使 read/write 等文件系统操作的吞吐量暴涨了 8 倍。

此外,我们在 2023 年引入了 Ada 作为 Node 的新型 URL 解析器,Ada 现已在所有活跃版本系列 Node 18/20/21 中提供。

2023 年发现了 2 个重要的回归:

  1. AsyncHooks
  2. WebStreams

这些功能对于 Node 中的某些用例至关重要。举个栗子,如果我们使用了 fetch(),那可能依赖了 WebStreams,或者如果我们使用任何 App 性能监控工具,那么应该通过 AsyncLocalStorage 利用 AsyncHooks

一项于 1 月份开始的计划已记录在案,这提出了一种不依赖 AsyncHooksAsyncLocalStorage 替代实现,而 AsyncHooks 在当时被认为是一个性能瓶颈。

WebStreams 被确定为 2022 年 fetch 函数的性能瓶颈。从那时起,我们一直通过多个 PR 不断增强其在 undici 中的使用。

Node 的原生基准测试模块

2023 年,Node 几乎获得了内置的基准测试模块,Node 添加了一个实验性基准测试模块:require('node:benchmark')

虽然这个拉取请求得到了很大的关注,但由于某些原因我们没有继续这项工作:

  • 基准测试很难,微基准测试更难。它们很难评估,也很难证明其准确性,因为有不同的策略来衡量它们。
  • 某些 Node 合作者共享了一些担忧

然而,这并不意味着我们放弃了!我们已经在 npmjs 上将该模块发布为 bench-node

增强 Node 安全性

安全性是我在 2023 年花费最多时间的领域,全职致力于 Node 安全性的开发和改进。

Node 权限模型

Node 权限模型,这项计划由来已久,但尚未准备就绪,已于 2022/2023 年重新实施。

从技术上讲,此实验性功能允许我们限制对环境资源的访问,比如:

  • 文件系统(fs 模块)的读/写
  • Inspector protocol(检查员协议)
  • Worker threads(工作线程)
  • Child process(子进程)
  • Native add-ons(原生附加组件)

使用方案非常简单,使用 --experimental-permission 启动 Node 进程,并传递 --allow-* 标志。举个栗子,我想授予对 App 入口点的只读访问权限:

bash 复制代码
node --experimental-permission --allow-fs-read=./index.js index.js

因此,如果我们尝试从其他路径读取/写入,它应该抛出错误:

js 复制代码
// index.js
const fs = require('fs')
const data = fs.readFileSync('/etc/passwd')
console.log(data.toString())
// 报错

处理更多安全版本

2023 年,我们发布了更多安全版本,主要是因为我们在第三方 CVE 方面更加主动。2022 年,安全团队创建了多项计划,更新自动化和 Node 发布自动化等计划会影响我们团队的采取行动的时间。

随着最近添加权限模型,我们注意到大家还发现了自 11.8.0 版本以来 Node 中存在的另一个实验性安全功能 ------ policy mechanism(政策机制)。此功能符合我们所说的:基于模块的权限,并且我们在 2023 年修复了此功能中的多个漏洞。

尽管如此,在报告方面,我们的威胁模型中还是做了一些澄清。权限模型和策略等实验性功能可以将严重性附加到与任何稳定功能相同的级别。因此,在查看 Node 安全版本时,请检查该漏洞是否会影响您。

Node 官网更新

2023 年,Node 社区讨论要让 Node 网站焕然一新。我们在 TSC 会议上讨论过几次,还在 Node 协作峰会上共享了这个想法。

2023 新功能

2023 年发布了多项功能:

  • 对 HTTP 和 WHATWG 规范进行了某些重要更新:
    • 我们已将 fetch 稳定性移至:"稳定"。
    • finished() 是在可读流和可写流中实现的。
    • Duplex.from() 现在支持 WebStream
  • 支持 V8 Maglev 编译器
  • 测试运行程序(稳定)
  • 内置 .env 支持(实验性):这与 Node 20.6.0 一起发布,此功能旨在提供从配置文件读取环境变量的官方机制。以前依赖 dotenv 包或类似包是一种常见方案。在此版本之后,我们可以直接在 Node 上使用它,而无需为此安装新的包。
  • WebSocket 客户端(实验性):Node 21.0.0 包含另一个实验性功能。此版本中出现了内置 WebSocket 客户端,这通过标记启用: --experimental-websocket,并遵循 WHATWG WebSocket 规范。

本期话题是 ------ Node 2023 你最喜欢那个新功能或优化?

欢迎在本文下方自由言论,文明共享。谢谢大家的点赞,掰掰~

《前端猫猫教》每日 9 点半更新,坚持阅读,自律打卡,每天一次,进步一点

相关推荐
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
北岛寒沫3 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
everyStudy3 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
(⊙o⊙)~哦4 小时前
JavaScript substring() 方法
前端
无心使然云中漫步4 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者4 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
xnian_5 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js
麒麟而非淇淋6 小时前
AJAX 入门 day1
前端·javascript·ajax
2401_858120536 小时前
深入理解MATLAB中的事件处理机制
前端·javascript·matlab
阿树梢6 小时前
【Vue】VueRouter路由
前端·javascript·vue.js