Подтвердить что ты не робот

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

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

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

// 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

4b9b3361

Ответ 1

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

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