Що робить об'єкт module?
1. Що таке module
module- це вбудований об'єкт у Node.js, який представляє поточний модуль (поточний файл).Кожен
.jsфайл у Node.js - це окремий модуль, і для кожного з них Node автоматично створює об'єктmodule.
Приклад:
console.log(module);Виведе (спрощено):
Module {
id: '.',
path: '/Users/tim/project',
exports: {},
filename: '/Users/tim/project/app.js',
loaded: false,
children: [],
parent: null
}Це "службовий об'єкт", який містить метадані:
id- унікальний ідентифікатор модуля (зазвичай шлях);filename- абсолютний шлях до файлу;loaded- чи завантажений модуль повністю;exports- об'єкт, що експортується;children- список модулів, які цей модуль завантажив;parent- хто завантажив цей модуль.
2. Що робить module.exports
module.exports- це об'єкт, який визначає, що саме буде повернуто, коли хтось робитьrequire()цього файлу.
Те, що ти запишеш у module.exports,
стає результатом виклику require().
math.js
const PI = 3.14;
function add(a, b) {
return a + b;
}
// експортуємо назовні
module.exports = { PI, add };app.js
const math = require('./math');
console.log(math.add(2, 3)); // 5
console.log(math.PI); // 3.14Тобто:
require('./math')повертає значенняmodule.exportsіз файлуmath.js.
3. Як пов'язані module і exports
Node.js обгортає кожен файл у внутрішню функцію:
(function (exports, require, module, __filename, __dirname) {
// твій код
});Тут:
exports- це посилання (аліас) наmodule.exports;module.exports- реальний об'єкт, який буде експортовано.
Схематично:
exports ──► { } ◄── module.exportsПоки ти робиш:
exports.foo = 42;чи
module.exports.foo = 42;- це те саме (обидва додають властивості до спільного об'єкта).
4. Але є пастка!
Якщо ти переприсвоїш exports напряму, зв'язок із module.exports втрачається.
Приклад неправильного використання:
// math.js
exports = { add: (a, b) => a + b };app.js
const math = require('./math');
console.log(math); // {}Чому?
Тому що ти просто переназначив змінну exports,
а module.exports лишився порожнім об'єктом.
Правильні способи експорту:
Варіант 1. Через module.exports:
module.exports = {
add: (a, b) => a + b
};Варіант 2. Через exports:
exports.add = (a, b) => a + b;
exports.sub = (a, b) => a - b;Варіант 3. Експорт функції напряму:
module.exports = function (a, b) {
return a + b;
};5. Під капотом require() та module.exports
Коли ти викликаєш:
const user = require('./user');Node.js робить таке:
- Завантажує
user.js; - Створює об'єкт:
const module = { exports: {} };
const exports = module.exports;- Виконує код файлу;
- Повертає
module.exports.
6. Приклад повного циклу
user.js
console.log('Модуль user завантажується...');
module.exports = {
name: 'Tim',
sayHi() {
console.log('Hi!');
}
};app.js
const user = require('./user');
console.log(user.name); // Tim
user.sayHi(); // Hi!Вивід:
Модуль user завантажується...
Tim
Hi!7. Часті помилки
| Помилка | Чому | Як виправити |
|---|---|---|
exports = {...} | Втрачено посилання на module.exports | Використовуй module.exports = {...} |
| Експорт усередині функції | Не експортується за межі функції | Визнач module.exports на верхньому рівні |
| Кілька експортів підряд | Останній перезапише попередні | Експортуй об'єкт з усіма властивостями |
8. Приклад: різниця між додаванням і переприсвоєнням
Додавання:
exports.a = 1;
exports.b = 2;Результат:
{ a: 1, b: 2 }Переприсвоєння:
module.exports = { a: 1, b: 2 };Результат:
{ a: 1, b: 2 }Обидва працюють, але exports = ... без module.exports = ... не працює!
9. Метадані об'єкта module
| Властивість | Призначення |
|---|---|
id | Унікальний ідентифікатор модуля |
filename | Абсолютний шлях до файлу |
loaded | Прапорець, що модуль повністю завантажено |
parent | Модуль, який викликав require() |
children | Модулі, завантажені цим модулем |
exports | Об'єкт, що повертається через require() |
path | Папка, де знаходиться модуль |
10. Візуально
┌────────────────────────────┐
│ module │
│ ┌──────────────────────┐ │
│ │ module.exports = {} │◄─┼─── повертається при require()
│ └──────────────────────┘ │
│ exports ─────► (посилання)│
└────────────────────────────┘Коротке резюме
| Об'єкт | Призначення |
|---|---|
module | Службовий об'єкт, що представляє поточний файл-модуль |
module.exports | Об'єкт, який реально експортується назовні |
exports | Посилання на module.exports (зручний короткий доступ) |
require() | Завантажує модуль і повертає module.exports |
Головне правило:
Усе, що ти хочеш віддати назовні - поклади в
module.exports.Усе решта лишається приватним усередині модуля.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.