модули nodejs и дублирование?Если приложение использует два модуля, для которых требуется общий модуль, оптимизируется ли узел, чтобы предотвратить загрузку одного и того же кода дважды? - PullRequest
13 голосов
/ 01 октября 2011

Извиняюсь, если это глупый вопрос, но если я создаю 2 модуля, для которых требуется ('http') и мое основное приложение, для которого требуются оба модуля, или требуются модули, для которых, в свою очередь, требуются оба модуля, а также для 'http' для своих собственных целей я получаю три экземпляра модуля http, каждый из которых заблокирован в рамках своего замыкания, или перезаписывает узел, чтобы избежать этого?

Другими словами, могу ли я получить приложение, которое имеет:

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

Если я также хочу использовать proxy1 независимо, имеет смысл иметь его в качестве модуля, но даже в небольшом проекте это может привести ко многим модулям, которым все время требуются основные модули, особенно http и fs

1 Ответ

13 голосов
/ 02 октября 2011

Узнайте, как загрузка модуля Node.js кэширует модули . В вашем примере экземпляр http будет одинаковым во всех ваших модулях.

Но учтите, что модули кэшируются на основе разрешенного имени файла. Когда вам требуется встроенный модуль, такой как http, вы можете быть уверены, что вы получаете один и тот же объект модуля во всем своем коде. Но сторонние пакеты не обязательно ведут себя так. Например, если вам требуются выражения «экспресс» и «mime», то получаемый вами модуль модуля «mime», я полагаю, будет отличаться от того, который используется внутри экспресса. Причина в том, что express поставляется с собственным набором файлов модулей в его подкаталоге node_modules, в то время как вы будете устанавливать и загружать свою собственную копию, вероятно, в ваши your_project / node_modules где-то

...