2012-01-22 15 views
23

Acabo de empezar a trabajar con nodejs. Me pregunto si hay una forma de "exigir" un archivo solo una vez en una aplicación. Estoy usando un marco de clase para obtener OOPS clásicos en mi proyecto JS. Cada "clase" está contenida en su propio archivo JS. Quiero "requerir" el marco de clase en cada archivo para que puedan funcionar de forma independiente, pero quieren que el código de inicio del marco se ejecute solo una vez.¿Hay alguna manera de "requerir" un archivo JS solo una vez en nodejs?

Puedo usar una bandera para implementar esto por mí mismo, pero una forma integrada sería agradable. Buscar "requerir una vez" me lleva a todas las preguntas relacionadas con PHP.

Respuesta

59

require es siempre "requiere una vez". Después de llamar al require la primera vez, require usa un caché y siempre devolverá el mismo objeto.

Cualquier código ejecutable que flote en el módulo solo se ejecutará una vez.

Por otro lado, si desea ejecutar el código de inicialización varias veces, simplemente inserte ese código en un método exportado.

edición: Lea la sección 'Caché' de http://nodejs.org/docs/latest/api/modules.html#modules

+1

Genial! Gracias por la rápida respuesta. – atlantis

+0

¿Puede explicar o dar un ejemplo cuando dice 'ejecutar código de inicialización varias veces, simplemente arroje ese código en un método exportado' –

+1

@sudo en lugar de dejar el código en el cuerpo del módulo, ponerlo en una función que exporta . Los módulos que requieren su módulo pueden entonces ejecutar esta función para volver a ejecutar el código de inicialización. p. '' 'js var db = connect(); module.exports = db '' ' vs ' '' js module.exports = conectan '' ' Otra forma de pensar es: módulos de nodo son siempre únicos. Su singleton puede exponer un constructor/fábrica para crear instancias. – timoxley

1

Si realmente desea que el código de nivel superior en el módulo (código que no está contenida dentro de los métodos o funciones en el módulo) para ejecutar más de una vez que pueda eliminar es objeto de módulo que se almacena en caché en el objeto require.cache así:

delete require.cache[require.resolve('./mymodule.js')]; 

hacer esto antes de que necesite el módulo por segunda vez.

La mayoría de las veces, aunque probablemente solo desee que el código de nivel superior del módulo se ejecute una vez y en cualquier otro momento que requiera el módulo, solo desea acceder a lo que ese módulo exporta.

var myMod = require("./mymodule.js"); //the first time you require the 
             //mymodule.js module the top level code gets 
             //run and you get the module value returned. 


var myMod = require("./mymodule.js"); //the second time you require the mymodule.js 
             //module you will only get the module value 
             //returned. Obviously the second time you 
             //require the module it will be in another 
             //file than the first one you did it in. 
Cuestiones relacionadas