Модульная система Node.js

Reading time ~4 minutes

Что такое модульная система в Node.js и как ею пользоваться. Статья мне очень понравилась - в ней автор подробно и внятно доносит тему.

Кроме того, это тот самый случай, когда я наконец нашел ответ на свой вопрос.

Итак - первоисточник находится здесь - Руководство для начинающих по Node.js от Felix’a.


Для организации программ в виде отдельных файлов Node.js предлагает к использованию модульную систему.

Для демонстрации подхода создадим файл

1
main.js
со следующим содержимым:

var hello = require('./hello');
hello.world();

Нетрудно догадаться, что функция

1
require('./hello')
используется для импорта данных из отдельного JavaScript-файла.

1
./
- означает, что файл находится в той же директории, что и сам файл
1
main.js
. Также следует обратить внимание на то, что не требуется указывать расширение файла, так как
1
.js
подставляется по умолчанию.

Далее необходимо создать файл (модуль)

1
hello.js
со следующим содержимым:

exports.world = function () {
  console.log('Hello World');
}

Тут следует обратить внимание на то, что происходит присваивание свойству

1
world
объекта
1
exports
.

Таким образом объявляется, что модуль

1
hello.js
экспортирует во вне функцию
1
world
.

Объект

1
exports
доступен в любом модуле и возвращается при каждом вызове функции
1
require
при подключении модуля.

При запуске

1
main.js
вывод будет следующим:

$ node main.js
Hello World

Будет не лишним упомянуть, что зачастую объект

1
exports
переопределяется следующим образом:

module.exports = function () {
  // ...
}

Как и ожидается, такое переопределение будет причиной того, что

1
require
будет возвращать функцию.

Такой подход полезен при объекто-ориентированном программировании (ООП), где каждый файл экспортирует конструктор одного класса.

Следующая вещь, которую надо понимать при работе с модульной системой, это то, как система работает с вызовами

1
require
, которые не включают относительную подсказку о местоположении подключаемого файла.

Например:

var http = require('http');

Первое, что сделает Node.js - это определит, есть ли модуль ядра с именем

1
http
. Если есть, то вернет соответствующую директорию.

Но что будет при работе с модулями, не относящимися к ядру, как, например,

1
mysql
?

var mysql = require('mysql');

В этом случае Node.js будет искать модуль в каждой директории, начиная с одного из текущих файлов, и проверять есть ли директория с именем

1
node_modules
. Если такая директория найдена, Node.js начнет поиск в ней файла с именем
1
mysql.js
.

Если подходящих файлов не найдено и достигнут корень файловой системы (

1
/
), Node.js сдается и выбрасывает исключение.

В настоящий момент Node.js учитывает дополнительный изменяемый список альтернативных директорий для импорта. Список доступен через массив

1
require.paths
. Однако идет активное обсуждение на тему удаления этой возможности, так что лучше пока не использовать ее.

И наконец, Node.js учитывает файл

1
index.js
, в котором описывается главный файл импорта для директории.

Таким образом, если встретится вызов

1
require('./foo')
, то Node.js будет пробовать искать файлы и
1
foo.js
и
1
foo/index.js
.

JavaScript-flood продолжается … )


MongoDB - создание документа

![MongoDB]({{site.url}}/images/uploads/2017/05/mongodb-logo.jpg "MongoDB")Приступили к самому основному - операциям создания, чтения, изм...… Continue reading

MongoDB - документы

Published on May 23, 2017