Slovník pojmů
Next.js
Next.js je React framework s konvencemi pro routing, serverovou i klientskou část rozhraní, načítání dat a produkční výstup. Není omezený pouze na SSR a konkrétní způsob provozu závisí na funkcích, které aplikace používá.
Stručná definice
Framework nad Reactem pro celou webovou aplikaci.
React poskytuje komponentový model uživatelského rozhraní. Next.js nad něj přidává strukturu projektu, routing podle souborů, serverové schopnosti, build a produkční konvence. Nejde tedy o jiný název Reactu ani o pouhou knihovnu pro jednu komponentu.
Současným výchozím modelem pro nové funkce je App Router v adresáři app. Soubory page definují stránky, layout sdílené obálky a route vlastní HTTP handlery. Starší Pages Router je stále podporovaný pro existující aplikace, ale oba modely se nemají míchat v jednom vysvětlení bez rozlišení jejich pravidel.
Next.js může připravit statický výstup, vykreslit část aplikace při requestu a hydratovat interaktivní části v prohlížeči. Není proto pouze synonymem pro server-side rendering. Stejně tak není Node.js: standardní toolchain jej vyžaduje pro build, ale produkční výstup nemusí být vždy trvale běžící Node.js server.
Jaký problém řeší
Spojuje části React aplikace do konzistentního aplikačního modelu.
Samotný React neurčuje URL, sdílené layouty, serverové načítání dat, metadata ani produkční výstup. Next.js pro tyto oblasti poskytuje konvence a nástroje, aby tým nemusel skládat každou vrstvu samostatně.
- webové aplikace s veřejnými stránkami, přihlášenou částí a sdílenými layouty
- produktové katalogy a obsah, který lze podle potřeby připravit při buildu nebo requestu
- interaktivní administrace kombinující Server Components s menšími klientskými hranicemi
- načítání dat přímo v serverové komponentě blízko databáze nebo API
- route handlers pro cílené HTTP endpointy, webhooky nebo backend-for-frontend operace
- správa metadat, obrázků a produkčního buildu v jednom frameworku
Praktický příklad
Produktový detail načte data na serveru a košík zůstane interaktivní.
Soubor page.tsx je Server Component. Načte produkt na serveru, zpracuje neexistující ID a pošle klientovi pouze hodnoty potřebné pro tlačítko. Komponenta AddToCart vyznačí hranici use client, protože používá state a event handler; zde volaný fetch se proto spouští v prohlížeči.
Ukázka záměrně odděluje UI od autoritativního API. Endpoint košíku musí na serveru autentizovat uživatele, autorizovat operaci, ověřit produkt i cenu a podle způsobu autentizace řešit ochranu requestu. Úspěšný lokální render tato pravidla nenahrazuje.
TypeScript / Next.js (TSX)
// app/products/[id]/page.tsx — Server Component
import { notFound } from 'next/navigation';
import AddToCart from './add-to-cart';
import { getProduct } from '@/lib/products';
export default async function ProductPage({
params,
}: {
params: Promise<{ id: string }>;
}) {
const { id } = await params;
const product = await getProduct(id);
if (!product) notFound();
return (
<main>
<h1>{product.name}</h1>
<p>{product.formattedPrice}</p>
<AddToCart productId={product.id} disabled={!product.inStock} />
</main>
);
}
// app/products/[id]/add-to-cart.tsx — Client Component
'use client';
import { useState } from 'react';
export default function AddToCart({
productId, disabled,
}: {
productId: string;
disabled: boolean;
}) {
const [status, setStatus] = useState<'idle' | 'pending' | 'added' | 'error'>('idle');
async function handleAdd() {
setStatus('pending');
try {
const response = await fetch('/api/cart', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ productId, quantity: 1 }),
});
if (!response.ok) throw new Error('Košík nelze změnit.');
setStatus('added');
} catch {
setStatus('error');
}
}
return (
<div>
<button type="button" disabled={disabled || status === 'pending'} onClick={handleAdd}>
{status === 'added' ? 'Přidáno' : 'Přidat do košíku'}
</button>
<span aria-live="polite">
{status === 'error' ? 'Přidání se nezdařilo.' : ''}
</span>
</div>
);
}
Jak funguje
Request → App Router → serverový výstup → HTML a RSC payload → interakce.
Konkrétní cesta může být statická, vykreslená při requestu nebo složená ze statické obálky a streamovaných částí. Diagram ukazuje typické první načtení App Router stránky.
- App Router vybere segmenty Složky a speciální soubory určí page, vnořené layouts, loading stav a případný dynamický parametr URL.
- Server Components načtou data Výchozí pages a layouts mohou číst data na serveru a vykreslit výsledek bez odeslání jejich implementace do klientského JavaScript bundle.
- Next.js vytvoří výstup React Server Component payload popíše serverový strom a reference na klientské části. Next.js jej může použít také k předrenderování počátečního HTML.
- Suspense umožní streaming Připravená obálka a fallback mohou dorazit dřív než pomalejší část. Streaming nezrychlí samotný zdroj dat a potřebuje smysluplný loading i chybový stav.
- Prohlížeč hydratuje klientské hranice JavaScript připojí handlery Client Components. Při další navigaci framework pracuje s RSC payloadem a klientským routerem bez nutnosti plného reloadu dokumentu.
Hlavní části a koncepty
Routing, komponentové hranice a renderování mají odlišné role.
Přesný caching a data fetching model je nutné ověřit pro používanou verzi a konfiguraci. Neměnná zůstává potřeba explicitně rozhodnout, kdy data vznikají a jak se obnovují.
Pages, layouts a segmenty
page zpřístupní UI konkrétní cesty, layout obalí potomky a zachová sdílenou část při navigaci. Hranaté závorky označí dynamický segment; složka sama URL nevytvoří bez odpovídající page nebo route.
Server Components
Běží v odděleném serverovém prostředí při buildu nebo requestu. Mohou používat serverové zdroje a předat serializovatelná data klientské komponentě, ale nemají API prohlížeče ani interaktivní hooks jako useState.
Client Components
Direktiva use client vyznačí vstup do klientského modulového grafu. Tyto komponenty používají state, efekty, handlery a API prohlížeče; při prvním načtení se přesto mohou podílet na serverově předrenderovaném HTML.
Statické a request-time renderování
Statický výstup vznikne před konkrétním requestem a lze jej efektivně distribuovat. Request-time render pracuje s cookies, hlavičkami nebo čerstvými daty konkrétního požadavku, za cenu serverové práce a složitější cache.
Data, cache a revalidace
Data lze číst přes fetch, databázovou knihovnu nebo jiný asynchronní zdroj v Server Component. Aktuální model nabízí explicitní cache direktivy v rámci volitelné, v konfiguraci zapínané funkce Cache Components a také revalidaci; starší verze a jiné konfigurace mají odlišné chování, proto nelze slepě přebírat návod.
Route Handlers a metadata
route.ts obsluhuje HTTP metody přes Request a Response a je skutečným endpointem. Metadata se definují statickým objektem, generateMetadata nebo souborovými konvencemi; Server Component není náhradní API route.
Image, build a deployment
Komponenta Image umí připravit velikosti, formáty a lazy loading podle loaderu. Build vytvoří optimalizovaný výstup pro Node.js server, Docker, omezený static export nebo podporovaný adaptér.
Výhody, omezení a časté chyby
Framework sjednotí rozhodnutí, ale neudělá je automaticky správně.
Konkrétní přínosy
- routing a vnořené layouty podle konzistentních souborových konvencí
- možnost nechat datovou a neinteraktivní logiku mimo klientský bundle
- kombinace statického výstupu, request-time renderování a streamingu v jedné aplikaci
- integrovaná metadata, práce s obrázky, build a více deployment variant
Omezení a časté chyby
- zvolit Next.js pro malý čistě klientský widget bez využití frameworkových funkcí
- zaměnit Server Component za SSR nebo backendový endpoint
- předpokládat, že use client znamená vykreslení pouze v prohlížeči ve všech fázích
- použít API prohlížeče nebo interaktivní hook v Server Component
- spoléhat na neověřený caching model převzatý z jiné major verze
- očekávat automaticky dobrý výkon či SEO bez správných dat, metadat, HTML a měření
Praktické použití a porovnání
Next.js není React, Node.js ani jeden pevný způsob renderování.
React řeší skládání komponent a aktualizaci rozhraní. Next.js určuje širší architekturu webové aplikace: URL, layouty, hranice serveru a klienta, načítání dat i produkční build. Jednoduchý React widget jej nepotřebuje, zatímco katalog s veřejným obsahem a přihlášenou administrací může z jednotných konvencí těžit.
Server Component a SSR řeší jinou otázku. Server Component určuje, že implementace komponenty běží mimo klientský modulový graf a klient dostane její výsledek v RSC payloadu. SSR je vytvoření počátečního HTML pro request. Server Component může běžet při buildu a počáteční SSR může zahrnout i výstup Client Components.
Client-side rendering znamená, že hlavní obsah vytváří JavaScript v prohlížeči. Client Component naproti tomu označuje schopnost používat klientské React API. Na prvním requestu může Next.js její HTML předrenderovat a následně hydratovat; use client tedy není pokyn „nikdy nespouštět při serverovém renderu“.
Statické renderování vytvoří výstup před návštěvou uživatele, kdežto request-time render může zohlednit konkrétní cookies, hlavičky a aktuální data. Cache může snížit množství opakované práce, ale správnost závisí na skutečných vstupech, době platnosti a invalidaci. Streaming pouze umožní odeslat připravené části dříve.
Next.js aplikaci lze provozovat jako Node.js server nebo v Dockeru, ale také jako omezený statický export či přes adaptér. Statický export nepodporuje všechny dynamické funkce a adaptéry mají rozdílnou matici schopností. Tvrzení, že každý produkční Next.js projekt vždy vyžaduje trvale běžící Node.js server, proto není správné.
Kontrola implementace
Hranice serveru, klienta a cache musí být viditelné v návrhu.
Kvalitní Next.js aplikace neposílá vše do klienta ani neschovává každou operaci za magickou cache. U každé cesty je jasné, kde data vzniknou, komu je lze sdílet a jak se projeví chyba.
- držet use client na nejmenší praktické interaktivní hranici a neposílat do ní secrets ani neserializovatelné hodnoty
- paralelizovat nezávislé datové operace a použít Suspense tam, kde průběžný stav skutečně pomůže
- pro konkrétní verzi ověřit výchozí caching, revalidaci a chování fetch místo převzetí staršího návodu
- testovat shodu serverového HTML a klientského renderu, chybové stavy, navigaci, focus a fungování bez hydratace
- ověřit podporu použitých funkcí na cílovém deploymentu a měřit velikost klientského bundle i serverovou odezvu
Časté otázky
Next.js bez záměny renderovacích modelů
Je Next.js totéž co React?
Ne. React je knihovna pro uživatelské rozhraní. Next.js je framework, který nad Reactem poskytuje routing, serverové schopnosti, načítání dat, build a deployment konvence.
Je Next.js pouze framework pro SSR?
Ne. App Router kombinuje statické a request-time renderování, React Server a Client Components, streaming i klientskou navigaci podle potřeb konkrétní cesty.
Je Server Component API endpoint?
Ne. Server Component vytváří část uživatelského rozhraní a RSC payloadu. Vlastní HTTP endpoint v App Routeru poskytuje Route Handler v souboru route.ts.
Znamená use client, že komponenta existuje pouze v prohlížeči?
Ne. Direktiva vyznačuje klientskou modulovou hranici a umožní interaktivní API. Při prvním načtení může Next.js její výstup použít i v předrenderovaném HTML a v prohlížeči jej následně hydratuje.
Potřebuje každá Next.js aplikace v produkci Node.js server?
Ne. Node.js server a Docker podporují celý rozsah funkcí, ale některé aplikace lze exportovat staticky nebo nasadit přes adaptér. Dostupné schopnosti vždy závisejí na použitém výstupu.
Osobní zkušenost
Framework posuzuji podle datových, provozních a uživatelských hranic aplikace.
Při návrhu webových systémů propojuji frontend s API, cache, chybovými scénáři a deploymentem tak, aby každá vrstva měla jasnou odpovědnost.