Попытка разобраться, в чем различие между
и 1
exports
, основанная на статье Understanding module.exports and exports in Node.js.1
module.exports
Что такое 1
module.exports
и 1
exports
в Node.js
1 | module.exports |
1 | exports |
Как web-разработчики, мы часто сталкиваемся с ситуацией, когда необходимо иметь дело с малознакомым кодом. И тогда сам собою возникает логичный вопрос - сколько времени мне потребуется для того, чтобы разобраться с чужим кодом и понять принцип его работы?
Типичный ответ на этот вопрос - ровно столько, чтобы начать самому писать код; а затем вернуться к изучению этой темы позже, когда позволит на это время. Ну что-же, как мне кажется, пришло время получше разобраться с такими понятиями, как
и 1
module.exports
в Node.js. Спешу поделиться с вами тем, что я узнал по этому вопросу.1
exports
Что такое модуль (module)
Основная концепция модуля заключается в том, что он инкапсулирует логически связанный между собой код в единый блок. Можно сказать иначе - создание модуля заключается в помещении всех взаимосвязанных между собой функций в один единый файл.
Для понимания вышесказанного лучше всего создать пример приложения под Node.js. Давайте создадим файл с именем
, внутри которого размещены две функции:1
greetings.js
Экспорт модуля
Польза от файла (модуля)
(и функций, которые находятся в этом файле) появляется в том случае, когда файл 1
greetings.js
можно использовать внутри других файлов (модулей).1
greetings.js
Для достижения этого необходимо слегка изменить исходный код файла
. Чтобы понять, что происходит на самом деле, в данном случае будем выполнять пошаговый процесс:1
greetings.js
- представьте себе, что эта строка существует в качестве первой линии кода в
:1
greetings.js
- видоизменим обе функции в файле
с помощью выражения1
greetings.js
таким образом, чтобы они были доступны для внешних файлов (модулей):1
exports
В приведенном выше коде можно было бы заменить выражение
на 1
exports
и получить точно такой же результат.1
exports.module
Если этот момент кажется вам непонятным, то помните, что выражение
и выражение 1
exports
ссылаются на один и тот же объект.1
exports.module
- это текущее значение выражения
:1
module.exports
Импортирование модуля
Давайте сделаем методы модуля
общедоступными для другого файла (модуля) с именем 1
greetings.js
. Этот процесс также разобьем пошагово для более лучшего понимания:1
main.js
- в Node.js используется команда
для импортирования одного модуля в другой модуль:1
require
- давайте подключим модуль
в модуль1
greetings.js
:1
main.js
Приведенная выше строка кода равнозначна нижеследующему коду:
- теперь можно использовать функции модуля
внутри модуля1
greetings.js
как методы объекта1
main.js
:1
greeting
Отличительные моменты
Команда
возвращает объект, свойства и методы которого доступны другим внешним модулям при помощи команды 1
require
.1
module.exports
Нижеприведенный пример поможет разобраться в данном вопросе:
Теперь сделаем подключение модуля
в модуль 1
greetings.js
:1
main.js
На данный момент в нашем примере ничего не поменялось. В переменную
помещается код, доступный из модуля 1
greetings
. Не более того.1
greetings.js
Однако, если мы попытаемся воспользоваться каким-либо из методов модуля
- 1
greetings.js
или 1
sayHelloInEnglish
, то мы получим ошибку. Это произошло в следствие того, что было произведено переопределение экспортируемой структуры модуля при помощи команды 1
sayHelloInSpanish
.1
module.exports
Другими словами, последней командой
экспортируется совсем другой модуль - 1
module.exports
, у которого другие свойства и методы. Происходит переопределение экспортируемого модуля и вызов метода 1
Bonjour
или 1
sayHelloInEnglish
вызовет ошибку:1
sayHelloInSpanish
Чтобы отследить ошибки при использовании модуля
, можно вывести их в консоль:1
greetings
Заключение
Импорт и экспорт модулей в Node.js является ежедневной задачей. Я надеюсь, что благодаря этой статье стала ясна разница между командой
и командой 1
exports
. Более того, если у вас когда-либо произойдет ошибка при доступе к общедоступным методам модуля в будущем, то я надеюсь, что у вас есть лучшее понимание того, почему может возникнуть эти ошибки.1
module.exports
Заключение автора перевода
Если честно - прочитал статью и даже потрудился перевести ее, а вот разницы между
и 1
exports
не заметил. Я хочу сказать, что автор этой статьи (как мне кажется) так и не показал разницы между ними. Могу ошибаться, конечно и буду рад комментариям.1
module.exports
UPD. Вопрос снят, так как решен. В принципе, существование этой и предыдущей статьи уже не надобно, так как есть отличный скринкаст от Ильи Кантора по Node.js, где раскрываются все вопросы - Скринкаст NODE.JS.
В свете этого скринкаста в обеих статьях обнаруживаются достаточно существенные ошибки. Прямо и не знаю - может убрать обе эти статьи о греха подальше? ))