Slovník pojmů
Node.js
Node.js je runtime pro spuštění JavaScriptu mimo prohlížeč. Není to programovací jazyk, framework ani správce balíčků; je to prostředí, ve kterém JavaScriptový program běží.
Stručná definice
JavaScriptový program může běžet na serveru, v nástroji i v automatizaci.
JavaScript je programovací jazyk. Node.js je jeho runtime: dodá proces node, modulový systém a rozhraní pro síť, souborový systém, proměnné prostředí nebo spuštění dalších procesů. Díky tomu lze stejným jazykem vytvořit API server, worker, příkazový nástroj i build frontendových souborů.
Node.js používá JavaScript engine V8 mimo prohlížeč. V jednom procesu běžně vykonává JavaScript na hlavním vlákně a pro I/O využívá event loop a asynchronní mechanismy operačního systému či knihoven. Čekání na síť nebo disk proto nemusí blokovat celý proces. Dlouhý výpočet v běžném JavaScriptovém kódu ale event loop blokuje stejně spolehlivě, jako by byl napsaný synchronně.
Název se píše Node.js. V terminálu se používá příkaz node a v běžné řeči se často zkracuje na Node. Nezaměňuj jej s Node-API, což je samostatné rozhraní pro nativní doplňky, ani s npm, nástrojem pro práci s JavaScriptovými balíčky. TypeScript compiler, frontendové testy a build jsou typickými nástroji, které Node.js pouze spouští.
K čemu se používá
Od webového serveru po build a drobné automatizace
Node.js se hodí, když program pracuje se sítí, soubory, procesy nebo spouští opakovanou vývojovou práci. Samotná volba runtime ale neurčuje architekturu ani kvalitu aplikace.
- HTTP API, BFF služby a realtime servery
- workery, integrační úlohy a zpracování zpráv na pozadí
- CLI nástroje pro import, generování souborů a automatizaci
- vývojový server, bundling, lintování a testy frontendového projektu
- server-side rendering nebo build statického webu
- skripty v CI, pokud mají jasný vstup, výstup, logování a verzi runtime
Praktický příklad
Malý HTTP server bez frameworku
Tento příklad využívá vestavěný modul node:http. Je vhodný k pochopení, že Node.js umí otevřít síťový port a vracet HTTP odpověď i bez dalšího balíčku. Pro větší aplikaci však samotný server nestačí: je potřeba navrhnout routing, validaci, autentizaci, logování, chybové stavy a provozní dohled.
Soubor ulož jako server.js a spusť příkazem node server.js. Port 3000 je jen lokální ukázka; veřejný server nesmí bez rozmyslu poslouchat na všech rozhraních ani vracet citlivé informace v chybové odpovědi.
JavaScript
const { createServer } = require('node:http');
const server = createServer((request, response) => {
response.writeHead(200, { 'Content-Type': 'application/json' });
response.end(JSON.stringify({ status: 'ok' }));
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server běží na http://127.0.0.1:3000');
});
Jak funguje
Event loop nečeká na I/O, ale neurychlí těžký výpočet
Zjednodušený model pomáhá pochopit, proč Node.js dobře obslouží mnoho čekajících síťových operací a proč má zároveň své hranice.
- Příchod práce HTTP request, časovač, soubor nebo zpráva vyvolá callback či pokračování Promise.
- JavaScript na hlavním vlákně Node.js provede krátký kus aplikační logiky, například validaci vstupu a přípravu dotazu.
- Asynchronní I/O Síťová nebo souborová operace se předá mimo okamžité vykonávání JavaScriptu. Proces mezitím může obsluhovat další práci.
- Event loop Po dokončení I/O zařadí pokračování zpět do fronty událostí a JavaScript zpracuje výsledek.
- Odpověď a monitoring Aplikace vrátí výsledek, nebo bezpečně zachytí chybu. Délka requestů, využití paměti a chyby ukazují skutečné chování v provozu.
Důležitá rozlišení
Každá vrstva vývoje má jinou odpovědnost.
Tyto názvy se často objevují společně, ale každý označuje jinou vrstvu vývoje.
JavaScript
Programovací jazyk. Může běžet v prohlížeči, v Node.js a v dalších runtimes.
npm
CLI a ekosystém pro správu JavaScriptových balíčků. Oficiální instalace Node.js npm často obsahují, ale npm není samotný runtime ani automaticky veřejný registry.
Registry balíčků
Služba, ze které se balíčky stahují nebo do ní publikují. Projekt může používat veřejný npm registry, privátní registry, Git či lokální zdroj; registry a npm CLI nejsou stejná věc.
Framework
Například serverový či frontendový framework dává aplikaci konvence. Node.js jej pouze spouští; neurčuje routy, bezpečnost ani business pravidla.
Prohlížeč
Také spouští JavaScript, ale s jinými API, bezpečnostním modelem a životním cyklem. Kód pro Node.js nelze bez úpravy považovat za kód pro prohlížeč.
Důležité vlastnosti
Runtime, moduly a asynchronní práce mají odlišné role.
Porozumění těmto hranicím brání tomu, aby se Node.js bral jako automatická odpověď na každou serverovou úlohu.
Runtime, ne jazyk
Node.js spouští JavaScript. Syntaxi a jazykové konstrukce určuje JavaScript; Node.js přidává běhová API a způsob spuštění programu. TypeScript není náhradou runtime. Běžný toolchain jej převádí na JavaScript; současný Node.js navíc umí u podporované smazatelné TypeScript syntaxe typy odstranit za běhu, ale bez typechecku a bez plné podpory tsconfig či transformačních funkcí.
Asynchronní I/O
Síť, disk a další pomalé operace lze obsluhovat neblokujícím způsobem přes callbacky, Promise a async/await. To neznamená paralelní provedení každé funkce ani imunitu vůči blokujícímu CPU výpočtu.
Moduly
Projekt rozděluje kód do modulů. Node.js podporuje ECMAScript modules i CommonJS; konkrétní způsob importu musí být v projektu konzistentní a odpovídat jeho konfiguraci.
Standardní knihovna
Node.js poskytuje například moduly pro HTTP, soubory, streamy, kryptografii a procesy. Balíček z registru přidávej až tehdy, když řeší významný problém lépe než standardní API nebo malý vlastní kód.
Proces a konfigurace
Proces node má vlastní paměť, proměnné prostředí a oprávnění operačního systému. Konfigurace nesmí obsahovat tajné údaje v repozitáři a každá změna verze Node.js patří do testované změny prostředí.
Výhody a omezení
Dobrá práce s I/O, ale ne zkratka pro výkon.
Přínosy
- stejný jazyk pro část frontendu, backendové nástroje a vývojovou automatizaci
- dobrá práce s velkým počtem síťových a souborových operací, které hlavně čekají
- rozsáhlý ekosystém balíčků a nástrojů pro webový vývoj
- přímočaré vytvoření CLI nástroje nebo služby s HTTP rozhraním
Hranice a rizika
- dlouhý CPU výpočet na hlavním vlákně zhorší odezvu všech požadavků v procesu
- velké množství závislostí zvětšuje bezpečnostní i údržbový povrch
- rozdíly mezi verzemi Node.js a modulem ESM/CommonJS mohou rozbít build či běh
- asynchronní kód potřebuje jasné ošetření timeoutů, zrušení práce a chybových stavů
Kdy dává smysl
Přiměřená volba pro I/O služby a JavaScriptové nástroje.
Node.js je praktický pro API, integrační vrstvy, realtime komunikaci, frontové workery, CLI a frontendový tooling. Dobře zapadá také do týmu, který už bezpečně pracuje s JavaScriptem a dokáže udržovat jeho závislosti, testy a provozní metriky.
Pro dlouhé výpočty, image processing nebo jiné CPU náročné úlohy je nutné práci oddělit do worker threads, samostatných procesů či specializované služby, nebo zvolit vhodnější technologii. Rozhoduje typ zátěže a provozní požadavky, ne popularita runtime.
Na co myslet
Verze runtime, limity a dohledatelné chyby jsou součást aplikace.
Produkční Node.js služba potřebuje stejnou provozní disciplínu jako jiný backend.
- držet podporovanou LTS verzi Node.js a její upgrade testovat v CI i cílovém prostředí
- verzi runtime definovat pro tým a CI, například v kontejneru nebo souboru používaném zvoleným version managerem
- nastavit timeouty odchozích volání, limity request body a řízené ukončení procesu při nasazení
- neblokovat event loop dlouhou synchronní prací; měřit latenci, paměť, počet chyb a vytížení
- prověřovat zdroj, licenci, údržbu a instalační skripty nových balíčků
- neukládat tokeny a hesla do zdrojového kódu, logů ani veřejných proměnných klienta
Časté otázky
Node.js bez častých záměn
Je Node.js programovací jazyk?
Ne. Programovací jazyk je JavaScript. Node.js je runtime, který JavaScript spouští mimo prohlížeč a poskytuje mu serverová a systémová API.
Je Node.js framework?
Ne. Framework poskytuje aplikační konvence, například pro routing nebo závislosti. Node.js je běhové prostředí, ve kterém může framework běžet, ale sám žádnou architekturu nevynucuje.
Je Node.js totéž co npm?
Ne. Node.js spouští program. npm pracuje s balíčky, jejich deklarací a instalací. Bývají spolu distribuovány, ale mají rozdílnou roli a lze je aktualizovat i provozovat odděleně.
Je asynchronní Node.js automaticky rychlý?
Ne. Výhodu má zejména při čekání na I/O. Výpočetně náročný nebo blokující JavaScript na hlavním vlákně stále zdržuje další práci v procesu.
Mohu Node.js použít jen pro frontend?
Ano, často slouží jen k lokálnímu buildu, testům a vývojovému serveru. Výsledný frontend pak může být jen sada statických souborů běžících v prohlížeči bez Node.js na produkčním webovém serveru.
Jak pracuji s webovými systémy
Nástroje a runtime volím podle hranic systému, ne podle zkratky v technologickém stacku.
U API a integračních služeb řeším vedle implementace také data, timeouty, chyby, závislosti a dohledatelnost provozu.