Creo para mi proyecto un módulo de registro y en realidad estoy creando una nueva instancia en todos los módulos para permitirles iniciar sesión en cli con la sintaxis correcta, color conf, etc.
Por ejemplo (un ejemplo simplificado)
// index.js const {Log,Ansi} = require("./class/log.js"); const Tool = require("./class/tool.js"); const argv = require("yargs").argv; let log = new Log({ levelIcon:true, powerlineRoot:{ name:"root", backgroundColor:Ansi.BLACK_BRIGHT, text: "myappName" } }); let tool = new Tool(argv.toolName,argv.envName) tool.run().then(() => { log.print("Tool is running","info"); }).catch((err) => { log.print(err,"critical"); }); // tool.js const {Log,Ansi} = require("./log.js"); class Tool { let log = new Log({ levelIcon:true, powerlineRoot:{ name:"root", backgroundColor:Ansi.BLACK_BRIGHT, text: "myappName" } }); run(){ return new Promise((resolve, reject) => { resolve() } } } module.exports = ToolMe pregunto si hay una manera de crear solo una instancia en mi index.js y compartirla con la instancia de módulos como Herramientas. No sé si es posible, pero creo que será menos consumo de memoria compartir una instancia de Log que crear varias.
Espero que mi pregunta sea lo suficientemente clara. No dude en pedirme más información si es necesario
Sí, puedes hacerlo absolutamente. Dado que la entrada es index.js , puede considerar que finalmente se ejecutará como si fuera un solo archivo, en un solo hilo. Puede crear un módulo más logger.js como:
const {Log,Ansi} = require("./class/log.js"); const logger = new Log({ levelIcon:true, powerlineRoot:{ name:"root", backgroundColor:Ansi.BLACK_BRIGHT, text: "myappName" } }); module.exports = logger;Ahora puede simplemente importar el registrador y usarlo como:
const logger = require("./logger") logger.print("hello world!");Como dice @jjsingh, uso una variable global para almacenar el objeto.
No estoy seguro de que sea la mejor manera, pero por el momento resuelve mi problema.
global.log = new Log({ levelIcon:true, powerlineRoot:{ name:"root", color:{ background:Ansi.BLUE_SEA, foreground:Ansi.RED, }, text:global.conf.get("infos").name } });