Когда я только-только начал играться с Node.js, для меня существовала лишь одна вещь, которая доставляла мне дискомфорт. Занятно, но я говорю сейчас о
В Node, все штуки видны друг другу только в рамках одного и того же файла. Под штуками я подразумеваю переменные, функции, классы и их члены. Например у нас есть файл
Привычный доступ к переменной
Теперь, перед тем как мы узнаем, как сделать эти штуки видимыми вне модуля, рассмотрим более подробно как загружаются модули в Node.js. Сейчас речь пойдёт о том месте, где пишется
Конечно же, до тех пор, пока наш модуль ничего не отдаёт, все приведённые примеры бесполезны. А чтобы наш модуль что-нибудь отдал, мы будем использовать
Вот теперь наш модуль стал гораздо более полезным:
Есть ещё такой способ отдать штуки из нашего модуля:
Разница между этими подходами не велика, но важна. Как видно, в данном случае мы экспортируем функцию напрямую:
Всё это к тому, что потом её будет легче использовать:
Выгода от использования такого способа заключается в том, что в данном случае нам не важно, будет ли ваш модуль представлять контейнер c экспортируемыми значениями или нет.
Чтобы ещё более красочно представить процесс взаимодействия модулей, давайте рассмотрим следующий пример:
Когда вы подключите данный модуль используя
Что, по сути, является упрощённой записью следующего кода:
Надеюсь эти примеры помогут вам освоиться!
module.exports
. Говоря занятно, я намекаю на то, что это, всё-таки, одна из фундаментальных частей Node.js и она достаточно проста. Сейчас же, оглядываясь назад, я не могу объяснить почему меня это так стопорило… Просто помню, что этот момент был для меня не очевиден. Ну и, полагаю, что я один из тех многих, кто встретив его разок-другой, сначала только путался, прежде чем написал что-либо применив его.В Node, все штуки видны друг другу только в рамках одного и того же файла. Под штуками я подразумеваю переменные, функции, классы и их члены. Например у нас есть файл
misc.js
следующего содержания:var x = 5;
var addX = function(value) {
return value + x;
};
Привычный доступ к переменной
x
и функции addX
из другого файла невозможен. Это никак не связано с использованием var
. Дело в том, что Node состоит из блоков называемых модулями, и каждый отдельный файл по своей сути — отдельный блок, чья область видимости изолирована от других таких же блоков.Теперь, перед тем как мы узнаем, как сделать эти штуки видимыми вне модуля, рассмотрим более подробно как загружаются модули в Node.js. Сейчас речь пойдёт о том месте, где пишется
require
. require
используют для загрузки модуля, обычно присваивая результат его работы какой-то переменной:var misc = require('./misc');
Конечно же, до тех пор, пока наш модуль ничего не отдаёт, все приведённые примеры бесполезны. А чтобы наш модуль что-нибудь отдал, мы будем использовать
module.exports
:var x = 5;
var addX = function(value) {
return value + x;
};
module.exports.x = x;
module.exports.addX = addX;
Вот теперь наш модуль стал гораздо более полезным:
var misc = require('./misc');
console.log("Добавив %d к 10 мы получим %d", misc.x, misc.addX(10));
Есть ещё такой способ отдать штуки из нашего модуля:
var User = function(name, email) {
this.name = name;
this.email = email;
};
module.exports = User;
Разница между этими подходами не велика, но важна. Как видно, в данном случае мы экспортируем функцию напрямую:
module.exports.User = User;
//vs
module.exports = User;
Всё это к тому, что потом её будет легче использовать:
var user = require('./user');
var u = new user.User();
//vs
var u = new user();
Выгода от использования такого способа заключается в том, что в данном случае нам не важно, будет ли ваш модуль представлять контейнер c экспортируемыми значениями или нет.
Чтобы ещё более красочно представить процесс взаимодействия модулей, давайте рассмотрим следующий пример:
var powerLevel = function(level) {
return level > 9000 ? "it's over 9000!!!" : level;
};
module.exports = powerLevel;
Когда вы подключите данный модуль используя
require
, фактически им будет являться функция, что позволит вам сделать следующее:require('./powerlevel')(9050);
Что, по сути, является упрощённой записью следующего кода:
var powerLevel = require('./powerlevel')
powerLevel(9050);
Надеюсь эти примеры помогут вам освоиться!