Node.js suportă două sisteme de module: CommonJS (sistemul original, tradițional) și ES Modules (standardul modern JavaScript, denumit și ESM). Este esențial să înțelegeți diferențele, pentru că majoritatea proiectelor noi din 2026 folosesc ESM.
Module (CommonJS și ESM)
Node.js suportă două sisteme de module: CommonJS (sistemul original, tradițional) și ES Modules (standardul modern JavaScript, denumit și ESM). Este esenți...
Introducere
CommonJS (CJS)
Sistemul implicit istoric al Node.js. Folosește require() pentru import și module.exports pentru export.
// matematica.js
function aduna(a, b) {
return a + b;
}
function scade(a, b) {
return a - b;
}
module.exports = { aduna, scade };
// index.js
const { aduna, scade } = require('./matematica');
console.log(aduna(5, 3)); // 8ES Modules (ESM)
Sistemul standard JavaScript, identic cu cel folosit în browser. Folosește import și export.
// matematica.js
export function aduna(a, b) {
return a + b;
}
export function scade(a, b) {
return a - b;
}
export default { aduna, scade };
// index.js
import { aduna, scade } from './matematica.js';
console.log(aduna(5, 3)); // 8Cum activați ESM
Node.js interpretează fișierele .js ca CommonJS implicit. Pentru a folosi ESM, aveți două opțiuni:
- Adăugați
"type": "module"înpackage.json- toate fișierele.jsdevin ESM - Redenumiți fișierele individuale cu extensia
.mjs
Similar, dacă proiectul e ESM dar aveți nevoie punctual de CommonJS, folosiți extensia .cjs.
Diferențe cheie
| Aspect | CommonJS | ES Modules |
|---|---|---|
| Import | require() | import |
| Export | module.exports | export / export default |
| Încărcare | Sincronă | Asincronă |
| Rezoluție | Dinamică (poate fi condiționată) | Statică (analizată la parse-time) |
__dirname/__filename | Disponibile implicit | Nu există - se obțin din import.meta.url |
| Top-level await | Nu este suportat | Suportat nativ |
__dirname în ESM
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
console.log(__dirname);Interoperabilitate CJS și ESM
- Un fișier ESM poate importa un pachet CommonJS cu
import(funcționează în majoritatea cazurilor) - Un fișier CommonJS nu poate face
require()direct pe un pachet care este exclusiv ESM - trebuie folositimport()dinamic (care returnează o Promise)
// Import dinamic al unui pachet ESM dintr-un fișier CommonJS
async function incarca() {
const modul = await import('pachet-doar-esm');
modul.functie();
}Module built-in (native)
| Modul | Rol |
|---|---|
fs | Operații cu fișiere (citire, scriere, ștergere) |
path | Manipulare căi de fișiere/directoare, compatibil cross-platform |
http / https | Crearea serverelor și clienților HTTP |
os | Informații despre sistemul de operare |
crypto | Criptare, hashing, generare de tokenuri |
events | Clasa EventEmitter, la baza multor API-uri Node |
util | Utilitare diverse (ex: promisify) |
child_process | Rulare comenzi și scripturi externe |
worker_threads | Fire de execuție reale, pentru sarcini CPU-intensive |
// Import module native în ESM - se recomandă prefixul "node:"
import fs from 'node:fs';
import path from 'node:path';
import { EventEmitter } from 'node:events';
"type": "module"). Este standardul modern, sincronizat cu sintaxa din browser, și viitorul ecosistemului JavaScript.
Continuați cu restul cursului
Acesta este capitolul 3 din cele 14 ale cursului, cu 8 lecții din 85. Cumpărați cursul și parcurgeți tot conținutul în cont, cu progres salvat, test final și certificat.
Cumpărați cursul la 110 €