Wie kann ich feststellen, ob meine Node.JS-Datei mit SH: node path-to-file
oder JS: aufgerufen wurde require('path-to-file')
?
Dies ist das Node.JS-Äquivalent zu meiner vorherigen Frage in Perl: Wie kann ich mein Perl-Skript nur ausführen, wenn es nicht mit require geladen wurde?
Antworten:
Die Dokumentation hierzu finden Sie hier: https://nodejs.org/docs/latest/api/modules.html#modules_accessing_the_main_module
quelle
require()
, aber Sie könnten es vielleicht tun, indem Sie entweder die Datei importieren und dann darauf laufeneval
lassen oder indem Sierequire('child_process').exec('node the_file.js')
es-main
Paket überprüfen, ob ein Modul direkt ausgeführt wurde.Es gibt einen anderen, etwas kürzeren Weg (in den genannten Dokumenten nicht beschrieben).
var runningAsScript = !module.parent;
In diesem Blog-Beitrag habe ich weitere Details dazu beschrieben, wie dies alles unter der Haube funktioniert .
quelle
node script.js
aber nichtcat script.js | node
. Dieser Weg funktioniert für beide.Ich war ein wenig verwirrt von der Terminologie, die in den Erklärungen verwendet wurde. Also musste ich ein paar schnelle Tests machen.
Ich fand heraus, dass diese die gleichen Ergebnisse liefern:
Und für die anderen verwirrten Menschen (und um die Frage direkt zu beantworten):
quelle
Genau wie in Python versuche ich mich immer daran zu erinnern, wie man dieses verdammte Code-Snippet schreibt. Also habe ich beschlossen, ein einfaches Modul dafür zu erstellen. Die Entwicklung hat ein wenig gedauert, da der Zugriff auf die Modulinformationen des Anrufers nicht einfach ist, aber es hat Spaß gemacht zu sehen, wie dies getan werden kann.
Die Idee ist also, ein Modul aufzurufen und zu fragen, ob das Anrufermodul das Hauptmodul ist. Wir müssen das Modul der Aufruferfunktion herausfinden. Mein erster Ansatz war eine Variation der akzeptierten Antwort:
Aber das funktioniert garantiert nicht.
module.parent
zeigt auf das Modul, das uns in den Speicher geladen hat, nicht auf das, das uns anruft. Wenn es das Anrufermodul war, das dieses Hilfsmodul in den Speicher geladen hat, ist das in Ordnung. Aber wenn nicht, sind wir hilflos. Also müssen wir etwas anderes ausprobieren. Meine Lösung bestand darin, einen Stack-Trace zu generieren und den Modulnamen des Aufrufers von dort abzurufen:Jetzt können wir tun:
Oder besser lesbar:
Unmöglich zu vergessen :-)
quelle
return require.main /*this is undefined if we started node interactively*/ && require.main.filename === callerModuleName;
Versuchen Sie dies, wenn Sie ES6-Module verwenden:
quelle
process.mainModule
istundefined