Cloudflare官方
25-11-14 17:53 微博认证:Cloudflare官方微博

持续提升 Cloudflare Workers 的 Node.js 兼容性(二)

其他进程 API

我们无法在此详细介绍每个 node:process API,但以下是我们已实现的其他一些值得注意的 API:

process.nextTick(fn):在当前执行上下文完成后调度回调函数执行。我们的实现采用了与 Promise 相同的微任务队列机制,因此其行为与 queueMicrotask(fn) 完全一致。

process.cwd() 和 process.chdir():用于获取和更改当前的虚拟工作目录。Worker 启动时,当前工作目录会被初始化为 /bundle,并且每个请求都有自己独立的工作目录视图。在一个请求中更改工作目录,不会影响其他请求中的工作目录。

process.exit():立即终止当前 Worker 请求的执行。这与 Node.js 不同,在 Node.js 中,process.exit() 会终止整个进程。而在 Workers 中,调用 process.exit() 将停止当前请求的执行,并向客户端返回一个错误响应。

使用 node:zlib 压缩

node:zlib 模块提供了一系列 API,支持使用 gzip、deflate 和 brotli 等多种算法对数据进行压缩与解压缩。我们已经实现了 node:zlib 模块,让您能够在 Workers 应用中直接使用这些熟悉的压缩 API。由此可以支持多种应用场景,包括网络传输数据压缩、响应优化以及归档文件处理等。

图2

虽然 Workers 已经通过 Web 平台标准压缩 API 内置支持了 gzip 和 deflate 压缩,但对 node:zlib 模块的支持则进一步增加了对 Brotli 压缩算法的支持,同时也为 Node.js 开发者提供了更加熟悉的 API。

定时和调度

Node.js 通过 node:timers 模块提供了一组定时和调度相关的 API。我们在运行时中也实现了这些 API。

图3

Node.js 中的定时器 API 与标准的 Web 平台非常相似,但有一个关键区别:Node.js 计时器 API 会返回 Timeout 对象,可用于在创建计时器后对其进行管理。我们在 Workers 中实现了 Timeout 类来提供此功能,让您可以根据需要清除或重新启动计时器。

控制台

node:console 模块提供了一组与标准 console 全局对象类似的控制台日志记录 API,但额外增加了一些功能。我们实现的 node:console 模块,是对 Workers 中已有的 globalThis.console 的一个轻量级封装。

如何启用 Node.js 兼容性功能

要在您的 Workers 中整体启用 Node.js 兼容功能,您可以在 wrangler.jsonc or wrangler.toml 配置文件中设置 nodejs_compat兼容性标志。如果您没有使用 Wrangler,也可以通过 Cloudflare 控制台或 API 来设置该标志。

图4

这里的兼容日期非常关键 - 将其更新为最新的日期,您就能始终使用到最新、最强大的功能。

nodejs_compat 标志是一个综合性标志,能一次性启用所有 Node.js 兼容性功能。这是启用 Node.js 兼容性的推荐方式,因为它能确保所有功能都可用且彼此无缝协作。不过,如果您更倾向于单独控制,也可以通过各自对应的兼容性标志,逐个启用或禁用某些功能。

图5

通过将这些功能分开,您可以更精细地控制哪些 Node.js API 可以在您的 Workers 中使用。最初,我们是将这些功能统一放在一个 nodejs_compat 标志下逐步推出的,但我们很快意识到,有些用户会根据某些模块和 API 是否存在来进行功能检测,而如果一次性启用所有功能,就有可能破坏一些现有的 Workers。那些手动检查这些 API 是否存在的用户,可以通过选择不启用特定 API 来确保新变更不会影响他们的 Workers:图6

不过,为了简单起见,我们建议先开启 nodejs_compat 标志,这样会启用所有兼容功能。如果后续有需要,您也可以随时单独禁用某些功能。启用额外功能并不会带来任何性能上的影响。

处理已停用的 API

Node.js 与 Workers 之间的一个重要区别在于:Node.js 有一套明确的长期支持 (LTS) 计划,这使得它可以在特定的时间点进行不兼容的变更。更具体地说,当某些 API 或功能到达其生命周期终点 (EOL) 时,Node.js 是可以将其移除的。然而,在 Workers 平台上,我们有一条明确的原则:一旦某个 Worker 被部署,它就将永久以部署时的状态持续运行,只要兼容日期没有改变,就不会发生任何不兼容的变更。这就意味着,我们不能像 Node.js 那样,仅仅因为某个 API 在 Node.js 中已经到达 EOL 就直接将其移除,因为这会导致现有的 Workers 出现运行错误。为了解决这个问题,我们引入了一组新的兼容性标志,允许用户指定他们不希望 nodejs_compat 功能包含那些已经 EOL 的 API。这些标志基于已删除 API 的 Node.js 主要版本:

remove_nodejs_compat_eol 标记将删除截至您当前兼容性日期为止所有已达到 EOL 的 API:图7

