Da ich immer wieder versuche, mich daran zu erinnern, wie man dieses verdammte Codeschnipsel schreibt, habe ich beschlossen, ein einfaches Modul dafür zu erstellen. Es hat ein bisschen gedauert, bis es funktionierte, da der Zugriff auf die Modulinformationen des Aufrufers nicht einfach ist, aber es hat Spaß gemacht, zu sehen, wie es gemacht werden kann.
Die Idee ist also, ein Modul aufzurufen und es zu fragen, ob das aufrufende Modul das Hauptmodul ist. Wir müssen das Modul der aufrufenden Funktion herausfinden. Mein erster Ansatz war eine Variation der akzeptierten Antwort:
module.exports = function () {
return require.main === module.parent;
};
Aber das ist keine Garantie für einen Erfolg. module.parent
zeigt auf das Modul, das geladen uns in die Erinnerung, nicht derjenige, der uns ruft. Wenn es das aufrufende Modul ist, das dieses Hilfsmodul in den Speicher geladen hat, ist alles in Ordnung. Aber wenn nicht, wird es nicht funktionieren. Wir müssen also etwas anderes versuchen. Meine Lösung bestand darin, einen Stack-Trace zu erstellen und daraus den Namen des aufrufenden Moduls zu ermitteln:
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;
};
Speichern Sie dies als is-main-module.js
und jetzt können Sie es tun:
const isMainModule = require("./is-main-module");
if (isMainModule()) {
console.info("called directly");
} else {
console.info("required as a module");
}
Das ist leichter zu merken.