2011-10-01 6 views
13

Disculpa si esta es una pregunta tonta, pero si creo 2 módulos que requieren ('http') y mi aplicación principal que requiere ambos módulos, o requiere módulos que a su vez requieren ambos módulos, mientras que también requiere 'http' para Para sus propios fines, ¿termino con tres instancias del módulo http, cada una bloqueada dentro del alcance de un cierre diferente, o el nodo reescribe cosas para evitar esto?nodejs modules and duplication? Si una aplicación utiliza dos módulos que requieren un módulo común, ¿optimiza el nodo para evitar cargar el mismo código dos veces?

En otras palabras, no termino con una aplicación que cuenta con:

// main app creates a closure containing a local instance of http, an instance of proxy1 
// and an instance of proxy2, both of which are functions returned from closures that have instances of http in scope 
var http = require('http'), 
    httpProxy1 = require('./proxy1'), 
    httpProxy2 = require('./proxy2'); 

/* ... do stuff with http, using proxy1 or proxy2 where appropriate ... */ 


// proxy1 creates a closure containing a local instance of http and exposes a single public method 
var http = require('http'); 
module.exports = function (foo) { /* ... do stuff with http ... */ } 

// proxy2 creates a closure containing a local instance of http and exposes a single public method 
var http = require('http'); 
module.exports = function (foo) { /* ... do stuff with http that has nothing to do with the stuff proxy1 does ... */ } 

Si también desea utilizar proxy1 forma independiente, tiene sentido tenerlo como un módulo, pero en incluso un pequeño proyecto , esto podría dar lugar a muchos módulos que requieren módulos principales repetidamente, especialmente http y fs

Respuesta

13

Lea cómo el módulo Node.js 'carga caches modules. En su ejemplo, la instancia 'http' será la misma en todos sus módulos.

Pero tenga en cuenta que los módulos se almacenan en caché en función del nombre de archivo resuelto. Cuando se requiere un módulo integrado como 'http', puede estar razonablemente seguro de que está obteniendo el mismo objeto de módulo en todo su código. Pero los paquetes de terceros no necesariamente se comportan de esta manera. Por ejemplo, si necesita 'express' y 'mime', el objeto de módulo 'mime' que obtenga será, creo, diferente del que se usa dentro de express. La razón es que Express se envía con su propio conjunto de archivos de módulo en su subdirectorio node_modules, mientras que usted habrá instalado y cargado su propia copia, probablemente en su your_project/node_modules en algún lugar

Cuestiones relacionadas