Assim como em Python, sempre me pego tentando lembrar como escrever esse maldito trecho de código. Então, decidi criar um módulo simples para ele. Demorei um pouco para me desenvolver, pois o acesso às informações do módulo do chamador não é direto, mas foi divertido ver como isso poderia ser feito.
Portanto, a idéia é chamar um módulo e perguntar se o módulo chamador é o principal. Temos que descobrir o módulo da função de chamada. Minha primeira abordagem foi uma variação da resposta aceita:
module.exports = function () {
return require.main === module.parent;
};
Mas isso não garante que funcione. module.parent
aponta para o módulo que nos carregou na memória, não aquele que está nos chamando. Se foi o módulo chamador que carregou esse módulo auxiliar na memória, tudo bem. Mas se não fosse, não teríamos como. Então, precisamos tentar outra coisa. Minha solução foi gerar um rastreamento de pilha e obter o nome do módulo do chamador a partir daí:
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;
};
Agora podemos fazer:
if (require("./is-main-module")()) { // notice the `()` at the end
// do something
} else {
// do something else
}
Ou mais legível:
const isMainModule = require("./is-main-module");
if (isMainModule()) {
// do something
} else {
// do something else
}
Impossível de esquecer :-)