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.

  1. Příchod práce HTTP request, časovač, soubor nebo zpráva vyvolá callback či pokračování Promise.
  2. JavaScript na hlavním vlákně Node.js provede krátký kus aplikační logiky, například validaci vstupu a přípravu dotazu.
  3. 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.
  4. Event loop Po dokončení I/O zařadí pokračování zpět do fronty událostí a JavaScript zpracuje výsledek.
  5. 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.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.