Українська

Дізнайтеся про відмінності між CommonJS та ES Modules, двома домінуючими системами модулів у JavaScript, з практичними прикладами та інформацією для сучасної веб-розробки.

Системи модулів: CommonJS проти ES Modules – вичерпний посібник

У постійно мінливому світі розробки JavaScript модульність є наріжним каменем створення масштабованих і підтримуваних додатків. Історично склалося так, що в цій сфері домінували дві системи модулів: CommonJS та ES Modules (ESM). Розуміння їхніх відмінностей, переваг і недоліків є вирішальним для будь-якого розробника JavaScript, незалежно від того, чи працює він на front-end з такими фреймворками, як React, Vue або Angular, або на back-end з Node.js.

Що таке системи модулів?

Система модулів забезпечує спосіб організації коду в повторно використовувані одиниці, які називаються модулями. Кожен модуль інкапсулює певну функцію та надає лише ті частини, які необхідні іншим модулям для використання. Цей підхід сприяє повторному використанню коду, зменшує складність і покращує зручність обслуговування. Думайте про модулі як про будівельні блоки; кожен блок має певну мету, і ви можете поєднувати їх для створення більших і складніших структур.

Переваги використання систем модулів:

CommonJS: стандарт Node.js

CommonJS з’явився як стандартна система модулів для Node.js, популярного середовища виконання JavaScript для розробки на стороні сервера. Він був розроблений для вирішення відсутності вбудованої системи модулів у JavaScript, коли Node.js було вперше створено. Node.js прийняв CommonJS як спосіб організації коду. Цей вибір мав глибокий вплив на те, як створювалися програми JavaScript на стороні сервера.

Основні функції CommonJS:

Синтаксис CommonJS:

Ось приклад використання CommonJS:

Модуль (math.js):

// math.js
function add(a, b) {
 return a + b;
}

function subtract(a, b) {
 return a - b;
}

module.exports = {
 add: add,
 subtract: subtract
};

Використання (app.js):

// app.js
const math = require('./math');

console.log(math.add(5, 3)); // Output: 8
console.log(math.subtract(10, 4)); // Output: 6

Переваги CommonJS:

Недоліки CommonJS:

ES Modules (ESM): Стандартизована система модулів JavaScript

ES Modules (ESM) — це офіційна стандартизована система модулів для JavaScript, представлена з ECMAScript 2015 (ES6). Вони мають на меті забезпечити узгоджений та ефективний спосіб організації коду як у Node.js, так і в браузері. ESM забезпечують нативну підтримку модулів для самої мови JavaScript, усуваючи потребу у зовнішніх бібліотеках або інструментах збирання для обробки модульності.

Основні функції ES Modules:

Синтаксис ES Modules:

Ось приклад використання ES Modules:

Модуль (math.js):

// math.js
export function add(a, b) {
 return a + b;
}

export function subtract(a, b) {
 return a - b;
}

// Or, alternatively:
// function add(a, b) {
//  return a + b;
// }
// function subtract(a, b) {
//  return a - b;
// }
// export { add, subtract };

Використання (app.js):

// app.js
import { add, subtract } from './math.js';

console.log(add(5, 3)); // Output: 8
console.log(subtract(10, 4)); // Output: 6

Іменований експорт проти експорту за замовчуванням:

ES Modules підтримують як іменований експорт, так і експорт за замовчуванням. Іменований експорт дозволяє експортувати кілька значень з модуля з певними іменами. Експорт за замовчуванням дозволяє експортувати одне значення як експорт за замовчуванням модуля.

Приклад іменованого експорту (utils.js):

// utils.js
export function formatCurrency(amount, currencyCode) {
 // Format the amount according to the currency code
 // Example: formatCurrency(1234.56, 'USD') might return '$1,234.56'
 // Implementation depends on desired formatting and available libraries
 return new Intl.NumberFormat('en-US', { style: 'currency', currency: currencyCode }).format(amount);
}

export function formatDate(date, locale) {
 // Format the date according to the locale
 // Example: formatDate(new Date(), 'fr-CA') might return '2024-01-01'
 return new Intl.DateTimeFormat(locale).format(date);
}
// app.js
import { formatCurrency, formatDate } from './utils.js';

const price = formatCurrency(19.99, 'EUR'); // Europe
const today = formatDate(new Date(), 'ja-JP'); // Japan

console.log(price); // Output: €19.99
console.log(today); // Output: (varies based on date)

