JavaScript to język programowania; Node.js to środowisko uruchomieniowe, czyli program, który wykonuje JavaScript poza przeglądarką. Składnia, typy i standardowe obiekty (Array, Promise, JSON) są w obu takie same. Zmienia się otoczenie twojego kodu: przeglądarka daje ci window i document do pracy ze stroną, a Node.js daje global, process, require i moduły takie jak fs do pracy z plikami, serwerami i systemem operacyjnym.
Globalne obiekty przeglądarki wypisały undefined, te z Node.js object albo function, a ostatnia linia true, bo w Node.js globalThis i global to ten sam obiekt. Wklej sześć pierwszych linii do konsoli przeglądarki, a wyniki się odwrócą.
Różnica w jednej tabeli
| JavaScript w przeglądarce | JavaScript w Node.js | |
|---|---|---|
| Czym jest | Język wykonywany przez silnik przeglądarki | Ten sam język wykonywany przez środowisko Node.js (V8) |
| Obiekt globalny | window | global |
| Na czym pracuje | Na stronie: document, DOM, zdarzenia | Na maszynie: fs, http, process, os |
| Moduły | <script type="module">, import | require (CommonJS) i import (moduły ES) |
| Pakiety | Wbudowane w stronę przez bundler | Instalowane przez npm do node_modules |
| Wejście | Kliknięcia, formularze, zdarzenia klawiatury | Argumenty wiersza poleceń, standardowe wejście, żądania HTTP |
Array, Promise, JSON, setTimeout, console | Tak | Tak |
Najwięcej zamieszania robi wiersz o modułach. Node.js obsługuje oba systemy, require i import, a przeglądarki rozumieją tylko import. Strona CommonJS vs moduły ES wyjaśnia, który wybrać.
Język jest ten sam
Funkcja, która używa tylko języka, działa wszędzie. Ten blok nie ma w sobie nic specyficznego dla Node i w przeglądarce wypisałby te same linie:
Wypisało {"best":95,"average":85} i Passed: 2 of 3. Składnia spread, reduce, template stringi i JSON należą do języka, zdefiniowanego przez standard ECMAScript, więc ma je każde środowisko.
Co ma tylko Node.js
Część specyficzna dla Node to zestaw wbudowanych modułów i obiektów globalnych, które rozmawiają z systemem operacyjnym:
Zapisało plik, odczytało go z powrotem i wypisało .txt 2 lines, a potem pustą listę argumentów. Ani dostęp do plików, ani process.argv nie istnieją w przeglądarce, gdzie strona nie może dotknąć twojego dysku.
Jakie funkcje języka dostajesz
Język ma wersje (ES2015, ES2020, ES2024 i tak dalej), a każdy silnik dodaje nowe funkcje we własnym tempie. Node.js w każdym wydaniu zawiera konkretny silnik V8, więc to twoja wersja Node.js decyduje, które funkcje działają: na przykład Object.groupBy i Array.prototype.findLast wymagają nowej wersji. Tabela kompatybilności przeglądarek pokazuje więc Node.js jako kolejną kolumnę obok Chrome, Firefox i Safari. Uruchom node --version, gdy nowsza składnia kończy się SyntaxError albo metoda jest undefined, i zaktualizuj Node, zanim sięgniesz po polyfill.
Kod, który działa w obu
Autorzy bibliotek czasem sprawdzają, gdzie działa ich kod, zanim użyją API specyficznego dla środowiska:
const isNode = typeof process !== 'undefined' && process.versions?.node != null;
const isBrowser = typeof window !== 'undefined';
Jeśli możesz, sprawdzaj funkcję, której potrzebujesz, a nie nazwę środowiska: typeof fetch === 'function' mówi więcej niż "czy to Node". Oba mają dziś fetch, URL, TextEncoder, setTimeout i structuredClone, więc mniej kodu wymaga sprawdzania niż kilka lat temu.
Częste błędy
Używanie document albo window w skrypcie Node.js. Dostaniesz ReferenceError: document is not defined. Ten kod należy do przeglądarki.
Używanie require w przeglądarce. Przeglądarki go nie mają. Użyj import albo bundlera, który zamieni wywołania require w jeden plik.
Myślenie, że Node.js to inny język. To nie jest inny język. Jeśli tutorial JavaScript czegoś uczy, działa to w Node.js, chyba że używa DOM.
Najczęściej zadawane pytania
Czy mogę nauczyć się Node.js bez nauki JavaScript?
Nie bardzo. Każda linia, którą piszesz w Node.js, to JavaScript, więc język jest pierwszy. Gdy znasz funkcje, obiekty i promise, Node.js to zestaw dodatkowych API do nauczenia.
Dlaczego w Node.js dostaję "document is not defined"?
document to DOM przeglądarki, a Node.js nie ma strony, która by ci go dała. Kod, który dotyka document albo window, musi działać w przeglądarce albo w środowisku testowym, które udaje DOM, np. jsdom.
Czy TypeScript to to samo co Node.js?
Nie. TypeScript to typowana wersja JavaScript, która kompiluje się do JavaScript. Wynik uruchomisz w Node.js albo w przeglądarce, a nowe wersje Node.js potrafią też uruchamiać wiele plików .ts bezpośrednio, usuwając typy.