Moduł 1 · Wprowadzenie do Node.js
Jak działa Node.js — V8, event loop i non-blocking I/O
Jak działa Node.js pod maską
Node.js to środowisko uruchomieniowe JavaScript po stronie serwera, zbudowane na silniku V8 — tym samym, który napędza przeglądarkę Google Chrome. Dzięki temu kod JavaScript, który znasz z frontendu, działa teraz bezpośrednio na serwerze, bez przeglądarki.
Silnik V8
V8 to kompilator JIT (Just-In-Time) napisany w C++. Zamiast interpretować kod JS linia po linii, V8 kompiluje go do natywnego kodu maszynowego tuż przed wykonaniem. To sprawia, że Node.js jest zaskakująco szybki jak na język interpretowany.
Single-threaded, ale wydajny
Node.js działa w jednym wątku — w przeciwieństwie do np. Apache, który tworzy nowy wątek dla każdego żądania HTTP. Brzmi jak wada, ale to celowy projekt architektoniczny.
Kluczem jest Event Loop — pętla zdarzeń, która nieustannie sprawdza, czy są nowe zadania do wykonania.
Event Loop krok po kroku
┌───────────────────────────┐
┌─>│ timers │ ← setTimeout, setInterval
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ pending callbacks │ ← błędy I/O z poprzedniej iteracji
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ poll (I/O) │ ← pobieranie nowych zdarzeń I/O
│ └─────────────┬─────────────┘
│ ┌─────────────┴─────────────┐
│ │ check │ ← setImmediate
└──┴───────────────────────────┘Non-blocking I/O
Kiedy Node.js wykonuje operację I/O (odczyt pliku, zapytanie do bazy, request HTTP), nie blokuje głównego wątku. Zamiast czekać na wynik, rejestruje callback i przechodzi do kolejnego zadania.
// Blocking (zły wzorzec w Node.js)
const data = fs.readFileSync('plik.txt'); // wątek czeka!
console.log(data);
// Non-blocking (prawidłowy wzorzec)
fs.readFile('plik.txt', (err, data) => {
console.log(data); // wykonuje się gdy dane są gotowe
});
console.log('To wykona się PRZED odczytem pliku!');Kiedy Node.js świeci, a kiedy nie?
Node.js jest idealny dla:
- API REST i GraphQL
- Aplikacji real-time (chat, notyfikacje)
- Microservices
- Proxy i API Gateway
Unikaj Node.js przy:
- Obliczeniach CPU-intensive (szyfrowanie, przetwarzanie wideo)
- Aplikacjach wymagających równoległości na poziomie wątków
Rozumiejąc event loop, wiesz już dlaczego Node.js może obsłużyć tysiące równoczesnych połączeń przy minimalnym zużyciu pamięci — to fundament wszystkiego, co będziemy budować w tym kursie.