Как стать автором
Обновить

Понимание require() в Node.js

Время на прочтение 3 мин
Количество просмотров 59K
Автор оригинала: james herdman

Node.js это асинхронная JavaScript бибилиотека для построения серверных приложений, которые используют конвенцию CommonJS. Весь этот синтаксис, модули поначалу достаточно запутали меня. Но давайте все-таки попытаемся разобраться.

В этой статье будет использоваться Node.js v0.5.8-pre. Поехали!



Для начала давайте определим пару функций, работающих с окружностями (вероятно вы их уже встречали на страницах документации):

var PI = 3.14

exports.area = function ( r ) {
 return PI * r * r
}

exports.circumference = function ( r ) {
 return 2 * PI * r
}


* This source code was highlighted with Source Code Highlighter.


Отлично. Теперь попробуем использовать их в node. Запускаем консоль командой node и подключаем наш файл circle.js. Обратите внимание, что в пути указан относительный путь. Расширение можно не указывать, node подразумевает, что это будет js файл. Первый раз у вас скорее всего получится что-то типа этого:

node> require('./circle')
{ area: [Function], circumference: [Function] }
node> area
ReferenceError: area is not defined
at EventEmitter.anonymous (eval at readline (/usr/local/lib/node/libraries/repl.js:48:9))
at EventEmitter.readline (/usr/local/lib/node/libraries/repl.js:48:19)
at node.js:845:9


Что же произошло?


Давайте разбираться. Имея опыт работы с другими объектными языками, я привык использовать методы, которые я предварительно определил. Но с CommonJS модулями не все так просто. Давайте посмотрим, как можно использовать наш модуль:

node> var circle = require('./circle')
{ area: [Function], circumference: [Function] }
node> circle.area(5)
78.5


Отлично. Результат уже лучше. Однако если попробовать следующее:

node> circle.PI
node>


Мы получим “ничего”. Ведь мы корректно вызвали атрибут circle, но ничего не получили. Поначалу это может несколько сбить с толку. Собственно как и меня по началу. Если заглянуть в документацию, то там есть что посмотреть по этому поводу.
To export an object, add to the special exports object. (Alternatively, one can use this instead of exports.)

Мы можем переписать наш модуль следующим образом:

var PI = 3.14

this.area = function ( r ) {
 return PI * r * r
}

this.circumference = function ( r ) {
 return 2 * PI * r
}


* This source code was highlighted with Source Code Highlighter.


“Причем здесь this?” — спросите вы. Да при том, что это и есть наш объект. Мы можем представить наш модуль в следующем виде:

function circle () {
  var PI = 3.14

  this.area = function ( r ) {
  return PI * r * r
  }

  this.circumference = function ( r ) {
  return 2 * PI * r
  }
}


* This source code was highlighted with Source Code Highlighter.


Знакомо? Это обычный JavaScript-объект. Таким образом модули в Node.js не более, чем привычные нам объекты, определенные в короткой форме. То есть по сути мы объявляем лишь тело объекта. Теперь мы имеем представление об CommonJS модулях.

Вывод


Файлы модулей являются ничем иным, как обычными обектами. В файле мы определяем непосредственно тело модуля. В CommonJS модулях, если выхотите что-то сделать доступным из вне, необходимо использовать export. На самом деле можно получить доступ к PI (в примерах выше), но это неправильный подход. Используя глобальную область видимости мы просто рискуем переопределить уже существующие атрибуты или методы. А потом сиди и отлавливай баги. Экспортируем только публичные методы, все остальное оставляем внутри черного ящика. Export — это крайне удобный и практичный подход.

От переводчика

Это скорее вольная интерпритация записи Джеймса, нежели полноценный перевод. Оригинал поста уже порядком устарел и я попытался внести некоторые корректировки. Сам я в поисках новых технологий и горизонтов вышел на node.js и пытаюсь его понять, а так же понять причины его бурно растущей популярности. Так и решил поделиться с общественностью некоторыми результатами кропотливого постижения шаг зашагом.
Теги:
Хабы:
0
Комментарии 10
Комментарии Комментарии 10

Публикации

Истории

Работа

Ближайшие события

PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн
Weekend Offer в AliExpress
Дата 20 – 21 апреля
Время 10:00 – 20:00
Место
Онлайн