一个ESM模块可以以两种方式使用:
- 它可以作为一个库,其他模块可以从中导入数值。
- 它可以作为我们通过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]);