2011-10-01 2 views
13

Przepraszam, jeśli jest to głupie pytanie, ale jeśli stworzę 2 moduły, które wymagają ("http") i moją główną aplikację, która wymaga obu modułów, lub wymaga modułów, które z kolei wymagają obu modułów, a jednocześnie wymagają "http" dla do własnych celów, czy mam do czynienia z trzema instancjami modułu http, z których każdy jest zamknięty w ramach innego zamknięcia, czy też węzeł przepisuje coś, aby tego uniknąć?moduły nodejs i powielanie? Jeśli aplikacja używa dwóch modułów, które wymagają wspólnego modułu, czy optymalizuje węzeł, aby zapobiec dwukrotnemu załadowaniu tego samego kodu?

Innymi słowy, muszę skończyć z aplikacji, która posiada:

// 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 ... */ } 

Gdybym również użyć proxy1 niezależnie, ma sens, aby mieć go jako moduł, ale nawet małego projektu może to prowadzić do wielu modułów, które wszystkie wymagają kilku podstawowych modułów, szczególnie http i fs

Odpowiedz

13

Przeczytaj, jak ładuje się moduł Node.js caches modules. W twoim przykładzie instancja "http" będzie taka sama we wszystkich twoich modułach.

Należy jednak pamiętać, że moduły są buforowane na podstawie rozwiązanej nazwy pliku. Jeśli potrzebujesz wbudowanego modułu takiego jak "http", możesz być pewien, że otrzymujesz ten sam obiekt modułu we wszystkich kodach. Ale pakiety stron trzecich niekoniecznie zachowują się w ten sposób. Na przykład, jeśli potrzebujesz "express" i "mime", obiekt modułu "mime", który otrzymasz, będzie, jak sądzę, różny od tego, który jest używany wewnątrz ekspresu. Powodem jest to, że ekspresuje statki z własnym zbiorem plików modułów w jego podkatalogu node_modules, podczas gdy będziesz musiał zainstalować i załadował swoją własną kopię, prawdopodobnie w swoim module your_project/node_modules gdzieś

Powiązane problemy