我们如何重建Cloudflare Workers模块注册表以实现Node.js兼容性

Workers现在默认启用Node.js兼容性,支持高达64兆字节的应用程序,并添加了基于URL的模块注册表,其中包含import.meta、延迟编译、共享代码缓存和更清晰的错误。

Workers现在默认启用Node.js兼容性,支持高达64兆字节的应用程序,并添加了基于URL的模块注册表,其中包含import.meta、延迟编译、共享代码缓存和更清晰的错误。我们在workerd ( Workers运行时的核心开源组件)中重写了模块注册表,使其更快、更符合标准,并与Node.js的模块注册表更紧密地对齐。

在过去的几年中,我们一直在添加对越来越多的Node.js运行时API的支持。Workers运行时现在支持Node.js中您可能希望在无服务器上下文中使用的每个稳定API,并且这些API现在已默认启用,允许您将更大的Node.js应用程序部署到Cloudflare (现在所有计划最高可达64 MiB —我们已取消对压缩捆绑包大小的限制)。

但仅有API兼容性是不够的: Node.js应用程序还取决于运行时如何解析、加载和缓存模块。ESM、CommonJS和WebAssembly是可以在Worker代码中导入的每种类型的模块。运行时中处理所有这些的系统称为模块注册表。您可以立即通过在Worker中启用new_module_registry兼容性标志开始使用它。

启用new_module_registry兼容性标志时: import.meta.url、import.meta.main和import.meta.resolve ()均有效。模块说明符被解析和解析为真实的URL,包括查询字符串和片段。无论您如何访问它们, node: built-ins都会解析为同一个模块实例。导入属性(具有{type: 'json'} )已正确验证。ES模块上的require ()遵循Node.js的require (esm)规则。

错误使用一致的类和消息,无论触发它们的是哪个加载路径。模块在首次导入时会懒惰编译(静态或动态)。WebAssembly模块支持源阶段导入。为了深入了解这个新模块注册表如何与V8的模块API交互,我们在workerd中添加了参考文档,详细介绍了所有内容。