Norsk

Utforsk forskjellene mellom CommonJS og ES-moduler, de to dominerende modulsystemene i JavaScript, med praktiske eksempler og innsikt for moderne webutvikling.

Modulsystemer: CommonJS vs. ES-moduler - En omfattende guide

I den stadig utviklende verden av JavaScript-utvikling er modularitet en hjørnestein i å bygge skalerbare og vedlikeholdbare applikasjoner. To modulsystemer har historisk dominert landskapet: CommonJS og ES-moduler (ESM). Å forstå deres forskjeller, fordeler og ulemper er avgjørende for enhver JavaScript-utvikler, enten de jobber på front-end med rammeverk som React, Vue eller Angular, eller på back-end med Node.js.

Hva er modulsystemer?

Et modulsystem gir en måte å organisere kode i gjenbrukbare enheter kalt moduler. Hver modul innkapsler en spesifikk funksjonalitet og eksponerer bare de delene som andre moduler trenger å bruke. Denne tilnærmingen fremmer gjenbruk av kode, reduserer kompleksiteten og forbedrer vedlikeholdbarheten. Tenk på moduler som byggeklosser; hver blokk har et spesifikt formål, og du kan kombinere dem for å lage større, mer komplekse strukturer.

Fordeler med å bruke modulsystemer:

CommonJS: Node.js-standarden

CommonJS dukket opp som standardmodulsystemet for Node.js, det populære JavaScript-kjøremiljøet for server-side utvikling. Det ble designet for å adressere mangelen på et innebygd modulsystem i JavaScript da Node.js først ble opprettet. Node.js adopterte CommonJS som sin måte å organisere kode på. Dette valget hadde en dyp innvirkning på hvordan JavaScript-applikasjoner ble bygget på server-siden.

Viktige funksjoner i CommonJS:

CommonJS-syntaks:

Her er et eksempel på hvordan CommonJS brukes:

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

Bruk (app.js):

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

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

Fordeler med CommonJS:

Ulemper med CommonJS:

ES-moduler (ESM): Det standardiserte JavaScript-modulsystemet

ES-moduler (ESM) er det offisielle standardiserte modulsystemet for JavaScript, introdusert med ECMAScript 2015 (ES6). De har som mål å gi en konsistent og effektiv måte å organisere kode på i både Node.js og nettleseren. ESM bringer opprinnelig modulstøtte til selve JavaScript-språket, og eliminerer behovet for eksterne biblioteker eller byggeverktøy for å håndtere modularitet.

Viktige funksjoner i ES-moduler:

ES-moduler-syntaks:

Her er et eksempel på hvordan ES-moduler brukes:

Modul (math.js):

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

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

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

Bruk (app.js):

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

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

Navngitte eksporter vs. standardeksporter:

ES-moduler støtter både navngitte og standardeksporter. Navngitte eksporter lar deg eksportere flere verdier fra en modul med spesifikke navn. Standardeksporter lar deg eksportere en enkelt verdi som standardeksporten av en modul.

Eksempel på navngitt eksport (utils.js):

// utils.js
export function formatCurrency(amount, currencyCode) {
 // Formater beløpet i henhold til valutakoden
 // Eksempel: formatCurrency(1234.56, 'USD') kan returnere '$1,234.56'
 // Implementering avhenger av ønsket formatering og tilgjengelige biblioteker
 return new Intl.NumberFormat('en-US', { style: 'currency', currency: currencyCode }).format(amount);
}

export function formatDate(date, locale) {
 // Formater datoen i henhold til lokaliteten
 // Eksempel: formatDate(new Date(), 'fr-CA') kan returnere '2024-01-01'
 return new Intl.DateTimeFormat(locale).format(date);
}
// app.js
import { formatCurrency, formatDate } from './utils.js';

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

console.log(price); // Output: €19.99
console.log(today); // Output: (varierer basert på dato)

Standardeksporteksempel (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));

Fordeler med ES-moduler:

Ulemper med ES-moduler:

CommonJS vs. ES-moduler: En detaljert sammenligning

Her er en tabell som oppsummerer de viktigste forskjellene mellom CommonJS og ES-moduler:

Funksjon CommonJS ES-moduler
Import Syntaks require() import
Eksport Syntaks module.exports export
Lasting Synkron Asynkron (i nettlesere), Synkron/Asynkron i Node.js
Statisk Analyse Nei Ja
Opprinnelig Nettleserstøtte Nei Ja
Primær Bruksområde Node.js (historisk) Nettlesere og Node.js (moderne)

Praktiske eksempler og brukstilfeller

Eksempel 1: Opprette en gjenbrukbar verktøymodul (internasjonalisering)

La oss si at du bygger en webapplikasjon som trenger å støtte flere språk. Du kan opprette en gjenbrukbar verktøymodul for å håndtere internasjonalisering (i18n).

ES-moduler (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'; // Eksempel: Bruker valgte fransk
const greeting = getTranslation('greeting', language);
console.log(greeting); // Output: Bonjour, le monde !

Eksempel 2: Bygge en modulær API-klient (REST API)

Når du samhandler med et REST API, kan du opprette en modulær API-klient for å innkapsle API-logikken.

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

Migrere fra CommonJS til ES-moduler

Å migrere fra CommonJS til ES-moduler kan være en kompleks prosess, spesielt i store kodebaser. Her er noen strategier du bør vurdere:

Node.js og ES-moduler:

Node.js har utviklet seg til å fullt ut støtte ES-moduler. Du kan bruke ES-moduler i Node.js ved å:

Velge riktig modulsystem

Valget mellom CommonJS og ES-moduler avhenger av dine spesifikke behov og miljøet du utvikler i:

Konklusjon

Å forstå forskjellene mellom CommonJS og ES-moduler er avgjørende for enhver JavaScript-utvikler. Mens CommonJS historisk har vært standarden for Node.js, blir ES-moduler raskt det foretrukne valget for både nettlesere og Node.js på grunn av deres standardiserte natur, ytelsesfordeler og støtte for statisk analyse. Ved nøye å vurdere prosjektets behov og miljøet du utvikler i, kan du velge modulsystemet som best passer dine krav og bygge skalerbare, vedlikeholdbare og effektive JavaScript-applikasjoner.

Ettersom JavaScript-økosystemet fortsetter å utvikle seg, er det avgjørende for å lykkes å holde seg informert om de siste modulsystemtrendene og beste praksis. Fortsett å eksperimentere med både CommonJS og ES-moduler, og utforsk de forskjellige verktøyene og teknikkene som er tilgjengelige for å hjelpe deg med å bygge modulær og vedlikeholdbar JavaScript-kode.