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
}
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.url和process.argv[1]中删除任何扩展名。 es-main package(注意:I am the author)提供了一种检查ES模块是否直接运行的方法,说明了它可以运行的不同方式(有或没有扩展)。
import esMain from 'es-main';
if (esMain(import.meta)) {
// The script was run directly.
}
if(require.main === module) {
// it is the main entry point of the application
// do some stuff here
console.log('i m the entry point of the app')
} else{
// its not the entry point of the app, and it behaves as
// a module
module.exports = (num1, num2) => {
console.log('--sum is:',num1+num2)
}
}
检查上述条件的方法:
node index.js--〉将打印i m the entry point of the app
node -e "require('./index.js')(5,6)"--〉将打印--sum is: 11
4条答案
按热度按时间s3fp2yjn1#
require
是一个函数。.main
是该函数的一个属性,因此您可以引用require.main
。您所引用的文档部分说明您可以编写如下代码:上面代码中的
module
是传递给node.js加载的所有模块的变量,因此代码基本上表示如果require.main
是当前模块,则当前模块是从命令行加载的模块。设置该属性的代码如下:www.example.com网站。https://github.com/nodejs/node/blob/master/lib/internal/modules/cjs/helpers.js#L44.
sy5wg1nm2#
当使用Node.js运行ECMAScript Modules时,
require.main
不可用。从节点13.9.0开始,没有一种简洁的方法来确定一个模块是直接运行的还是由另一个模块导入的。import.meta.main
值可能允许将来进行这样的检查(如果您认为这有意义,请评论the modules issue)。作为一种解决方法,可以通过比较
import.meta.url
值与process.argv[1]
来检查当前ES模块是否直接运行。例如:这不处理在没有
.js
扩展名的情况下调用脚本(例如node script
代替node script.js
)。要处理这种情况,可以从import.meta.url
和process.argv[1]
中删除任何扩展名。es-main
package(注意:I am the author)提供了一种检查ES模块是否直接运行的方法,说明了它可以运行的不同方式(有或没有扩展)。0x6upsns3#
我回答得很晚了,但我把它留在这里供参考。
1.当一个文件是一个程序的入口点时,它就是主模块。例如,
node index.js OR npm start
,index.js
就是主模块&我们应用程序的入口点。1.但是我们可能需要把它作为一个模块来运行,而不是作为一个主模块来运行。如果我们像这样
require
index.js
,就会发生这种情况:node -e "require('./index.js')(5,6)"
我们可以用两种方法检查一个文件是否是主模块。
require.main === module
module.parent === null
假设我们有一个简单的
index.js
文件,当它是主模块时,它是console.log()
,当它不是主模块时,它导出一个求和函数:检查上述条件的方法:
node index.js
--〉将打印i m the entry point of the app
node -e "require('./index.js')(5,6)"
--〉将打印--sum is: 11
aamkag614#
对于ECMAScript模块或扩展名为
.mjs
的文件,我使用它的一个更简单的版本: