Proprio come in Python, ho sempre trovato sto cercando di ricordare come scrivere questo dannato frammento di codice. Così ho deciso di creare un modulo semplice per questo. Mi ci è voluto un po 'di tempo per sviluppare l'accesso alle informazioni sul modulo del chiamante, ma è stato divertente vedere come sarebbe stato possibile.
Quindi l'idea è di chiamare un modulo e chiedere se il modulo chiamante è quello principale. Dobbiamo capire il modulo della funzione chiamante. Il mio primo approccio era una variazione della risposta accettata:
module.exports = function() {
return require.main === module.parent;
};
Ma non è garantito che funzioni. module.parent
punti al modulo che ha caricato in memoria, non quello che ci chiama. Se era il modulo chiamante che ha caricato questo modulo helper in memoria, va bene. Ma se non lo fosse, siamo indifesi. Quindi dobbiamo provare qualcos'altro. La mia soluzione era di generare una traccia dello stack e ottenere il nome del modulo del chiamante da lì:
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;
};
Ora possiamo fare:
if (require("./is-main-module")()) { // notice the `()` at the end
// do something
} else {
// do something else
}
O più leggibile:
const isMainModule = require("./is-main-module");
if (isMainModule()) {
// do something
} else {
// do something else
}
impossibile da dimenticare :-)
fonte
2017-10-26 20:10:34
Possibile duplicato di [node.js equivalente di python se \ _ \ _ nome \ _ \ _== '\ _ \ _ principale \ _ \ _'] (http://stackoverflow.com/questions/4981891/node-js-equivalent-of-pythons-if-name-main) – GingerPlusPlus