Що означає термін «CommonJS»?
1. Що таке CommonJS
CommonJS (CJS) - це стандарт (специфікація) для організації коду у вигляді модулів у JavaScript, призначений для виконання поза браузером (на сервері).
Простіше кажучи:
CommonJS - це правила, як JavaScript-код повинен експортувати й імпортувати значення між файлами, щоб модулі могли працювати в серверному середовищі (наприклад, у Node.js).
2. Навіщо з'явився CommonJS
На початку 2000-х JavaScript існував лише в браузері, і в ньому не було вбудованої модульної системи - усе писали в одному файлі, і змінні легко конфліктували.
Коли JavaScript почали використовувати поза браузером (наприклад, на сервері), знадобився універсальний стандарт, який дозволив би:
- ділити код на файли (модулі);
- імпортувати/експортувати функції й об'єкти;
- керувати залежностями.
Так у 2009 році група розробників запропонувала стандарт CommonJS (тоді під назвою "ServerJS").
3. Основна ідея CommonJS
Кожен файл - це ізольований модуль. Він може:
- експортувати значення назовні (
module.exports); - імпортувати інші модулі (
require()).
Приклад CommonJS:
// 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Ключові елементи CommonJS:
require()- функція для імпорту;module.exports/exports- об'єкт для експорту;- кожен модуль виконується один раз, а потім кешується.
4. CommonJS - це не тільки Node.js
Хоча CommonJS асоціюється саме з Node.js, спочатку це була відкрита ініціатива. Node.js просто став першим і найуспішнішим втіленням стандарту.
Інші платформи, що підтримують CommonJS:
- Narwhal
- RingoJS
- MongoDB shell (ранні версії)
- Electron (main process)
5. CommonJS у Node.js
Node.js реалізує CommonJS майже повністю (із деякими особливостями):
-
кожен
.jsфайл = модуль; -
модулі ізольовані один від одного;
-
під час завантаження Node.js обгортає їх у внутрішню функцію:
javascript(function (exports, require, module, __filename, __dirname) { // код модуля });
Це забезпечує:
- приватну область видимості;
- доступ до
__dirname,__filename; - можливість використовувати
require()усередині будь-якого файлу.
6. Як працює завантаження CommonJS-модулів
- Розв'язання шляху: Node шукає файл (
.js,.json,.node). - Читання файлу: зчитується вміст.
- Обгортання: код кладеться у функцію (щоб створити область видимості).
- Виконання: виконується, результат зберігається в
module.exports. - Кешування: при наступному
require()модуль береться з пам'яті.
Це робить модулі швидкими й перевикористовуваними.
7. CommonJS vs ES Modules (ESM)
| Критерій | CommonJS (CJS) | ES Modules (ESM) |
|---|---|---|
| Імпорт | require() | import |
| Експорт | module.exports | export |
| Завантаження | Синхронне | Асинхронне |
| Тип даних | Копія значення | Жива посилання |
| Підтримка | Node.js (за замовчуванням) | Сучасний JS-стандарт |
| Розширення | .js | .mjs чи "type": "module" |
| Tree-shaking | Немає | Є |
| Сумісність | Старі пакети | Новий стандарт ES6+ |
CommonJS чудово підходить для серверного JS, а ESM - для браузерів і сучасних Node.js-проєктів.
8. Приклад відмінностей у коді
CommonJS:
const fs = require('fs');
module.exports = { readFile: fs.readFile };ES Modules:
import fs from 'fs';
export const readFile = fs.readFile;9. Чому CommonJS синхронний
CommonJS був спроєктований для серверного середовища, де:
- файли розташовані на локальному диску;
- синхронне читання модулів не спричиняє проблем із продуктивністю.
Тому:
const math = require('./math');→ виконується під час запуску, не чекаючи асинхронних операцій.
А от у браузері це б "підвісило" сторінку, тому в ESM завантаження модулів - асинхронне.
10. Коротко: основні об'єкти CommonJS
| Об'єкт | Призначення |
|---|---|
require() | Імпортує модуль |
module.exports | Об'єкт, що експортується з модуля |
exports | Спрощене посилання на module.exports |
__dirname | Шлях до папки поточного модуля |
__filename | Шлях до поточного файлу |
module | Інформація про поточний модуль |
11. Приклад - усе разом
// logger.js
console.log('Модуль завантажено:', __filename);
module.exports.log = (msg) => {
console.log(`[LOG]: ${msg}`);
};
// app.js
const logger = require('./logger');
logger.log('Привіт, CommonJS!');Вивід:
Модуль завантажено: /path/logger.js
[LOG]: Привіт, CommonJS!Одним реченням
CommonJS - це стандарт модульної системи JavaScript, у якому код організовано в окремі файли, він експортується через
module.exportsі імпортується за допомогоюrequire(). Саме CommonJS лежить в основі модульної архітектури Node.js.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.