Пошук уроків, статей та іншого контенту
Розглянемо призначення модулів у Node.js та базову структуру CommonJS-файлів і їхню взаємодію.
Модуль — це окремий файл із кодом, який можна підключити до іншого файлу.
Модулі допомагають:
розділяти велику програму на менші частини;
повторно використовувати код;
приховувати внутрішні змінні та функції;
легше тестувати й підтримувати проєкт.
У Node.js кожен файл за замовчуванням розглядається як окремий модуль. Змінні, оголошені всередині файлу, не доступні в інших файлах, якщо їх явно не експортувати.
CommonJS — традиційна модульна система Node.js. У ній використовують:
module.exports або exports для експорту;
require() для імпорту.
Створимо файл math.js:
function add(a, b) {
return a + b;
}
module.exports = add;Тепер функція add доступна для інших файлів.
Підключимо її у файлі app.js:
const add = require("./math");
const result = add(2, 3);
console.log(result);Результат:
5Розширення .js у шляху можна не вказувати. Node.js автоматично шукає файл math.js.
Модуль може експортувати кілька функцій, об’єднаних в один об’єкт.
Файл math.js:
function add(a, b) {
return a + b;
}
function multiply(a, b) {
return a * b;
}
module.exports = {
add,
multiply
};Файл app.js:
const math = require("./math");
console.log(math.add(2, 3));
console.log(math.multiply(2, 3));Результат:
5
6Можна одразу деструктурувати потрібні властивості:
const { add, multiply } = require("./math");
console.log(add(2, 3));
console.log(multiply(2, 3));exportsОб’єкт exports спочатку посилається на той самий об’єкт, що й module.exports. Тому властивості можна додавати так:
exports.add = function (a, b) {
return a + b;
};
exports.multiply = function (a, b) {
return a * b;
};Підключення залишається таким самим:
const { add, multiply } = require("./math");
console.log(add(4, 2));
console.log(multiply(4, 2));exports і module.exportsДля експорту властивостей можна використовувати exports:
exports.name = "Node.js";Але для заміни всього експортованого значення потрібно використовувати module.exports:
module.exports = function greet(name) {
return `Привіт, ${name}!`;
};Неправильний варіант:
exports = function greet(name) {
return `Привіт, ${name}!`;
};Таке присвоєння змінює лише локальну змінну exports, але не значення, яке повертає require().
Розглянемо невеликий приклад із трьома файлами:
project/
├── app.js
├── user.js
└── greeting.jsФайл greeting.js:
function createGreeting(name) {
return `Привіт, ${name}!`;
}
module.exports = createGreeting;Файл user.js:
const createGreeting = require("./greeting");
function getUserMessage(userName) {
return createGreeting(userName);
}
module.exports = {
getUserMessage
};Файл app.js:
const { getUserMessage } = require("./user");
const message = getUserMessage("Олена");
console.log(message);Послідовність роботи така:
app.js підключає модуль user.js.
user.js підключає модуль greeting.js.
greeting.js експортує функцію createGreeting.
user.js використовує цю функцію і експортує getUserMessage.
app.js викликає getUserMessage.
Запустити програму можна командою:
node app.jsРезультат:
Привіт, Олена!Змінні модуля не стають глобальними автоматично.
Файл config.js:
const appName = "My application";
module.exports = {
appName
};Файл app.js:
const config = require("./config");
console.log(config.appName);Змінна appName доступна в app.js тільки тому, що її додали до module.exports.
Якщо не експортувати змінну, інший файл не зможе звернутися до неї напряму.
ES Modules, або ESM, — стандартна модульна система JavaScript. У ній використовують:
export для експорту;
import для імпорту.
Файл math.js:
export function add(a, b) {
return a + b;
}
export function multiply(a, b) {
return a * b;
}Імпорт:
import { add, multiply } from "./math.js";
console.log(add(2, 3));
console.log(multiply(2, 3));В ESM шлях до локального файлу зазвичай записують із розширенням .js.
Модуль може мати один експорт за замовчуванням:
export default function greet(name) {
return `Привіт, ${name}!`;
}Імпорт:
import greet from "./greeting.js";
console.log(greet("Олена"));Для експорту за замовчуванням ім’я під час імпорту можна вибрати самостійно:
import createGreeting from "./greeting.js";Щоб Node.js обробляв файли .js як ES Modules, у package.json потрібно вказати:
{
"type": "module"
}Після цього можна використовувати import та export у файлах .js.
Інший варіант — використовувати розширення .mjs. Файли з таким розширенням Node.js обробляє як ES Modules незалежно від налаштування type.
Для CommonJS можна використовувати розширення .cjs.
CommonJS:
// math.js
function add(a, b) {
return a + b;
}
module.exports = { add };// app.js
const { add } = require("./math");
console.log(add(1, 2));ES Modules:
// math.js
export function add(a, b) {
return a + b;
}// app.js
import { add } from "./math.js";
console.log(add(1, 2));Основна різниця:
CommonJS використовує require() і module.exports;
ES Modules використовують import і export;
для ESM у Node.js потрібне відповідне налаштування або розширення .mjs;
синтаксис імпорту та експорту має бути узгоджений у межах проєкту.
const math = require("math");Такий запис шукає пакет math, а не локальний файл.
Для локального файлу потрібно використовувати ./:
const math = require("./math");./math — файл у поточній папці;
../math — файл у батьківській папці.
Не можна без налаштування використовувати import у CommonJS-файлі:
const { add } = import("./math.js");Так само require() не є звичайним способом імпорту в ES Module:
const math = require("./math.js");Спочатку потрібно визначити, яку модульну систему використовує проєкт.
exports = function () {
return "Готово";
};Потрібно написати:
module.exports = function () {
return "Готово";
};Файл math.js:
function add(a, b) {
return a + b;
}Файл app.js:
const { add } = require("./math");У цьому випадку add не була експортована. Правильний варіант:
module.exports = {
add
};Модуль — це окремий файл із кодом, який можна використовувати в інших файлах.
CommonJS використовує require() для імпорту та module.exports або exports для експорту.
ES Modules використовують import і export.
Усі змінні модуля локальні, якщо їх явно не експортувати.
Для підключення локального CommonJS-модуля шлях починається з ./ або ../.
Для експорту всього значення потрібно використовувати module.exports.
У межах одного проєкту важливо послідовно використовувати вибрану модульну систему.