Al igual que en Python, siempre encuentro tratando de recordar cómo escribir este maldito fragmento de código. Entonces decidí crear un módulo simple para eso. Me tomó un poco desarrollar ya que acceder a la información del módulo del llamante no es directo, pero fue divertido ver cómo se podía hacer.
Así que la idea es llamar a un módulo y preguntar si el módulo de la persona que llama es el principal. Tenemos que descubrir el módulo de la función de llamada. Mi primer enfoque fue una variación de la respuesta aceptada:
module.exports = function() {
return require.main === module.parent;
};
Pero eso no está garantizado para funcionar. module.parent
apunta al módulo que cargó en la memoria, no en el que nos está llamando. Si fue el módulo de llamadas que cargó este módulo auxiliar en la memoria, está bien. Pero si no fue así, estamos indefensos. Entonces tenemos que intentar algo más. Mi solución fue generar un seguimiento de pila y obtener el nombre del módulo de la persona que llama desde allí:
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;
};
Ahora podemos hacer:
if (require("./is-main-module")()) { // notice the `()` at the end
// do something
} else {
// do something else
}
O más legible:
const isMainModule = require("./is-main-module");
if (isMainModule()) {
// do something
} else {
// do something else
}
imposible de olvidar :-)
Posible duplicado de [node.js equivalente de python si \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _'] (http://stackoverflow.com/questions/4981891/node-js-equivalent-of-pythons-if-name-main) – GingerPlusPlus