2012-08-21 9 views
6

estoy empezando a construir mi proyecto en NodeJS y me preguntaba¿NodeJS reutiliza módulos ya cargados y comparte sus valores?

módulos
  • ¿El NodeJS ya cargado para su reutilización módulos que requieren el mismo módulo?
  • ¿Los módulos mantienen el mismo "estado" entre los módulos que los requieren?
  • ¿Cuál es la trampa si sucede una o ambas cosas? Estoy mirando a la cara un problema similar a loops y setTimeout y async código?

Actualmente he probado con 4 archivos

  • common.js

    var i = 0; 
    
    function add(v){i += v;} 
    function view(){console.log(i);} 
    
    module.exports = { 
        add : add, 
        view : view 
    } 
    
  • a.js y b.js

    exports.common = require('./common.js'); 
    
  • server.js

    var a = require('./a.js'), 
        b = require('./b.js'); 
    
    function start(){ 
        http.createServer(function (req, res) { 
    
         a.common.add(2); 
         a.common.view(); 
    
         b.common.add(4); 
         b.common.view(); 
    
         a.common.view(); 
    
    
         res.writeHead(200, {'Content-Type': 'text/plain'}); 
         res.end('Hello World\n'); 
        }).listen(config.port, config.address || '127.0.0.1'); 
        console.log('Server running'); 
    } 
    

El resultado me da un resultado sugerente que lo hace:

2 - view() via a.js on favicon request 
6 - view() via b.js on favicon request 
6 - view() via a.js on favicon request 
8 - view() via a.js 
12 - view() via b.js 
12 - view() via a.js 

Parece que no parecen compartir el módulo incluso si es requerido por dos separados módulos, e incluso mantiene el estado en todos los módulos y en las solicitudes

+0

¿De dónde vienen 'foo' y' bar'? – Amberlamps

+0

@Amberlamps editado. Usé 'foo' y' bar' en mi código. – Joseph

+0

sí, los módulos cargados están en caché, su estado es. –

Respuesta

5

Node.js almacena en caché los módulos por obvias razones de rendimiento.

Declaración de the Node.js website:

módulos se almacenan en caché después de la primera vez que se cargan. Esto significa (entre otras cosas) que cada llamada a require('foo') obtendrá exactamente el mismo objeto devuelto, si se resolvería en el mismo archivo.

Las llamadas múltiples al require('foo') pueden no causar que el código del módulo se ejecute varias veces. Esta es una característica importante. Con él, se pueden devolver objetos "parcialmente hechos", permitiendo así que las dependencias transitivas se carguen incluso cuando causarían ciclos. Si desea que un módulo ejecute código varias veces, exporte una función y llame a esa función.

2

Sí, todos los módulos se almacenan en caché después de la primera vez que están cargados Puede leer más sobre el almacenamiento en caché de módulos en official node.js docs.

Cuestiones relacionadas