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

#node.js #module #duplication

#node.js #модуль #дублирование

Вопрос:

Прошу прощения, если это глупый вопрос, но если я создам 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:

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

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