Перейти до основного вмісту

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

Глобальні змінні

Щоб зробити в Node.js змінну глобальною, треба оголосити її як властивість об'єкту Global.

global.foo = 3;

Фактично об'єкт Global це аналог об'єкта window із браузера. Метод require, слугуючий для підключення модулів не є глобальним і буде локальним для кожного модуля.

Так само локальними для кожного модуля є:

  • module.export – об'єкт, який відповідає за те, що саме експортуватиме модуль під час використання require;
  • __filename – ім'я файлу виконуваного скрипта;
  • __dirname – абсолютний шлях до виконуваного скрипта.

Ми повернемося до них трохи пізніше і розглянемо їх докладніше, коли розглянемо підключення модулів у Node.js

До секції Global входять такі важливі класи, як:

  • Buffer – об'єкт використовується для операцій з бінарними даними.
  • Process – об'єкт процесу, більшість даних знаходиться саме тут.

Наприклад властивість process.argv містить масив аргументів командного рядка. Нульовим елементом буде ім'я програми, що виконується. node, другим ім'я самого сценарію, що виконується, і тільки потім самі параметри.

Для роботи з каталогами використовуються такі функції – process.cwd() повертає поточний робочий каталог, process.chdir() виконує перехід в інший каталог. Команда process.exit() завершує процес із зазначеним у якості аргументу кодом: 0 – успішний код, будь-яке відмінне від 0 число, але найчастіше 1 – код помилки.

Важливий метод process.nextTick(fn) запланує виконання зазначеної функції таким чином, що вказана функція буде виконана після закінчення поточної фази (поточного виконуваного коду), але перед початком наступної фази event loop.

process.nextTick(function() {
console.log('NextTick callback');
}

Об'єкт Process містить ще багато властивостей та методів, з якими можна ознайомитись самостійно у довідковій документації до Node.js.

Модулі

Для підключення сторонніх модулів до вашого проекту у Node.js існує зручна система керування модулями NPM. По суті, це публічний репозиторій, створених за допомогою Node.js додаткових програмних модулів.

Команда npm дозволяє встановлювати, видаляти або оновлювати потрібні вам модулі, автоматично враховуючи при цьому всі залежності вибраного вами модуля від інших додаткових модулів. Встановлення модуля виконується командою

npm install *ім\'я модуля* [*ключі*]

для встановлення модуля завжди використовується піддиректорія node_modules у вашому проекті. Хоча node_modules містить всі необхідні для запуску залежності, поширювати вихідний код разом із цією папкою не треба.

З огляду на те, що всі публічні NPM модулі можна легко встановити за допомогою npm, для вашого проекту створюється файл package.json із переліком усіх необхідних для роботи залежностей і потім, на сервер можна встановити всі необхідні модулі командою:

npm install

Основні ключі при встановленні це:

  • -S або --save - модуль встановлюється як основна залежність. Значить, що модуль необхідний для нормального функціонування програми.
  • -D або --save-dev - означає, що модуль встановиться як додаткова залежність. В основному модуль потрібний для розробки і в ньому немає необхідності під час роботи програми.

Модулі відносяться до трьох категорій:

  1. базові (core modules)
  2. файлові (file modules)
  3. npm-модулі (npm modules)

Імена базових модулів зарезервовані, ці модулі, наприклад, fs та os, надає саме середовище Node.

Файловий модуль - це коли вами створюється файл з функцією, що експортується, в якому присвоювалось щось (функція, об'єкт тощо) властивості module.exports, а потім цей файл використовується в інших файлах вашої програми.

Модулі npm — це звичайні файлові модулі, які знаходяться у спеціальній папці, яка називається node_modules. Коли ви використовуєте функцію require, Node визначає тип модуля з рядка, що передається.

Якщо ви підключаєте якийсь не базовий модуль moduleName, то Node.js буде шукати у поточному каталозі підкаталог node_modules. Якщо Node не знайде вказаного каталогу, то пошук буде продовжено у цьому каталозі. Якщо знову пошук буде не успішним, то Node.js перейде до батьківського каталогу, і знову почне шукати каталог node_modules, продовживши пошук у ньому. Процес повторюватиметься, доки не буде знайдено модуль або досягнуто кореневого каталогу.

Модулі CommonJS

Node.js працює із системою підключення модулів CommonJS. У структурному плані, CommonJS-модуль є готовим до нового використання фрагментом JavaScript-коду, який експортує спеціальні об'єкти, доступні для використання в будь-якому коді, де потрібна ця залежність. Дві головні ідеї CommonJS-модулів: об'єкт exports, що містить те, що модуль хоче зробити доступним для інших частин системи, та функцію require, яка використовується одними модулями для імпорту об'єкта exports з інших.

Визначимо модуль module.js

const info = msg => {
console.log(`Info: ${msg}`);
};

const log = msg => {
console.log(`Log: ${msg}`);
};

module.exports = {
info,
log,
};

Конструкція module — спеціальний об'єкт, який введено в Node.js заради реалізації модулів Common.js. Все те, що буде надано його властивості exports, буде експортуватися з цього модуля.

В основній програмі main.js ми підключимо ці модулі та викличемо їх

const logger = require('./module');

logger.info('info function');
logger.log('log function');

Тут модуль просто експортує звичайний об'єкт із функціональними властивостями.

Модулі ECMAScript

Починаючи з версії 6.х Node.js також підтримує підключення модулів згідно стандарту ECMAScript. Але повноцінно імпортування модулів запрацювало тільки з версії 14.x. Для цього ми можемо йти двома шляхами. Перший дати файлам розширення .mjs, щоб ми могли використовувати модулі ECMAScript або у файлі package.json встановити поле "type" у значення "module". Підемо другим шляхом і створимо в порожній папці командою

npm init -y

файл package.json за замовчуванням та додамо туди поле "type" зі значенням "module"

Після створемо модуль import.js

export const info = msg => {
console.log(`Info: ${msg}`);
};

export const log = msg => {
console.log(`Log: ${msg}`);
};

І в основній програмі app.js імпортуємо зазначений модуль та викликаємо функції.

import { info, log } from './import.js';

info('info function');
log('log function');

Ми реалізували два підходи підключення модулів Common.js та ECMAScript