Eesti

Uurige CommonJS-i ja ES-moodulite, kahe domineeriva JavaScripti moodulsüsteemi, erinevusi koos praktiliste näidete ja teadmistega kaasaegse veebiarenduse jaoks.

Moodulsüsteemid: CommonJS vs. ES moodulid – põhjalik juhend

Pidevalt arenevas JavaScripti arendusmaailmas on modulaarsus skaleeritavate ja hooldatavate rakenduste loomise nurgakivi. Ajalooliselt on maastikul domineerinud kaks moodulsüsteemi: CommonJS ja ES-moodulid (ESM). Nende erinevuste, eeliste ja puuduste mõistmine on ülioluline igale JavaScripti arendajale, olgu ta siis töötamas front-end'is raamistikega nagu React, Vue või Angular, või back-end'is Node.js-iga.

Mis on moodulsüsteemid?

Moodulsüsteem pakub viisi koodi organiseerimiseks korduvkasutatavateks üksusteks, mida nimetatakse mooduliteks. Iga moodul kapseldab kindla funktsionaalsuse ja paljastab ainult need osad, mida teised moodulid peavad kasutama. See lähenemine soodustab koodi korduvkasutatavust, vähendab keerukust ja parandab hooldatavust. Mõelge moodulitest kui ehitusplokkidest; igal plokil on kindel eesmärk ja te saate neid kombineerida, et luua suuremaid ja keerukamaid struktuure.

Moodulsüsteemide kasutamise eelised:

CommonJS: Node.js-i standard

CommonJS kujunes standardseks moodulsüsteemiks Node.js-i jaoks, mis on populaarne JavaScripti käituskeskkond serveripoolseks arenduseks. See loodi selleks, et lahendada sisseehitatud moodulsüsteemi puudumine JavaScriptis, kui Node.js esmakordselt loodi. Node.js võttis CommonJS-i omaks oma koodi organiseerimise viisina. Sellel valikul oli sügav mõju sellele, kuidas JavaScripti rakendusi serveripoolel ehitati.

CommonJS-i põhijooned:

CommonJS süntaks:

Siin on näide, kuidas CommonJS-i kasutatakse:

Moodul (math.js):

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

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

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

Kasutus (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-i eelised:

CommonJS-i puudused:

ES-moodulid (ESM): standardiseeritud JavaScripti moodulsüsteem

ES-moodulid (ESM) on JavaScripti ametlik standardiseeritud moodulsüsteem, mis võeti kasutusele ECMAScript 2015-ga (ES6). Nende eesmärk on pakkuda ühtset ja tõhusat viisi koodi organiseerimiseks nii Node.js-is kui ka veebilehitsejas. ESM toob natiivse moodulitoe otse JavaScripti keelde, kaotades vajaduse väliste teekide või ehitustööriistade järele modulaarsuse haldamiseks.

ES-moodulite põhijooned:

ES-moodulite süntaks:

Siin on näide, kuidas ES-mooduleid kasutatakse:

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

Kasutus (app.js):

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

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

Nimega eksport vs. vaike-eksport:

ES-moodulid toetavad nii nimega kui ka vaike-eksporti. Nimega eksport võimaldab eksportida moodulist mitu väärtust kindlate nimedega. Vaike-eksport võimaldab eksportida ühe väärtuse mooduli vaike-ekspordina.

Nimega ekspordi näide (utils.js):

// utils.js
export function formatCurrency(amount, currencyCode) {
 // Vorminda summa vastavalt valuutakoodile
 // Näide: formatCurrency(1234.56, 'USD') võib tagastada '$1,234.56'
 // Implementatsioon sõltub soovitud vormingust ja olemasolevatest teekidest
 return new Intl.NumberFormat('en-US', { style: 'currency', currency: currencyCode }).format(amount);
}

export function formatDate(date, locale) {
 // Vorminda kuupäev vastavalt lokaadile
 // Näide: formatDate(new Date(), 'fr-CA') võib tagastada '2024-01-01'
 return new Intl.DateTimeFormat(locale).format(date);
}
// app.js
import { formatCurrency, formatDate } from './utils.js';

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

console.log(price); // Väljund: €19.99
console.log(today); // Väljund: (varieerub vastavalt kuupäevale)

Vaike-ekspordi näide (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-moodulite eelised:

ES-moodulite puudused:

CommonJS vs. ES moodulid: detailne võrdlus

Siin on tabel, mis võtab kokku peamised erinevused CommonJS-i ja ES-moodulite vahel:

Tunnus CommonJS ES moodulid
Impordi süntaks require() import
Ekspordi süntaks module.exports export
Laadimine Sünkroonne Asünkroonne (brauserites), sünkroonne/asünkroonne Node.js-is
Staatiline analüüs Ei Jah
Natiivne brauseritugi Ei Jah
Peamine kasutusjuht Node.js (ajalooliselt) Brauserid ja Node.js (kaasaegne)

Praktilised näited ja kasutusjuhud

Näide 1: korduvkasutatava utiliidimooduli loomine (rahvusvahelistamine)

Oletame, et ehitate veebirakendust, mis peab toetama mitut keelt. Saate luua korduvkasutatava utiliidimooduli rahvusvahelistamise (i18n) haldamiseks.

ES-moodulid (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'; // Näide: kasutaja valis prantsuse keele
const greeting = getTranslation('greeting', language);
console.log(greeting); // Output: Bonjour, le monde !

Näide 2: modulaarse API-kliendi ehitamine (REST API)

REST API-ga suheldes saate luua modulaarse API-kliendi, et kapseldada API loogikat.

ES-moodulid (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('Viga kasutajate toomisel:', error));

post('/users', { name: 'John Doe', email: 'john.doe@example.com' })
 .then(newUser => console.log('Uus kasutaja loodud:', newUser))
 .catch(error => console.error('Viga kasutaja loomisel:', error));

Migreerumine CommonJS-ilt ES-moodulitele

Migreerumine CommonJS-ilt ES-moodulitele võib olla keeruline protsess, eriti suurtes koodibaasides. Siin on mõned strateegiad, mida kaaluda:

Node.js ja ES-moodulid:

Node.js on arenenud, et toetada täielikult ES-mooduleid. Saad kasutada ES-mooduleid Node.js-is järgmiselt:

Õige moodulsüsteemi valimine

Valik CommonJS-i ja ES-moodulite vahel sõltub sinu konkreetsetest vajadustest ja arenduskeskkonnast:

Kokkuvõte

CommonJS-i ja ES-moodulite erinevuste mõistmine on iga JavaScripti arendaja jaoks hädavajalik. Kuigi CommonJS on ajalooliselt olnud Node.js-i standard, on ES-moodulid kiiresti muutumas eelistatud valikuks nii brauseritele kui ka Node.js-ile tänu nende standardiseeritud olemusele, jõudluseelistele ja staatilise analüüsi toele. Hoolikalt kaaludes oma projekti vajadusi ja arenduskeskkonda, saad valida moodulsüsteemi, mis sobib kõige paremini sinu nõudmistega, ning ehitada skaleeritavaid, hooldatavaid ja tõhusaid JavaScripti rakendusi.

Kuna JavaScripti ökosüsteem areneb pidevalt, on edu saavutamiseks ülioluline olla kursis viimaste moodulsüsteemide trendide ja parimate tavadega. Jätka katsetamist nii CommonJS-i kui ka ES-moodulitega ning uuri erinevaid tööriistu ja tehnikaid, mis aitavad sul ehitada modulaarset ja hooldatavat JavaScripti koodi.