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:
module.exports = function () {
return require.main === module.parent;
};
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:
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;
};
Jetzt können wir tun:
if (require("./is-main-module")()) { // notice the `()` at the end
// do something
} else {
// do something else
}
Oder besser lesbar:
const isMainModule = require("./is-main-module");
if (isMainModule()) {
// do something
} else {
// do something else
}
Unmöglich zu vergessen :-)