内容提要
Cloudflare宣布改进了Workers和Pages的Node.js兼容性,允许用户使用更多的NPM包和JavaScript生态系统。新的兼容性结合了以前的努力的最佳特性,允许在Workers上使用更多的Node.js API。用户可以通过在wrangler.toml中添加标志并使用Wrangler部署他们的Worker来尝试它。改进的兼容性将很快成为所有启用了现有兼容性标志的Workers的默认设置。Cloudflare Workers运行在一个名为workerd的JavaScript/Wasm运行时上,该运行时旨在运行不受信任的代码并使用Web标准API。新的方法在Workers运行时中直接实现了一部分Node.js API,并为其他Node.js API提供了polyfills。用户还可以使用模块别名来实现缺失的API。Cloudflare正在积极为unenv项目做出贡献,该项目根据使用的API和目标运行时添加必要的polyfills。
延伸解读
混合模型如何提升兼容性
新方法结合了原生实现和polyfills:一部分Node.js API(如Buffer、AsyncLocalStorage、Crypto)直接由workerd运行时用C++实现,性能更高;其余API通过unenv提供polyfills。同时不再强制使用node:前缀,使得许多原本因导入方式不兼容的NPM包(如pg、body-parser)现在可以加载。这种混合模型旨在兼顾性能与兼容性。
按需polyfill减小Worker体积
启用nodejs_compat_v2后,Wrangler只会为你的Worker或其依赖实际使用的Node.js API添加polyfills,而不是像旧的node_compat=true那样为所有可polyfill的API都注入代码。这有助于控制Worker体积,避免不必要的代码膨胀,对部署和冷启动可能有积极影响。
模块别名作为缺失API的补充方案
对于尚未原生实现或polyfill的Node.js API,你可以通过wrangler.toml中的[alias]配置,将模块指向自定义实现。例如,将fs别名到自己的polyfill文件,或把node-fetch别名到Workers内置的fetch。这为特定依赖提供了灵活的手动适配途径,但需要自行确保实现正确。
注意默认行为变更的时间点
Cloudflare计划在2024年9月23日将新的Node.js兼容性行为设为默认,适用于所有已启用nodejs_compat标志且兼容日期在该日或之后的Worker。届时无需额外设置nodejs_compat_v2标志。开发者应关注这一变更,并适时更新compatibility_date以适配新行为。
Q&A
Cloudflare Workers的新Node.js兼容性有什么改进?
Cloudflare Workers的新Node.js兼容性允许使用更多的NPM包和Node.js API,包括async_hooks、buffer、dns等,且不再需要node:前缀。
如何在Cloudflare Workers中启用新的Node.js兼容性?
用户可以通过在wrangler.toml中添加compatibility_flags = ['nodejs_compat_v2']来启用新的Node.js兼容性。
Cloudflare Workers的运行时workerd与Node.js有什么不同?
workerd是一个开源的JavaScript/Wasm运行时,旨在运行不受信任的代码,而Node.js主要用于直接在主机操作系统上运行服务。
Cloudflare如何解决Node.js API的缺失问题?
Cloudflare通过提供polyfills和模块别名来解决Node.js API的缺失问题,允许用户实现缺失的功能。
Cloudflare Workers支持哪些流行的NPM包?
Cloudflare Workers支持的流行NPM包包括body-parser、jsonwebtoken、pg等。
Cloudflare计划何时将新的Node.js兼容性设为默认设置?
Cloudflare计划在2024年9月23日将新的Node.js兼容性设为默认设置。