Para un proyecto de Node.js en el que he estado trabajando desde que era adolescente con una gran cantidad de archivos diferentes, tengo un montón de objetos que se declaran e inicializan en index.js . Todas mis llamadas a funciones comienzan aquí también.
Para asegurarme de que otros archivos puedan acceder a estos objetos si es necesario, los he estado pasando como parámetros para cada función principal, que ahora que lo reconsidero, parece muy ineficiente: estos objetos nunca se modifican y serán los mismos cada vez que las funciones se llaman de todos modos.
En lugar de pasar estos objetos de uso frecuente como parámetros cada vez, ¿podría hacerlo para poder acceder a ellos a pedido desde cualquiera de los archivos del proyecto? Si lo deja más claro, en su mayoría son referencias a una base de datos, por lo que no cambian.
Lo que ya consideré:
index.js : exports.getClient = function() { return client; }; Esto no funcionó para mí, porque si uso require('./index.js') en cualquier archivo desde donde quiero acceder al client , se inicializará index.js nuevamente, lo que resultará en oyentes dobles y demás.index.js al inicio. Entonces no hay problema cuando necesito ese archivo, porque eso no llamaría a la inicialización por segunda vez. Sin embargo, si es posible, prefiero mantener la inicialización de estos objetos en index.js . Ahora que lo pienso, no sé si dos archivos que se llaman entre sí harían que se ejecutaran continuamente entre sí en primer lugar: solo estaba ejecutando un archivo específico que requería (y, por lo tanto, ejecutaba) index.js durante la prueba en lugar de todo. Probaré esto después de dormir y publicaré una edición, pero aún publicaré esto por ahora.
Ejemplo de mi código:
// index.js const client = new Client(); const db = initialiseDb(); const dbDoc1 = db.doc('1'); const dbDoc2 = db.doc('2'); const dbDoc3 = db.doc('3'); client.on('event', (data) => { require('./someFile').someMethod(data, client, dbDoc1, dbDoc2, dbDoc3); } Entonces, en lugar de escribir require('./someFile').someMethod(data, client, dbDoc1, dbDoc2, dbDoc3); , prefiero usar require('./someFile').someMethod(data); y simplemente obtenga cualquiera de los objetos genéricos más adelante en caso de que someMethod() termine necesitándolos. Espero que haya alguna manera limpia de lograr esto.
Muy bien, parece que mi segunda solución funcionaría después de todo. Lo que me preocupaba pero no conocía la palabra eran las dependencias circulares . Resulta que Node.js los maneja bastante bien y solo requiere importar un archivo una vez, por lo que no se ejecuta nuevamente si un archivo es ejecutado por un archivo que ya lo requiere.
Probado así:
// test1.js function callTest1() { console.log('test1.js checking in: ' + Date.now()); } exports.callTest = callTest1; console.log('test1.js is executing'); const test2 = require('./test2'); test2.callTest(); // test2.js function callTest2() { console.log('test2.js checking in: ' + Date.now()); } exports.callTest = callTest2; console.log('test2.js is executing'); const test1 = require('./test1'); test1.callTest(); Resultado al ejecutar test1.js :
test1.js is executing test2.js is executing test1.js checking in: 1643405381177 test2.js checking in: 1643405381178Lo que pasa es lo siguiente:
test1.js define callTest1() y lo agrega a su module.exportstest1.js registra test1.js is executingtest1.js requiere test2.js , que ahora se ejecutatest2.js define callTest2() y lo agrega a su module.exportstest2.js registra test2.js is executingtest2.js requiere test1.js , pero ya se ejecutó, así que esto no volverá a sucedertest2.js llama a test1.callTest() , que registra el registro test1.js checking in: 1643405381177test1.js termina de ejecutar test2.jstest1.js llama a test2.callTest() , que registra el registro test2.js checking in: 1643405381178 Entonces, parece que puedo colocar mis 'captadores' en mi archivo index.js . Solo tendré que tener en cuenta el orden en que se cargan los archivos, por lo que no necesito index.js antes de agregar sus getters a module.exports . Dejaré esta pregunta sin respuesta por ahora, en caso de que alguien aparezca con una solución más limpia.