Node.js,require.main === module

时间:2017-07-17 05:53:31

标签: node.js

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

  

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

我想问一下这里的main是什么,我在源代码中找不到这个main的定义,任何人都可以帮忙,谢谢!

2 个答案:

答案 0 :(得分:24)

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是当前模块,那么当前模块是从命令行加载的内容。

设置该属性的代码在此处:https://github.com/nodejs/node/blob/master/lib/internal/modules/cjs/helpers.js#L44

答案 1 :(得分:6)

在Node.js上运行ECMAScript Modules时,require.main不可用。从Node 13.9.0开始,没有一种简洁的方法可以确定一个模块是直接运行还是由另一个模块导入。将来可能会使用import.meta.main值进行这种检查(如果您认为合理,请对the modules issue进行注释)。

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

import { fileURLToPath } from 'url';
import process from 'process';

if (process.argv[1] === fileURLToPath(import.meta.url)) {
  // The script was run directly.
}

这不能处理在没有扩展名.js的情况下调用脚本的情况(例如,node script而不是node script.js)。为了处理这种情况,可以从import.meta.urlprocess.argv[1]处修剪所有扩展名。

es-main package(注意:我是作者)提供了一种检查ES模块是否直接运行的方法,并考虑了ES模块可以运行的不同方式(带有或不带有扩展名)。

import esMain from 'es-main';

if (esMain(import.meta)) {
  // The script was run directly.
}