Требуется по требованию ()
Скажем, я создаю библиотеку в ./libname
который содержит один основной файл: main.js
и несколько необязательных библиотечных файлов, которые иногда используются с основным объектом: a.js
а также b.js
,
я создаю index.js
файл со следующим:
exports.MainClass = require('main.js').MainClass; // shortcut
exports.a = require('a');
exports.b = require('b');
И теперь я могу использовать библиотеку следующим образом:
var lib = require('./libname');
lib.MainClass;
lib.a.Something; // Here I need the optional utility object
lib.b.SomeOtherThing;
Однако это означает, что я загружаю "a.js" и "b.js" всегда, а не тогда, когда они мне действительно нужны.
Конечно, я могу вручную загрузить дополнительные модули с require('./libname/a.js')
, но потом я теряю симпатичную lib.a
точка-обозначение:)
Есть ли способ реализовать загрузку по требованию с каким-то индексным файлом? Может быть, некоторые package.json
магия может играть здесь хорошо?
2 ответа
Похоже, единственный способ - использовать геттеры. Короче вот так:
exports = {
MainClass : require('main.js').MainClass,
get a(){ return require('./a.js'); },
get b(){ return require('./a.js'); }
}
Это возможно, если вы вызвали "MainClass" для динамической загрузки дополнительных модулей по требованию. Но я подозреваю, что это также будет означать корректировку в API для доступа к модулю.
Я думаю, ваша мотивация состоит в том, чтобы "избежать" дополнительной обработки, используемой "ненужными модулями". Но помните, что Node является однопоточным, поэтому загрузка модуля занимает не каждое соединение, а процесс. Загрузка модуля является одноразовой, чтобы загрузить его в память.
Другими словами, модули загружаются только когда вы запускаете сервер, а не каждый раз, когда кто-то делает запрос.
Я думаю, что вы смотрите на это со стороны клиентского программирования, где выгодно загружать скрипты, когда они необходимы для экономии как при обработке, так и при запросах http.
На сервере самое большее, что вы будете экономить, это несколько лишних укусов в памяти.