Zkratka proServer-side renderingTakéSSRPokročilý

Definice

Server-side rendering je způsob vykreslení webové stránky, při kterém server sestaví hotové HTML ještě před odesláním do prohlížeče. Uživatel tak může vidět obsah dříve, než se stáhne a spustí celý JavaScript. Přístup pomáhá SEO a prvnímu zobrazení, ale přesouvá část práce na server.

Kategorie: Webové technologieAktualizováno

Proč server posílá hotové HTML

Server-side rendering přesouvá první sestavení stránky z prohlížeče na server. Server vezme šablonu nebo komponenty, doplní data a odpoví HTML dokumentem, který už obsahuje texty, odkazy, základní strukturu a často i kritická metadata. Prohlížeč proto nemusí čekat, až stáhne velký JavaScript balík, spustí aplikaci a teprve potom vytvoří obsah.

Server-side rendering se často řeší u Reactu, Next.js a podobných frameworků, ale princip je starší než moderní JavaScriptové aplikace. Klasické serverové šablony v PHP, Ruby on Rails nebo Django dělají velmi podobnou věc: server skládá HTML z dat a šablon. Rozdíl u současných frameworků bývá v tom, že stejný komponentový model může pokračovat i v prohlížeči.

Co SSR zrychlí a co přesune na backend

Server-side rendering obvykle zlepšuje první zobrazení obsahu, protože prohlížeč dostane čitelný dokument hned v první odpovědi. Vyhledávače, náhledy v sociálních sítích a uživatelé na pomalejším zařízení tak snáze uvidí základní obsah. Výsledek ale není automaticky rychlý web. Server musí stránku sestavit pro každý požadavek, pokud výsledek není uložený v cache nebo předgenerovaný.

Server-side rendering může zvýšit nároky na CPU, databázi a síťové volání. Pomalý dotaz na databázi se projeví přímo v době odpovědi serveru. Špatně navržené SSR také opakuje stejné výpočty při každém načtení stránky. Časté řešení kombinuje SSR s ukládáním výsledků, statickým generováním, streamováním HTML nebo distribucí přes CDN.

Hydratace: okamžik, kdy HTML ožije

Hydratace znamená, že JavaScript v prohlížeči převezme HTML vytvořené serverem a napojí na něj interaktivitu. Tlačítka začnou reagovat, formuláře validovat vstupy a komponenty spravovat stav. První HTML tedy může být rychle viditelné, ale plně ovladatelná stránka vznikne až po stažení a spuštění klientského kódu.

Hydratace je častý zdroj chyb. Pokud server a prohlížeč vypočítají jiný výstup, framework může hlásit nesoulad. Typické příčiny jsou čas závislý na klientovi, náhodná čísla, obsah podle velikosti okna nebo čtení z localStorage během prvního renderu. Bezpečnější návrh odděluje obsah, který musí být stejný na serveru i klientovi, od logiky spouštěné až po načtení stránky.

SSR v Next.js a Reactu

Next.js používá serverové vykreslování jako jednu z možností vedle statického generování a klientského renderování. Serverová komponenta může načíst data přímo na serveru a vrátit HTML bez posílání celé datové logiky do prohlížeče. Klientská komponenta se hodí tam, kde je potřeba lokální stav, události a okamžitá interakce.

Server-side rendering není náhrada za dobrý návrh aplikace. Veřejný katalog produktů, článek nebo stránka s metadaty pro SEO z něj často těží. Interní nástroj dostupný až po přihlášení, který je celý interaktivní, může být jednodušší jako klientská aplikace. Praktické rozhodnutí závisí na tom, kdo stránku čte, jak často se data mění a kolik práce zvládne server při špičce.

Příklady z praxe

  1. Detail produktu v e-shopu

    E-shop vykreslí detail produktu na serveru, protože název, popis, cenu a strukturovaná metadata potřebují vidět uživatelé i vyhledávače hned v první odpovědi. Next.js načte produkt z databáze na serveru a pošle prohlížeči hotové HTML. Interaktivní výběr variant nebo vložení do košíku se může připojit až po hydrataci.

    export default async function ProductPage({ params }) {
      const product = await getProduct(params.id);
    
      return (
        <main>
          <h1>{product.name}</h1>
          <p>{product.description}</p>
          <strong>{product.price} Kč</strong>
        </main>
      );
    }
  2. Dashboard s personalizovanými daty

    Firemní dashboard po přihlášení používá server-side rendering pro první přehled metrik, aby uživatel nečekal na prázdnou obrazovku. Server načte data konkrétního účtu, sestaví HTML a pošle ho jako odpověď. Pokud jsou dotazy pomalé a stránka se často obnovuje, tým přidá cache nebo rozdělí dashboard na rychlý základ a později načítané widgety.

    app.get('/dashboard', async (req, res) => {
      const user = await requireUser(req);
      const stats = await loadStats(user.id);
    
      res.send(renderDashboardHtml({ user, stats }));
    });

Časté omyly

MýtusSSR vyřeší výkon, protože uživatel dostane HTML ze serveru.
Ve skutečnostiServer-side rendering řeší hlavně první dostupnost obsahu. Pomalý backend, velký klientský JavaScript nebo těžká hydratace mohou výsledný web pořád brzdit.
MýtusKdyž mám React, musím použít server-side rendering.
Ve skutečnostiReact lze provozovat jako čistě klientskou aplikaci, přes SSR, staticky generované stránky nebo kombinaci více přístupů. Volba závisí na SEO, typu obsahu, interaktivitě a provozních nákladech.

Časté dotazy

Proč server-side rendering často pomáhá SEO?
Server-side rendering často pomáhá SEO tím, že vyhledávač dostane HTML s hlavním obsahem, nadpisy, odkazy a metadaty už v odpovědi serveru. Moderní vyhledávače umí spouštět JavaScript, ale renderovací fáze může být opožděná nebo omezená. SSR snižuje riziko, že důležitý obsah bude dostupný až po složitém klientském běhu aplikace.
Znamená server-side rendering rychlejší web pro každého?
Server-side rendering neznamená automaticky rychlejší web pro každého uživatele. SSR může zlepšit první zobrazení obsahu, ale zároveň přidává práci serveru a může prodloužit čekání na první bajt, pokud server pomalu načítá data. Celkový výkon závisí na cachování, velikosti JavaScriptu, hydrataci, databázových dotazech a síťové vzdálenosti mezi uživatelem a serverem.
Kdy server-side rendering zbytečně komplikuje frontend?
Server-side rendering zbytečně komplikuje frontend hlavně u aplikací, které jsou přístupné až po přihlášení, nejsou indexované a většinu hodnoty tvoří interaktivní stav v prohlížeči. Typickým příkladem je administrace s filtry, grafy a lokálními úpravami dat. SSR zde může přidat problémy s hydratací a serverovou zátěží, aniž by výrazně zlepšil uživatelský zážitek.
Jak server-side rendering souvisí s hydratací v Reactu?
Server-side rendering v Reactu často končí hydratací, při které klientský React naváže interaktivní chování na HTML vytvořené serverem. HTML je viditelné dříve, ale komponenty začnou plně reagovat až po načtení klientského JavaScriptu. Nesoulad mezi serverovým a klientským výstupem vede k varováním nebo překreslení, proto musí být první render deterministický.

Zdroje

  1. Server APIs(otevře se v novém okně)React
  2. Next.js Docs(otevře se v novém okně)Next.js
  3. Server-side website programming(otevře se v novém okně)MDN Web Docs

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.