remove_nodejs_compat_eol_v22 标志将移除所有在 Node.js v22 版本中达到 EOL 的 API。当您使用 removenodejs_compat_eol 功能时,如果将兼容性日期设置为晚于 Node.js v22 的 EOL 日期(2027 年 4 月 30 日),该标志将会自动启用。

remove_nodejs_compat_eol_v23 标志将移除所有在 Node.js v23 版本中达到 EOL 的 API。当您使用 removenodejs_compat_eol 功能时,如果将兼容性日期设置为晚于 Node.js v24 的 EOL 日期(2028 年 4 月 30 日),该标志将会自动启用。

remove_nodejs_compat_eol_v24 标志将移除所有在 Node.js v24 版本中达到 EOL 的 API。当您使用 removenodejs_compat_eol 功能时,如果将兼容性日期设置为晚于 Node.js v24 的 EOL 日期(2028 年 4 月 30 日),该标志将会自动启用。

如果您查看 remove_nodejs_compat_eol_v23 的日期,会发现它与 remove_nodejs_compat_eol_v24 的日期相同。这并非笔误!Node.js v23 并非长期支持 (LTS) 版本,因此其支持周期非常短暂。该版本于 2023 年 10 月发布,2024 年 5 月就达到了生命周期终点 (EOL)。基于此,我们决定将非长期支持版本的生命末期处理合并至下一个长期支持版本中。这意味着,当您将兼容性日期设置为晚于 Node.js v24 的 EOL 日期时,您实际上也选择不再使用 Node.js v23 中已到达 EOL 的 API。需要特别说明的是,这些标志不会自动启用,只有当您的兼容性日期设置为晚于相关 Node.js 版本的 EOL 日期时,它们才会生效。这样能确保现有 Workers 有充足的时间在 API 被移除前完成迁移,或者您也可以选择通过使用 add_nodejs_compat_eol_v24 等反向兼容标志,无限期地继续使用旧版 API。

回馈社区

我们一直在进行的另一项重要工作是将 Cloudflare 的投入重新扩展到整个 Node.js 生态系统。目前,Workers 运行时团队的五名成员(另加一名实习生)正在 GitHub 上积极为 Node.js 项目做出贡献,其中两名成员是 Node.js 技术指导委员会的成员。虽然我们做出了许多新功能贡献,例如 Web 平台标准 URLPattern API 的实现和加密操作的改进,但我们的主要重点是提升其他运行时与 Node.js 的互操作性和兼容性,修复关键错误并提升性能。随着我们继续加大对 Node.js 兼容性的投入,我们也将持续加大对该项目及整个生态系统的贡献力度。

图8

Cloudflare 通过与 OpenJS Foundation 的持续战略合作关系,将继续为 Node.js 项目提供关键基础设施支持,让该项目能够免费使用 Cloudflare 提供的各类服务,包括 Workers、R2、DNS 等。

试试看!

我们在 Workers 中实现 Node.js 兼容性的愿景,不仅仅在于逐个实现单个 API,而是要打造一个全面的平台,让开发者能够在 Workers 环境中无缝运行现有的 Node.js 代码。这不仅包括实现这些 API 本身,还意味着要确保它们能够协同工作、和谐共存,并且能够与 Workers 平台的独特特性良好集成。

在某些情况下,比如对于 node:fs 和 node:crypto 模块,我们不得不实现一些 Workers 原本并不具备的全新能力,并且是在原生运行时层面完成的。这使得我们能够根据 Workers 环境的独特特性来定制这些实现,从而同时保证性能与安全性。

而且我们的工作还没有结束。我们正在持续推进更多 Node.js API 的实现,同时也在不断提升现有实现的性能与兼容性。我们也积极与社区互动,了解大家的需求和优先级,并收集对我们实现的反馈意见。如果您希望看到某些特定的 Node.js API 或 npm 包能够在 Workers 中得到支持,请告诉我们!如果您在使用过程中遇到任何问题或错误,请在我们的 GitHub 仓库上提交反馈。虽然我们可能无法实现每一个 Node.js API,也无法在每种情况下都完全匹配 Node.js 的行为,但我们致力于提供一个强大且全面的 Node.js 兼容层,以满足社区的需求。

本文中介绍的所有 Node.js 兼容性功能现已正式推出。如需开始使用,您只需在 wrangler.toml 或 wrangler.jsonc 文件中启用 nodejs_compat 兼容性标志,或者通过 Cloudflare 仪表板或 API 进行设置。设置完成后,您就可以立即在 Workers 应用程序中使用 Node.js API 了。

Cloudflare 保护整个企业网络,帮助客户高效构建互联网规模的应用程序,加速任何网站或互联网应用程序,抵御 DDoS 攻击,防止黑客入侵,并能协助您实现 Zero Trust 的部署与实施。

从任何设备访问 1.1.1.1,使用我们的免费应用加速和保护您的互联网。

立即联系我们,获取更多相关信息http://t.cn/A6Tx4yTT

#Cloudflare##Node.js#

发布于 北京