Node.js,require.main===模块

Node.js,require.main===模块,node.js,Node.js,在Node.JS文档中,我发现一句话 直接从Node.js运行文件时,require.main设置为 模块。这意味着可以通过测试require.main===module来确定文件是否已直接运行 我想问一下这里的main是什么,我在源代码中找不到这个main的定义,有人能帮忙吗,谢谢 require是一个函数.main是该函数的属性,因此您可以引用require.main。您所引用的文档的这一部分说明您可以编写如下代码: if (require.main === module) { /

在Node.JS文档中,我发现一句话

直接从Node.js运行文件时,
require.main
设置为 模块。这意味着可以通过测试
require.main===module
来确定文件是否已直接运行


我想问一下这里的
main
是什么,我在源代码中找不到这个
main
的定义,有人能帮忙吗,谢谢

require
是一个函数
.main
是该函数的属性,因此您可以引用
require.main
。您所引用的文档的这一部分说明您可以编写如下代码:

if (require.main === module) {
     // this module was run directly from the command line as in node xxx.js
} else {
     // this module was not run directly from the command line and probably loaded by something else
}
module
因为上面的代码是传递给node.js加载的所有模块的变量,所以代码基本上表示如果
require.main
是当前模块,那么当前模块就是从命令行加载的模块

设置该属性的代码如下:。

使用Node.js运行时,
require.main
不可用。从节点13.9.0开始,没有一种简洁的方法来确定一个模块是直接运行的还是由另一个模块导入的。
import.meta.main
值可能允许将来进行这样的检查(如果您认为这有意义,请评论)

作为一种解决方法,可以通过比较
import.meta.url
值与
process.argv[1]
来检查当前ES模块是否直接运行。例如:

从“url”导入{fileURLToPath};
从“过程”导入过程;
if(process.argv[1]==fileURLToPath(import.meta.url)){
//脚本是直接运行的。
}
这不处理在没有扩展名
.js
的情况下调用脚本的情况(例如,
node script
而不是
node script.js
)。为了处理这种情况,可以从
import.meta.url
process.argv[1]
中删除任何扩展名

(注意:我是作者)提供了一种检查ES模块是否直接运行的方法,说明了它可以以不同的方式运行(有或没有扩展)

从“es main”导入esMain;
if(esMain(import.meta)){
//脚本是直接运行的。
}

谢谢您的回答,但我在Module.js文件的Module.prototype.require中找不到.main属性。我只是好奇源代码在哪里定义.main属性。@jfriend00指向代码的链接返回404。你能更新链接吗?thanks@NelsonTeixeira-更新了问题中的链接。这样的链接特定于Github中nodejs代码的一般组织,并且会随着时间的推移而改变。在本例中,当添加ES6加载程序的代码时,模块加载代码在存储库中重新组织,这是导致此源文件在存储库中移动的原因。我理解,但认为这很重要,并且认为您对节点的源代码有深入的了解,以便使其成为一项简单的任务。我的假设是正确的谢谢。如何在es6模块中检测相同的信息?这些信息很难找到!