Пошук уроків, статей та іншого контенту
Навчимося підключати модулі через require і відкривати значення з інших файлів за допомогою module.exports.
У Node.js код можна розділяти на окремі файли — модулі. Це допомагає:
не створювати один великий файл;
повторно використовувати код;
приховувати внутрішню реалізацію;
чітко визначати, які значення доступні іншим файлам.
Для підключення модуля використовується require(), а для відкриття значень — module.exports.
module.exportsСтворимо файл 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);Запустимо програму командою:
node app.jsРезультат:
5const add = require('./math');Node.js:
знаходить файл math.js;
виконує його код;
отримує значення module.exports;
повертає це значення в app.js.
Оскільки в math.js було написано:
module.exports = add;змінна add у app.js містить саме функцію.
Розширення .js можна не вказувати:
const add = require('./math');Це те саме, що:
const add = require('./math.js');Модуль може відкривати не лише одне значення. Для кількох значень зазвичай експортують об’єкт.
Файл math.js:
function add(a, b) {
return a + b;
}
function subtract(a, b) {
return a - b;
}
module.exports = {
add,
subtract
};Файл app.js:
const math = require('./math');
console.log(math.add(7, 3));
console.log(math.subtract(7, 3));Результат:
10
4Властивості об’єкта можна деструктуризувати одразу під час підключення:
const { add, subtract } = require('./math');
console.log(add(7, 3));
console.log(subtract(7, 3));Назви add і subtract мають збігатися з назвами властивостей, які експортує модуль.
exports і module.exportsУ CommonJS у модуля є об’єкт module, а його властивість exports використовується для визначення результату експорту:
module.exports = {
name: 'Node.js'
};Також можна додавати властивості скороченим записом:
exports.add = function (a, b) {
return a + b;
};
exports.subtract = function (a, b) {
return a - b;
};Цей код створює об’єкт із двома властивостями. Підключити його можна так:
const math = require('./math');
console.log(math.add(5, 2));
console.log(math.subtract(5, 2));Для початку зручно використовувати один стиль:
module.exports = значення — коли модуль експортує одне основне значення;
module.exports = { ... } — коли модуль експортує кілька значень.
module.exports і exportsexports спочатку посилається на той самий об’єкт, що й module.exports:
exports.name = 'Node.js';Це працює, тому що властивість додається до спільного об’єкта.
Але так робити не можна:
exports = function () {
console.log('Привіт');
};У цьому випадку змінна exports починає посилатися на інше значення, але Node.js повертає module.exports. Тому функція не буде експортована.
Якщо потрібно замінити весь експортований об’єкт, використовуйте саме module.exports:
module.exports = function () {
console.log('Привіт');
};Тепер підключення працюватиме:
const sayHello = require('./greeting');
sayHello();Для власних файлів шлях зазвичай починається з ./:
const math = require('./math');Позначення:
./math — файл math.js у поточній папці;
../math — файл у батьківській папці;
./utils/math — файл math.js у папці utils.
Якщо не вказати ./ або ../, Node.js сприйматиме назву як назву вбудованого чи встановленого пакета:
const fs = require('fs');Тому для власного файлу важливо написати правильний відносний шлях.
Структура проєкту:
project/
├── app.js
└── user.jsФайл user.js:
const user = {
name: 'Олена',
role: 'розробниця'
};
function getDescription(user) {
return `${user.name} — ${user.role}`;
}
module.exports = {
user,
getDescription
};Файл app.js:
const { user, getDescription } = require('./user');
console.log(getDescription(user));Запуск:
node app.jsРезультат:
Олена — розробницяУ цьому прикладі:
user.js містить дані та функцію;
module.exports відкриває їх для інших файлів;
require('./user') підключає модуль;
деструктуризація отримує user і getDescription.
Неправильно:
const math = require('math');Якщо math.js — це власний файл у поточній папці, правильно:
const math = require('./math');Неправильно:
function greet() {
return 'Привіт';
}
module.exports = {
greeting: greet
};Якщо під час підключення очікувати властивість greet, її не буде:
const { greet } = require('./greeting');
console.log(greet());Потрібно або використовувати правильну назву:
const { greeting } = require('./greeting');
console.log(greeting());або змінити експорт:
module.exports = {
greet
};Якщо модуль експортує об’єкт:
module.exports = {
add
};його не можна викликати як функцію:
const math = require('./math');
math();Потрібно викликати конкретну властивість:
math.add(2, 3);Не варто без потреби поєднувати такі записи:
exports.add = add;
module.exports = subtract;Другий рядок замінить увесь експорт, тому add більше не буде доступною. Виберіть один зрозумілий спосіб експорту для конкретного модуля.
Модуль — це окремий файл із кодом.
require() підключає модуль і повертає його експортоване значення.
module.exports визначає, що саме буде доступне іншим файлам.
Для одного значення можна написати:
module.exports = value;Для кількох значень зручно експортувати об’єкт:
module.exports = { first, second };Власні файли підключаються з ./ або ../.
exports.name = value підходить для додавання властивостей, але для повної заміни експорту потрібно використовувати module.exports.