update tutorial node framework ejemplos actualizar node.js require

node.js - tutorial - npm



Node.JS: Detecta si se llama a través de require o directamente por línea de comando (5)

¿Cómo puedo detectar si mi archivo Node.JS fue llamado usando SH: node path-to-file o JS: require(''path-to-file'') ?

Este es el equivalente de Node.JS a mi pregunta anterior en Perl: ¿Cómo puedo ejecutar mi script de Perl solo si no se cargó con require?


Al igual que en Python, siempre me encuentro tratando de recordar cómo escribir este maldito fragmento de código. Así que decidí crear un módulo simple para ello. Me tomó un poco de desarrollo ya que acceder a la información del módulo de la persona que llama no es directo, pero fue divertido ver cómo se podía hacer.

Entonces, la idea es llamar a un módulo y preguntarle si el módulo que llama es el principal. Tenemos que averiguar 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 trabajar. module.parent apunta al módulo que nos cargó en la memoria, no al que nos llama. Si fue el módulo de llamada el que cargó este módulo auxiliar en la memoria, está bien. Pero si no fue así, estamos indefensos. Así que tenemos que probar 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 :-)


Estaba un poco confundido por la terminología utilizada en la (s) explicación (es). Así que tuve que hacer un par de pruebas rápidas.

Encontré que estos producen los mismos resultados:

var isCLI = !module.parent; var isCLI = require.main === module;

Y para las otras personas confundidas (y para contestar la pregunta directamente):

var isCLI = require.main === module; var wasRequired = !isCLI;


Hay otra forma, ligeramente más corta (no se describe en los documentos mencionados).

var runningAsScript = !module.parent;

En esta publicación del blog describí más detalles sobre cómo funciona todo esto bajo el capó.


Intente esto si está utilizando módulos ES6:

if (process.mainModule.filename === __filename) { console.log(''running as main module'') }