我如何检测我的node .JS文件是否被调用使用SH:node path-to file或JS:require('path-to file')?
这是Node.JS等价于我之前在Perl中的问题:我怎么能运行我的Perl脚本,如果它没有加载require?
我如何检测我的node .JS文件是否被调用使用SH:node path-to file或JS:require('path-to file')?
这是Node.JS等价于我之前在Perl中的问题:我怎么能运行我的Perl脚本,如果它没有加载require?
当前回答
如果你正在使用ES6模块,试试这个:
if (process.mainModule.filename === __filename) {
console.log('running as main module')
}
其他回答
对于那些使用ES模块(和Node 10.12+)的用户,你可以使用import.meta.url:
import path from 'path';
import { fileURLToPath } from 'url'
const nodePath = path.resolve(process.argv[1]);
const modulePath = path.resolve(fileURLToPath(import.meta.url))
const isRunningDirectlyViaCLI = nodePath === modulePath
比如require。主要模块。parent和__dirname/__filename在ESM中不可用。
注意:如果使用ESLint,它可能会阻塞在这个语法上,在这种情况下,你需要更新到ESLint ^7.2.0,并把你的ecmaVersion调到11(2020)。
更多信息:进程。argv, import.meta.url
如果你正在使用ES6模块,试试这个:
if (process.mainModule.filename === __filename) {
console.log('running as main module')
}
if (require.main === module) {
console.log('called directly');
} else {
console.log('required as a module');
}
请在这里查看相关文档:https://nodejs.org/docs/latest/api/modules.html#modules_accessing_the_main_module
我总是发现自己试图回忆如何编写这个该死的代码片段,所以我决定为它创建一个简单的模块。我花了一点时间让它工作,因为访问调用者的模块信息并不简单,但看到它是如何做到的是很有趣的。
因此,其思想是调用一个模块,并询问调用方模块是否是主模块。我们必须算出调用函数的模块。我的第一个方法是对公认答案的一种变化:
module.exports = function () {
return require.main === module.parent;
};
但这并不一定有效。模块。Parent指向将我们加载到内存中的模块,而不是调用我们的模块。如果是调用方模块将这个helper模块加载到内存中,那么就没问题。但如果不是,它就不会起作用。所以我们得试试别的办法。我的解决方案是生成一个堆栈跟踪,并从那里获得调用者的模块名:
module.exports = function () {
// generate a stack trace
const stack = (new Error()).stack;
// the third line refers to our caller
const stackLine = stack.split("\n")[2];
// extract the module name from that line
const callerModuleName = /\((.*):\d+:\d+\)$/.exec(stackLine)[1];
return require.main.filename === callerModuleName;
};
保存为is-main-module.js,现在你可以这样做:
const isMainModule = require("./is-main-module");
if (isMainModule()) {
console.info("called directly");
} else {
console.info("required as a module");
}
这样更容易记。
还有另一种稍短的方法(没有在提到的文档中列出)。
var runningAsScript = !module.parent;
我在这篇博客文章中概述了更多关于这些工作原理的细节。