Node.js:检查ESM模块是否为 "main"的方法

250 阅读1分钟

一个ESM模块可以以两种方式使用:

  1. 它可以作为一个库,其他模块可以从中导入数值。
  2. 它可以作为我们通过Node.js运行的脚本--例如,从命令行中。在这种情况下,它被称为主模块

如果我们想让一个模块以两种方式使用,我们需要一种方法来检查当前模块是否是主模块,因为只有这样我们才能执行脚本功能。在这篇博文中,我们学习如何进行这种检查。

判断一个CommonJS模块是否是主模块

对于CommonJS,我们可以使用以下模式来检测当前模块是否是入口(来源:Node.js文档)。

判断一个ESM模块是否是main

到目前为止,ESM模块还没有简单的内置方法来检查一个模块是否是main。相反,我们必须使用下面的变通方法(基于Rich Harris的一条推文)。

解释一下:

  • import.meta.url包含当前执行的ESM模块的URL。

  • 如果我们确信我们的代码总是在本地运行(这在将来可能会变得不那么常见),我们可以省略A行的检查。如果我们这样做了,代码没有在本地运行,至少我们会得到一个异常(而不是一个无声的失败)--感谢url.fileURLToPath() (见下一项)。

  • 我们使用url.fileURLToPath() ,将URL转换为本地路径。如果协议不是file: ,这个函数会抛出一个异常。

  • process.argv[1] 包含初始模块的路径。B行的比较是有效的,因为这个值总是一个绝对路径--Node.js对它的设置如下(源代码)。

    process.argv[1] = path.resolve(process.argv[1]);