Данная статья является прочтением и переосмыслением перевода Node.js, Require и Exports статьи-оригинала Node.js, Require and Exports.
Помимо этого, существует еще одна неплохая статья, посвященная данной тематике - Understanding module.exports and exports in Node.js.
Тематика данного поста посвящена двум командам Node.js -
и 1
require
. Обе эти команды являются служебными и “принадлежат” Node.js.1
module.exports
С помощью этих команд Node.js осуществляет взаимодействие своих модулей между друг другом.
Команда
подключает один модуль к другому. Команда 1
require
делает модуль доступным для других модулей.1
module.exports
Ниже - краткое изложение статьи-оригинала …
В Node.js все штуки видны друг другу только в рамках одного и того же файла. Под штуками я подразумеваю переменные, функции, классы и их члены.
Например, у нас есть файл
следующего содержания:1
misc.js
Привычный доступ к константе
и переменной 1
x
из другого файла невозможен. Это никак не связано с использованием 1
summ
.1
var
Дело в том, что Node.js состоит из блоков, называемых модулями; и каждый отдельный файл по своей сути — отдельный блок (модуль), чья область видимости изолирована от других таких же блоков (модулей).
Теперь перед тем как мы узнаем, как сделать эти штуки видимыми вне модуля, рассмотрим более подробно, как загружаются модули в Node.js.
Сейчас речь пойдет о том месте, где пишется -
. Служебное слово 1
require
используют для загрузки модуля, обычно присваивая результат его работы какой-то переменной:1
require
Другими словами можно сказать, что в Node.js служебное слово
служит для подключения одного независимого модуля (файла) к другому независимому модулю (файлу). Принцип подключения через
1 requireзаключается в создании в целевом модуле объекта и помещении в этот объект подключаемого модуля.
1 require
Конечно же, до тех пор, пока наш модуль (
) ничего не отдает, все приведенные примеры бесполезны.1
some_module
А чтобы наш модуль (
) что-нибудь отдал, мы будем использовать служебное слово 1
some_module
:1
module.exports
Вот теперь наш модуль (
) стал гораздо более полезным:1
some_module
В результате в целевом модуле будет создан объект
со свойством 1
someModule
(1
x = 5
) и методом 1
someModule.x
(1
summ
).1
someModule.summ
Есть ещё такой способ отдать штуки из нашего модуля:
То есть, в исходном модуле создается объект
со свойствами
1 Userи
1 User.name. Затем с помощью служебного слова
1 User.emailобъект
1 module.exportsделается доступным для других модулей Node.js.
1 User
Разница между этими подходами не велика, но важна. Как видно, в данном случае мы экспортируем функцию напрямую:
Всё это к тому, что потом ее будет легче использовать:
Выгода от использования такого способа заключается в том, что в данном случае нам не важно, будет ли ваш модуль представлять контейнер c экспортируемыми значениями или нет.
Чтобы еще более красочно представить процесс взаимодействия модулей, давайте рассмотрим следующий пример:
Когда вы подключите данный модуль используя
, фактически им будет являться функция, что позволит вам сделать следующее:1
require
Что, по сути, является упрощенной записью следующего кода:
Это все кратко о командах
и 1
require
.1
module.exports