Работа с модулями Node.js

Работа с модулями Node.js

Каждый проект состоит и некоторого количества файлов, в каждом из которых находится код с определенным функционалом. За счет этого проект делится на независимые части, которые помогают структурировать данный проект и использовать данные части в других проектах.

Исходя из этого в node.js для таких целей существуют модули, которые можно подключать Подключается любой модуль функцией require, которая должна получить путь к модулю.


    var user = require('user');

Этот код подключает модуль работы с пользователями и делает его доступным через переменную user.

В зависимости от параметра переданного функции require будет менять алгоритм подключения модуля. Сейчас как раз обсудим принципы подключения модулей. Если вы захотите узнать об этом подробнее, вся данная информация имеется в официальной документации.

В комплекте с node.js поставляется несколько встроенных модулей. Чтобы их подключить, необходимо указать просто название модуля.


    var http = require('http');
    var path = require('path');

Встроенные модули имеют приоритет над всеми остальными. Это значит что передавая в функцию require напримет require('http'), всегда вернется встроенный модуль, даже если вы напишите свой с таким же названием или файл с таким именем. Описание этих модулей всегда есть на сайте а исходники в репозитории проекта.

Если же передано имя модуля, который не является встроенным, он будет подключаться из папки node_modules. В данной папке будут храниться все модули добавленные с помощью NPM (менеджер пакетов для Node.js).

Чтобы подключить модуль который находится в node_modules достаточно указать его название.


    var express = require('express');
    var async = require('async');

Бывают ситуации, когда такой код вызывают из вложенной папки '/var/www/site', тогда Node.js попытается найти указанные модули в следующих папках:

    
    /var/www/site/node_modules
    /var/www/node_modules
    /var/node_modules
    /node_modules

Node.js рекурсивно, каждый раз переходя в родительскую папку, будет искать папку node_modules с нужным модулем. С помощью NPM есть возможность установить модуль глобально (npm install -g MODULE), тогда он будет доступен из любого места.

Рассмотрим еще один вариант подключения, если переданный параметр в функцию require начинается с /, ../, или ./, тогда файл для подключения будет происходить по абсолютному пути или относительно текущей папки.


    var logger = require('../lib/logger');
    var profiler = require('/var/lib/profiler');

Сначала будет проверено или существует файл с именем точно соответствующим указанному, если такой файл не будет найден, тогда Node.js попытается подключить файл добавляя к имени разные расширения: .js, .json, а также .node.

Поэтому нет необходимости указывать файл с расширением, так как require('./lib/database.js') и require('./lib/database') подключит один и тот же модуль.

Модули могут быть настолько большими, что может возникнет необходимость вынести некоторые части в отдельные файлы, чтобы лучше организовать код модуля. А так как эти файлы используются только этим модулем, не нужно чтобы они находились среди остальных модулей. Для решения этой проблемы в Node.js есть возможность организовать модуль в виде папки в которой будут находится все файлы модуля. Чтобы подключить такой модуль нужно просто передать путь данной папки в функцию require.

Представим, что у нас есть модули и один и них logger представлен в виде папки с файлами:


    ┌─auth.js
    ├─database.js
    └─user
        ├─ index.js
        ├─ adduser.js
        ├─ package.json
        └─ removeuser.js

Подключение модуля user заключается в том, что мы просто передадим путь к этой папки:


    var require('./user');

Дальше Node.js сам попытается определить какой из файлов папки представляет собой точку входа для модуля. Для начала будет проверено или существует в папке файл package.json в котором будет указано в поле main имя файла, который нужно подключить.


    {
        main: "./adduser.js"
    }

В таком случае будет загружен файл './user/adduser.js'. Если файла package.json нету, тогда node.js попытается подключить файлы './user/index.js' или './user/index.node'.

В каждом модуле доступен объект module. Основная задача этого объекта дать возможность модулю вернуть результат своего исполнения. Это может быть и объект, и функция, и строка — любой тип данных.

В объекта module есть свойство exports и ему нужно присваивать все что вы хотите вернуть из модуля. Именно module.exports вернется как результат подключения модуля.


    module.exports.addUser = function () {
      return new User();
    }

После подключения модуля с данным кодом, в ответе будет объект с данным методом.

Можно также воспользоваться более кратким вариантом, переменной exports, которая по-сути просто ссылка на module.exports.


    exports.createUser = function () {
      return new User();
    }

Так как это ссылка, между этими двумя вариантами существует одна важная разница. Результат работы модуля можно вернуть только через объект module.exports, поэтому, если переменной exports присвоить другое значение, она уже не будет ссылаться на module.exports, а значит модуль ничего и не вернет.

А вот сам module.exports можно изменить. Вместо объекта, например, можно вернуть функцию и тогда результатом работы модуля будет не объект с методом в виде некоторой функции, а сама функция.

С помощью module также можно узнать или данный модуль запущен из командной строки. Для этого нужно проверить свойство module.parent — оно должно быть undefined.

Я думаю этой информации будет достаточно для работы с модулями в Node.js.

Поделитесь статьей со своими друзьями