Capitol gratuit

Ce este Node.js și event loop

Node.js este un mediu de execuție (runtime) JavaScript în afara browserului, construit pe motorul V8 al Google Chrome. A fost creat de Ryan Dahl în 2009, p...

Introducere

Node.js este un mediu de execuție (runtime) JavaScript în afara browserului, construit pe motorul V8 al Google Chrome. A fost creat de Ryan Dahl în 2009, pornind de la o idee simplă: dacă JavaScript rulează rapid în browser datorită V8, de ce nu l-am folosi și pe server?

Node.js a schimbat modul în care este perceput JavaScript - dintr-un limbaj limitat la interacțiuni în pagina web, într-un limbaj complet, capabil să construiască servere, API-uri, aplicații în timp real, instrumente de linie de comandă și multe altele.

Caracteristici cheie

  • I/O non-blocant - operațiile de citire/scriere (fișiere, rețea, baze de date) nu blochează execuția restului codului
  • Single-threaded cu event loop - un singur fir de execuție principal, dar capabil să gestioneze mii de conexiuni simultane
  • npm - cel mai mare ecosistem de pachete open-source din lume, cu peste 2 milioane de pachete
  • JavaScript peste tot - același limbaj pe frontend și backend, cu partajare de cod și modele de date
  • Bazat pe libuv - biblioteca C++ care oferă acces la operațiile de sistem asincrone (fișiere, rețea, timere)

Scurt istoric

AnEveniment
2009Ryan Dahl lansează Node.js, bazat pe motorul V8
2010Apare npm (Node Package Manager), creat de Isaac Schlueter
2011npm este integrat implicit în instalarea Node.js
2014Fork-ul io.js, din cauza dezacordurilor legate de guvernanța proiectului
2015io.js se reunifică cu Node.js sub Node.js Foundation
2015Lansarea primului sistem de versiuni LTS (Long Term Support)
2019Node.js Foundation fuzionează cu JS Foundation, formând OpenJS Foundation
2021Introducerea suportului stabil pentru ES Modules (ESM)
2023-2024Fetch API, test runner și watch mode native, fără dependențe externe
2026Node.js 24 este versiunea Active LTS, Node.js 26 este versiunea Current
Sfat: Versiunile Node.js se schimbă frecvent. Verificați starea curentă a versiunilor LTS la nodejs.org înainte de a începe un proiect nou.

Event loop - inima Node.js

Deși JavaScript rulează pe un singur fir de execuție (single-thread), Node.js poate gestiona mii de operații simultane datorită event loop-ului. Mecanismul funcționează astfel:

  1. Codul sincron rulează pe call stack (stiva de apeluri)
  2. Operațiile asincrone (citire fișier, cerere HTTP, timer) sunt delegate către libuv, care le execută în fundal (thread pool sau kernel-ul sistemului de operare)
  3. Când operația se termină, callback-ul asociat este pus într-o coadă (queue)
  4. Event loop-ul verifică în mod continuu dacă stiva de apeluri este goală - dacă da, preia următorul callback din coadă și îl execută

Fazele event loop-ului

FazăCe execută
timersCallback-urile programate cu setTimeout() și setInterval()
pending callbacksCallback-uri de sistem amânate din ciclul anterior
idle, prepareUtilizare internă Node.js
pollPreia evenimente noi de I/O, execută callback-uri legate de rețea/fișiere
checkCallback-urile programate cu setImmediate()
close callbacksEvenimente de tip close (ex: socket.on('close', ...))

Pe lângă cele șase faze, există și coada de micro-task-uri (process.nextTick() și Promise-uri rezolvate), care se execută între fiecare fază, înaintea trecerii la faza următoare.

console.log('1 - start');

setTimeout(() => console.log('2 - setTimeout'), 0);

Promise.resolve().then(() => console.log('3 - promise'));

process.nextTick(() => console.log('4 - nextTick'));

console.log('5 - end');

// Ordinea afișată:
// 1 - start
// 5 - end
// 4 - nextTick   (microtask, prioritate maximă)
// 3 - promise    (microtask)
// 2 - setTimeout (macrotask, faza timers)
Atenție: Codul sincron „greu" (calcule intensive, bucle mari) blochează event loop-ul și toate cererile care așteaptă să fie procesate. Pentru operații CPU-intensive folosiți worker_threads sau procese separate, nu blocați firul principal.

Când e potrivit Node.js și când nu

Potrivit pentruMai puțin potrivit pentru
API-uri REST și GraphQLCalcule matematice grele (procesare imagine/video la scară mare)
Aplicații în timp real (chat, notificări, WebSockets)Procesare intensivă a datelor (machine learning nativ)
MicroserviciiAplicații care necesită paralelism CPU masiv fără worker threads
Streaming de date (fișiere mari, video)
Instrumente de linie de comandă (CLI)

Continuați cu restul cursului

Acesta este capitolul 1 din cele 14 ale cursului, cu 6 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 €