Co je ISR (Incremental Static Regeneration) a proč vzniklo
ISR (Incremental Static Regeneration) je strategie doručování webu, při níž se stránky generují staticky předem (SSG), ale vybrané části lze po určité době nebo na vyžádání (on-demand) bezpečně obnovit přímo na serveru, aniž by bylo nutné provést kompletní redeploy. Výsledkem je kombinace rychlosti statického webu a aktuálnosti dynamického obsahu. V praxi jde o souhru vrstev cache (CDN/edge), mechanismu stale-while-revalidate a řízené invalidace.
Princip fungování: stale-while-revalidate pro webové stránky
- První vykreslení: stránka se vygeneruje staticky a uloží do cache (CDN + serverová cache). Návštěvníci dostávají okamžitou odpověď s minimální latencí.
- Expirace: po uplynutí stanovené doby (revalidate window) se další požadavek označí jako spouštěč revalidace.
- Revalidace na pozadí: server (nebo edge runtime) tiše obnoví snímek HTML/JSON. Uživatel ještě dostane starou (stale) verzi, ale následující uživatel obdrží aktuální verzi.
- Invalidace na vyžádání: při určité události (např. publikování článku v CMS) lze konkrétní stránku/segment okamžitě znovu vykreslit a aktualizovat cache.
ISR vs. SSG, SSR a plně dynamické vykreslování
- SSG (Static Site Generation): rychlé, levné, ale bez mechanismu průběžné aktualizace bez redeploye.
- SSR (Server-Side Rendering): vždy aktuální HTML na vyžádání, vyšší latence a náklady; cache je třeba spravovat ručně.
- Dynamické/SPA: rychlá navigace po načtení, ale počáteční Time to First Byte a indexace mohou být problematické bez SSR/SSG.
- ISR: zlatá střední cesta – statická rychlost + plánovaná/řízená obnova.
Architektura a vrstvy cache
ISR obvykle využívá:
- Edge CDN: distribuce HTML a assetů v blízkosti uživatelů; TTL a cache keys navázané na URL a jazyk/segment.
- Serverová cache: koordinuje invalidaci a revalidaci; spravuje tags a závislosti.
- Datová vrstva: CMS/API/DB jako zdroj pravdy; doporučuje se model optimalizovaný pro čtení (read-optimized) a připravené pohledové modely.
Implementační vzory (Next.js – Pages a App Router)
Next.js Pages (getStaticProps) s intervalovou revalidací:
export async function getStaticProps() {
const data = await fetch('https://api.example.com/posts').then(r => r.json());
return { props: { data }, revalidate: 300 }; // revalidate každých 5 minut
}
Next.js App Router (možnosti segmentu trasy):
export const revalidate = 300; // segmentová revalidace
export default async function Page() {
const res = await fetch('https://api.example.com/post/123', { next: { revalidate: 300 } });
const post = await res.json();
return <Article data={post} />;
}
Revalidace na vyžádání (endpoint pro invalidaci):
// /app/api/revalidate/route.ts
import { revalidatePath, revalidateTag } from 'next/cache';
export async function POST(request: Request) {
const { path, tag, secret } = await request.json();
if (secret !== process.env.REVALIDATE_TOKEN) return Response.json({ ok: false }, { status: 401 });
if (path) revalidatePath(path);
if (tag) revalidateTag(tag);
return Response.json({ ok: true });
}
Cache založená na tagech pro vyšší granularitu:
await fetch('https://api.example.com/category/tech', { next: { tags: ['category:tech'] } });
/* při změně kategorie: revalidateTag('category:tech') */
Modelování revalidace: intervalová, řízená událostmi a hybridní
- Intervalová (časová): jednoduché SLA pro aktuálnost; vhodná pro obsah, který může být několik minut až hodin zastaralý.
- Řízená událostmi (webhooky): CMS po publikování zavolá revalidační endpoint; obsah zastarává jen minimálně.
- Hybridní: kombinace – interval chrání v případě selhání webhooku a událost zajišťuje rychlost.
ISR a moderní SEO (Core Web Vitals, crawl budget, indexace)
- Rychlost a stabilita: statické snímky snižují TTFB a zlepšují LCP/INP/CLS, což se promítá do lepší použitelnosti a hodnocení kvality.
- Konzistentní HTML: minimalizuje hydration mismatch, omezuje FOUC a stabilizuje rozložení stránky.
- Crawl budget: servery obsluhují požadavky z cache; roboty dostávají hotové HTML, což urychluje přechod na další URL.
- Strukturovaná data: generujte JSON-LD při statickém vykreslení, aby byla vždy přítomna ve snímku HTML a zachycena při procházení webu.
ISR a AIO/AEO (Answer/AI Engine Optimization) pro prostředí LLM
Vyhledávače s komponentami LLM i asistované vyhledávání potřebují stabilní, strojově čitelná a často aktualizovaná fakta. ISR pomáhá:
- Stabilní výstupy: konzistentní HTML pro extrakci entit, údajů a odpovědí (AIO).
- Aktualizace bez výpadků: při změně ceny, parametrů či FAQ se obnoví pouze dotčená stránka nebo segment (incremental).
- IA zaměřená na entity: mapování stránek na entity a cache tags usnadňuje přesnou invalidaci (např.
tag:product:SKU123).
Typické scénáře použití
- Katalogy a výpisy: kategorie produktů s častými změnami dostupnosti/cen; výpisy se revalidují po dávce změn.
- Obsahové weby a zprávy: rychlé publikování s okamžitou invalidací po zveřejnění/opravě.
- Stránky s dlouhým chvostem (long-tail): statické snímky udržují nízké náklady a vysokou rychlost i u tisíců URL.
- Vícejazyčné weby: revalidace na úrovni jazyka/regionu prostřednictvím tagů (
tag:locale:sk-SK).
Na co si dát pozor (úskalí a anti-patterny)
- Personalizace podle uživatele: ISR není vhodné pro obsah závislý na identitě uživatele. Personalizaci řešte na klientovi nebo prostřednictvím Edge Middleware (bez míchání se statickým HTML).
- Konzistence údajů: u kritických údajů (ceny v košíku) nepoužívejte zastaralé HTML; vykreslujte aktuální data nebo je před objednávkou ověřte na serveru.
- Částečné invalidace: nesprávně navržené tags vedou k nepřesné revalidaci (příliš široké nebo úzké). Modelujte závislosti tabulek/entit.
- Konflikt přednačítání a cachování: agresivní
prefetchv SPA může přinášet starší JSON; slaďte TTL v datových požadavcích s revalidací HTML. - Režim náhledu: oddělte náhledy (draft) od produkčního ISR, aby se neserializoval nepublikovaný obsah.
Integrace s CMS a datovým backendem
- Webhook → Revalidate API: při publikování/editaci CMS zavolá zabezpečený endpoint s
REVALIDATE_TOKEN. - Invalidace založená na tagech: přiřaďte obsah k tagům (entita, kategorie, jazyk, šablona).
- Dávkové zpracování: při hromadných změnách spouštějte revalidaci po dávkách, abyste předešli „thundering herd“.
- Observabilita: zaznamenávejte hity/missy, dobu trvání revalidace, chybovost fetchů a stav revalidačních událostí.
Měření a monitorování (SLA aktuálnosti)
- Freshness SLO: stanovte cíl (např. „99 % stránek je novějších než 5 minut“).
- Telemetrie: označujte verze snímků (časové razítko v meta) a porovnávejte je s časem požadavků.
- Error budget: sledujte neúspěšné revalidace a plánujte opakování s prodlevou (retry/backoff).
Detaily implementace SEO pro ISR
- Kanonické URL a hreflang: generujte staticky; při revalidaci nikdy nezapomeňte na
rel="canonical"a mapyhreflang. - Strukturovaná data: generujte JSON-LD ve snímku HTML; při změně ceny či recenzí spusťte okamžitou revalidaci.
- Meta a karty OG/Twitter: musí být ve statickém HTML, aby je sociální prohlížeče načetly při sdílení.
Tipy pro výkon a osvědčené postupy
- Edge-first: doručujte HTML ze sítě edge uzlů; minimalizujte počet požadavků na origin.
- Segmentace cache: klíče zahrnují parametry, jazyk a varianty; nepoužívejte „catch-all“ bez zohlednění řetězců dotazu.
- Kritické CSS a fonty: vložte kritické části přímo do stránky, zbytek načítejte líně; stabilizujte rozložení stránky pro dobré CLS.
- Hydratace na vyžádání: vyhýbejte se globální zátěži způsobené hydratací; používejte islands/partial hydration.
Bezpečnost a spolehlivost ISR
- Autorizované revalidace: tokeny, seznam povolených IP adres, omezení počtu požadavků; volání zaznamenávejte a auditujte.
- Idempotentní endpointy: opakovaná volání nesmějí poškodit stav cache.
- Bezpečné chování při selhání: při chybách fetchu ponechte poslední úspěšný snímek; zajistěte postupné omezení funkcí (graceful degradation).
Migrace na ISR ze stávajícího SSG/SSR
- Audit datových toků: určete, které stránky mohou být několik minut zastaralé a které vyžadují aktuálnost v reálném čase.
- Nastavte dobu revalidace: podle proměnlivosti obsahu; kritické stránky přepněte na režim na vyžádání.
- Zaveďte tagy: mapujte entity → tagy → stránky (např. produkt, kolekce, značka).
- Zapněte telemetrii: měřte TTFB, LCP, INP, chybovost a procento požadavků obsloužených z cache.
Příklady návrhu URL a tagování
/produkty/{sku} → tag:product:{sku}
/kategoria/{slug} → tag:category:{slug}
/blog/{slug} → tag:post:{id}, tag:author:{id}, tag:topic:{slug}
Při úpravě autora stačí použít revalidateTag('author:{id}') a obnoví se všechny jeho články i profil autora.
Testování ISR v CI/CD
- Unit testy vrstvy fetch: mockujte data a ověřte TTL/tagy pro každý požadavek na API.
- Smoke testy revalidace: po deployi spusťte skript, který vyvolá několik revalidačních událostí a ověří meta údaj o aktuálnosti.
- Lighthouse + syntetické RUM: ověřte Core Web Vitals po revalidaci (změna rozložení stránky může ovlivnit LCP/CLS).
Nejčastější otázky (FAQ)
Ovlivní ISR negativně SEO, pokud uživatel dostane starou verzi?
Ne, pokud je revalidace spolehlivá a období se zastaralým obsahem přiměřené. Roboti i uživatelé obvykle dostanou rychlou odpověď; aktuálnost řídí interval/webhook.
Mohu kombinovat ISR s personalizací?
Ano, personalizované prvky však doručujte prostřednictvím vykreslování na klientovi nebo edge middleware; základní HTML by mělo zůstat statické.
Je ISR vhodné pro data, která se mění velmi často (např. ceny akcií)?
Pro HTML spíše ne; základ zobrazte staticky a data aktualizujte prostřednictvím klientského fetch/websocketu mimo ISR.
Kontrolní seznam pro produkční nasazení
- Stanovené intervaly revalidate a webhooky on-demand.
- Navržené cache tags podle entit a pohledů.
- Monitorovaný cache hit ratio a metrika aktuálnosti.
- Zabezpečené revalidační endpointy (token, omezení počtu požadavků, audit).
- Stabilní HTML s JSON-LD, kanonickými odkazy a hreflang.
- Plán obnovy při chybách fetchu (návrat k poslednímu snímku).
ISR přináší pragmatickou rovnováhu mezi rychlostí statického webu a aktuálností dynamického obsahu. Při správném návrhu cache tagů, bezpečné invalidaci na vyžádání a telemetrii dosáhnete špičkových Core Web Vitals, efektivního crawl budgetu a zároveň spolehlivé aktuálnosti – což je klíčové pro moderní SEO i AIO/AEO v éře vyhledávání poháněného LLM.
