Node.JSファイルがSH:node path-to-file
またはJS を使用して呼び出されたかどうかをどのように検出できますか?require('path-to-file')
?
これは、Perlでの前の質問と同等のNode.JSです。requireでロードされなかった場合にのみ、Perlスクリプトを実行するにはどうすればよいですか?
Node.JSファイルがSH:node path-to-file
またはJS を使用して呼び出されたかどうかをどのように検出できますか?require('path-to-file')
?
これは、Perlでの前の質問と同等のNode.JSです。requireでロードされなかった場合にのみ、Perlスクリプトを実行するにはどうすればよいですか?
回答:
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
require()
が、あなたはおそらく実行し、ファイルをインポートするのいずれかでそれを行うことができeval
、その上、または実行してrequire('child_process').exec('node the_file.js')
es-main
パッケージを使用して、モジュールが直接実行されたかどうかを確認できます。
別のわずかに短い方法があります(前述のドキュメントでは概説されていません)。
var runningAsScript = !module.parent;
このすべてが内部でどのように機能するかについては、このブログ投稿で詳しく説明しました。
node script.js
しかし、ではありませんcat script.js | node
。この方法は両方で機能します。
Pythonと同じように、私はいつもこのくだらないコードスニペットの書き方を思い出そうとしています。それで、私はそのための単純なモジュールを作成することにしました。呼び出し元のモジュール情報にアクセスするのは簡単ではないため、開発に少し時間がかかりましたが、それがどのように行われるかを確認するのは楽しかったです。
したがって、アイデアはモジュールを呼び出し、呼び出し元のモジュールがメインモジュールであるかどうかを尋ねることです。呼び出し元関数のモジュールを理解する必要があります。私の最初のアプローチは、受け入れられた答えのバリエーションでした:
module.exports = function () {
return require.main === module.parent;
};
しかし、それが機能するとは限りません。私たちをメモリにロードmodule.parent
したモジュールではなく、私たちを呼び出したモジュールを指します。このヘルパーモジュールをメモリにロードしたのが呼び出し元モジュールである場合は、問題ありません。しかし、そうでなければ、私たちは無力です。だから私たちは何か他のものを試す必要があります。私の解決策は、スタックトレースを生成し、そこから呼び出し元のモジュール名を取得することでした。
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;
};
今私たちはできる:
if (require("./is-main-module")()) { // notice the `()` at the end
// do something
} else {
// do something else
}
またはもっと読みやすい:
const isMainModule = require("./is-main-module");
if (isMainModule()) {
// do something
} else {
// do something else
}
忘れられない :-)
return require.main /*this is undefined if we started node interactively*/ && require.main.filename === callerModuleName;
ES6モジュールを使用している場合は、これを試してください。
if (process.mainModule.filename === __filename) {
console.log('running as main module')
}
process.mainModule
はundefined