Capitol gratuit

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

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.

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)); // 8

ES 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)); // 8

Cum activați ESM

Node.js interpretează fișierele .js ca CommonJS implicit. Pentru a folosi ESM, aveți două opțiuni:

  1. Adăugați "type": "module" în package.json - toate fișierele .js devin ESM
  2. 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

AspectCommonJSES Modules
Importrequire()import
Exportmodule.exportsexport / export default
ÎncărcareSincronăAsincronă
RezoluțieDinamică (poate fi condiționată)Statică (analizată la parse-time)
__dirname/__filenameDisponibile implicitNu există - se obțin din import.meta.url
Top-level awaitNu este suportatSuportat 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 folosit import() 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)

ModulRol
fsOperații cu fișiere (citire, scriere, ștergere)
pathManipulare căi de fișiere/directoare, compatibil cross-platform
http / httpsCrearea serverelor și clienților HTTP
osInformații despre sistemul de operare
cryptoCriptare, hashing, generare de tokenuri
eventsClasa EventEmitter, la baza multor API-uri Node
utilUtilitare diverse (ex: promisify)
child_processRulare comenzi și scripturi externe
worker_threadsFire 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';
Sfat: Pentru proiecte noi, folosiți ESM ("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 €