Приклад експорту за замовчуванням (api.js):

// api.js
const api = {
 fetchData: async (url) => {
 const response = await fetch(url);
 return response.json();
 }
};

export default api;
// app.js
import api from './api.js';

api.fetchData('https://example.com/data')
 .then(data => console.log(data));

Переваги ES Modules:

Недоліки ES Modules:

CommonJS проти ES Modules: детальний порівняльний аналіз

Ось таблиця, що підсумовує ключові відмінності між CommonJS та ES Modules:

Функція CommonJS ES Modules
Синтаксис імпорту require() import
Синтаксис експорту module.exports export
Завантаження Синхронне Асинхронне (в браузерах), синхронне/асинхронне в Node.js
Статичний аналіз Ні Так
Нативна підтримка браузера Ні Так
Основний варіант використання Node.js (історично) Браузери та Node.js (сучасний)

Практичні приклади та випадки використання

Приклад 1: Створення повторно використовуваного модуля утиліт (інтернаціоналізація)

Припустимо, ви створюєте веб-додаток, який має підтримувати кілька мов. Ви можете створити повторно використовуваний модуль утиліт для обробки інтернаціоналізації (i18n).

ES Modules (i18n.js):

// i18n.js
const translations = {
 'en': {
 'greeting': 'Hello, world!'
 },
 'fr': {
 'greeting': 'Bonjour, le monde !'
 },
 'es': {
 'greeting': '¡Hola, mundo!'
 }
};

export function getTranslation(key, language) {
 return translations[language][key] || key;
}
// app.js
import { getTranslation } from './i18n.js';

const language = 'fr'; // Example: User selected French
const greeting = getTranslation('greeting', language);
console.log(greeting); // Output: Bonjour, le monde !

Приклад 2: Створення модульного клієнта API (REST API)

Під час взаємодії з REST API ви можете створити модульний клієнт API, щоб інкапсулювати логіку API.

ES Modules (apiClient.js):

// apiClient.js
const API_BASE_URL = 'https://api.example.com';

async function get(endpoint) {
 const response = await fetch(`${API_BASE_URL}${endpoint}`);
 if (!response.ok) {
 throw new Error(`HTTP error! status: ${response.status}`);
 }
 return response.json();
}

async function post(endpoint, data) {
 const response = await fetch(`${API_BASE_URL}${endpoint}`, {
 method: 'POST',
 headers: {
 'Content-Type': 'application/json'
 },
 body: JSON.stringify(data)
 });
 if (!response.ok) {
 throw new Error(`HTTP error! status: ${response.status}`);
 }
 return response.json();
}

export { get, post };
// app.js
import { get, post } from './apiClient.js';

get('/users')
 .then(users => console.log(users))
 .catch(error => console.error('Error fetching users:', error));

post('/users', { name: 'John Doe', email: 'john.doe@example.com' })
 .then(newUser => console.log('New user created:', newUser))
 .catch(error => console.error('Error creating user:', error));

Перехід з CommonJS на ES Modules

Перехід з CommonJS на ES Modules може бути складним процесом, особливо у великих кодових базах. Ось деякі стратегії, які слід враховувати:

Node.js та ES Modules:

Node.js розвинувся, щоб повністю підтримувати ES Modules. Ви можете використовувати ES Modules у Node.js, виконавши такі дії:

Вибір правильної системи модулів

Вибір між CommonJS та ES Modules залежить від ваших конкретних потреб і середовища, в якому ви розробляєте:

Висновок

Розуміння відмінностей між CommonJS та ES Modules є важливим для будь-якого розробника JavaScript. Хоча CommonJS історично був стандартом для Node.js, ES Modules швидко стають кращим вибором як для браузерів, так і для Node.js завдяки їх стандартизованому характеру, перевагам продуктивності та підтримці статичного аналізу. Ретельно враховуючи потреби вашого проекту та середовище, в якому ви розробляєте, ви можете вибрати систему модулів, яка найкраще відповідає вашим вимогам, і створити масштабовані, підтримувані та ефективні програми JavaScript.

Оскільки екосистема JavaScript продовжує розвиватися, дуже важливо бути в курсі останніх тенденцій системи модулів і найкращих практик. Продовжуйте експериментувати як з CommonJS, так і з ES Modules, а також вивчайте різноманітні інструменти та методи, які допоможуть вам створювати модульний та підтримуваний код JavaScript.