内容提要
Node.js 20 版本中,npm 10 已回溯至所有发布线,包含 npm v10.2.3。新 API register 允许指定文件导出模块自定义钩子,并在主线程与钩子线程之间传递数据。引入了 import.meta.resolve 方法以获取绝对 URL,增强了与浏览器的兼容性。此外,--experimental-default-type 标志可切换默认模块系统,影响隐式 CommonJS 的解析。
延伸解读
npm 10 回溯至所有发布线的意义
文章指出,npm 10 在 Node.js 20 中经过两个月测试后,已回溯至所有发布线,包括 Node.js 18.19.0。这意味着使用长期支持版的开发者也能获得 npm v10.2.3 的支持。对于依赖稳定环境的项目,无需升级到 Node.js 20 即可使用新版 npm 的功能,降低了升级风险。
模块自定义钩子的新注册方式
Node.js 18.19.0 引入了 node:module 的 register API,允许指定文件导出模块自定义钩子,并在主线程与钩子线程之间传递数据,包括 MessageChannel 实例。文章建议迁移到使用 --import 配合 register 的方式,以确保钩子在应用代码运行前注册。这为开发者提供了更灵活的模块加载控制。
import.meta.resolve 的兼容性提升
新加入的 import.meta.resolve(specifier) 方法可以获取模块说明符解析后的绝对 URL 字符串,类似于 CommonJS 中的 require.resolve。这一特性使 Node.js 与浏览器及其他服务端运行时保持一致,有助于编写跨环境的 ES 模块代码,减少平台差异带来的适配成本。
--experimental-default-type 的影响范围
该标志可以切换 Node.js 的默认模块系统。已显式定义为 ES 模块或 CommonJS 的输入不受影响,例如通过 package.json 的 type 字段、.mjs/.cjs 扩展名或 --input-type 标志。而当前隐式 CommonJS 的输入,如 --eval 或 STDIN 字符串、无 package.json 时的 .js 文件,在 --experimental-default-type=module 下会被解释为 ES 模块。
Q&A
Node.js 20 版本中 npm 10 的更新内容是什么?
Node.js 20 版本中,npm 10 已回溯至所有发布线,包含 npm v10.2.3。
新引入的 API register 有什么功能?
新 API register 允许指定文件导出模块自定义钩子,并在主线程与钩子线程之间传递数据。
如何使用 import.meta.resolve 方法?
在 ES 模块中,可以使用 import.meta.resolve(specifier) 获取绝对 URL 字符串,类似于 CommonJS 的 require.resolve。
--experimental-default-type 标志的作用是什么?
--experimental-default-type 标志可切换 Node.js 的默认模块系统,影响隐式 CommonJS 的解析。
Node.js 20 版本如何增强与浏览器的兼容性?
通过引入 import.meta.resolve 方法,Node.js 20 版本增强了与浏览器的兼容性。
如何确保自定义钩子在应用代码运行之前注册?
可以使用 --import 选项与 register 结合,确保自定义钩子在任何应用代码运行之前注册。