Hrvatski

Istražite razlike između CommonJS i ES modula, dva dominantna sustava modula u JavaScriptu, s praktičnim primjerima i uvidima za moderni web razvoj.

Sustavi modula: CommonJS vs. ES moduli - Sveobuhvatni vodič

U svijetu JavaScript razvoja koji se neprestano razvija, modularnost je temelj izgradnje skalabilnih aplikacija koje se lako održavaju. Dva sustava modula povijesno su dominirala krajolikom: CommonJS i ES moduli (ESM). Razumijevanje njihovih razlika, prednosti i nedostataka ključno je za svakog JavaScript programera, bez obzira radi li na front-endu s okvirima poput Reacta, Vuea ili Angulara, ili na back-endu s Node.js-om.

Što su sustavi modula?

Sustav modula pruža način organiziranja koda u jedinice za višekratnu upotrebu koje se nazivaju moduli. Svaki modul enkapsulira određeni dio funkcionalnosti i izlaže samo one dijelove koje drugi moduli trebaju koristiti. Ovaj pristup promiče ponovnu upotrebu koda, smanjuje složenost i poboljšava mogućnost održavanja. Razmišljajte o modulima kao o građevnim blokovima; svaki blok ima određenu svrhu, a možete ih kombinirati kako biste stvorili veće i složenije strukture.

Prednosti korištenja sustava modula:

CommonJS: Node.js Standard

CommonJS se pojavio kao standardni sustav modula za Node.js, popularno JavaScript runtime okruženje za razvoj na strani poslužitelja. Dizajniran je da riješi nedostatak ugrađenog sustava modula u JavaScriptu kada je Node.js prvi put stvoren. Node.js je usvojio CommonJS kao svoj način organiziranja koda. Ovaj izbor imao je dubok utjecaj na način na koji su se JavaScript aplikacije gradile na strani poslužitelja.

Ključne značajke CommonJS-a:

CommonJS sintaksa:

Evo primjera kako se koristi CommonJS:

Modul (math.js):

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

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

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

Upotreba (app.js):

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

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

Prednosti CommonJS-a:

Nedostaci CommonJS-a:

ES moduli (ESM): Standardizirani sustav JavaScript modula

ES moduli (ESM) su službeni standardizirani sustav modula za JavaScript, uveden s ECMAScript 2015 (ES6). Cilj im je pružiti dosljedan i učinkovit način organiziranja koda u Node.js-u i u pregledniku. ESM donosi izvornu podršku za module samom JavaScript jeziku, eliminirajući potrebu za vanjskim bibliotekama ili alatima za izgradnju za rukovanje modularnošću.

Ključne značajke ES modula:

ES moduli sintaksa:

Evo primjera kako se koriste ES moduli:

Modul (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 };

Upotreba (app.js):

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

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

Imenovani izvozi (Named Exports) vs. Zadani izvozi (Default Exports):

ES moduli podržavaju imenovane i zadane izvoze. Imenovani izvozi omogućuju vam izvoz više vrijednosti iz modula s određenim imenima. Zadani izvozi omogućuju vam izvoz jedne vrijednosti kao zadani izvoz modula.

Primjer imenovanog izvoza (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)

Primjer zadanog izvoza (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));

Prednosti ES modula:

Nedostaci ES modula:

CommonJS vs. ES moduli: Detaljna usporedba

Evo tablice koja sažima ključne razlike između CommonJS-a i ES modula:

Značajka CommonJS ES moduli
Sintaksa uvoza require() import
Sintaksa izvoza module.exports export
Učitavanje Sinkrono Asinkrono (u preglednicima), sinkrono/asinkrono u Node.js-u
Statička analiza Ne Da
Izvorna podrška preglednika Ne Da
Primarni slučaj upotrebe Node.js (povijesno) Preglednici i Node.js (moderno)

Praktični primjeri i slučajevi upotrebe

Primjer 1: Stvaranje modula uslužnih programa za višekratnu upotrebu (Internacionalizacija)

Recimo da gradite web aplikaciju koja mora podržavati više jezika. Možete stvoriti modul uslužnih programa za višekratnu upotrebu za rukovanje internacionalizacijom (i18n).

ES moduli (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 !

Primjer 2: Izgradnja modularnog API klijenta (REST API)

Prilikom interakcije s REST API-jem, možete stvoriti modularni API klijent za enkapsulaciju API logike.

ES moduli (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));

Migracija s CommonJS-a na ES module

Migracija s CommonJS-a na ES module može biti složen proces, posebno u velikim bazama koda. Evo nekoliko strategija koje treba razmotriti:

Node.js i ES moduli:

Node.js je evoluirao kako bi u potpunosti podržao ES module. Možete koristiti ES module u Node.js-u:

Odabir pravog sustava modula

Izbor između CommonJS-a i ES modula ovisi o vašim specifičnim potrebama i okruženju u kojem razvijate:

Zaključak

Razumijevanje razlika između CommonJS-a i ES modula ključno je za svakog JavaScript programera. Iako je CommonJS povijesno bio standard za Node.js, ES moduli brzo postaju preferirani izbor za preglednike i Node.js zbog svoje standardizirane prirode, prednosti performansi i podrške za statičku analizu. Pažljivim razmatranjem potreba vašeg projekta i okruženja u kojem razvijate, možete odabrati sustav modula koji najbolje odgovara vašim zahtjevima i izgraditi skalabilne, održive i učinkovite JavaScript aplikacije.

Kako se JavaScript ekosustav nastavlja razvijati, informiranje o najnovijim trendovima sustava modula i najboljim praksama ključno je za uspjeh. Nastavite eksperimentirati s CommonJS-om i ES modulima i istražite razne alate i tehnike dostupne da vam pomognu u izgradnji modularnog i održivog JavaScript koda.