Skořápka na trasu místo requestu na odkaz
Server-driven aplikace mají pověst pomalých navigací. Klikneš na odkaz, chvíli se neděje nic, pak dorazí odpověď serveru a objeví se stránka. SPA to dělá jinak: klik okamžitě ukáže skořápku další stránky a data se dosypou potom. Ten pocit okamžitosti je důvod, proč lidé sahají po SPA, i když má server-driven model jinak navrch.
Next.js 16.3 ten pocit dohání a stojí za tím jedno přerámování problému, které stojí za pochopení bez ohledu na framework.
Dvě mezery mezi klikem a stránkou
Aby navigace byla okamžitá, musí zmizet dvě zpoždění:
- Server musí odpověď vygenerovat. To může být pomalé, když je serverový kód pomalý.
- Klient s tím serverem musí komunikovat. To je pomalé při vysoké latenci sítě.
První mezeru řeší volba, jak s daty naložit: buď je streamuješ přes <Suspense> a uživatel hned vidí loading skořápku, nebo je cachuješ přes 'use cache' a hned vidí dřívější výsledek. V obou případech server neblokuje. Když navigaci naopak chceš nechat serverovou (třeba článek bez loading stavu), řekneš to explicitně. Podstatné je, že je to rozhodnutí per trasa, ne implicitní chování.
Chyba byla prefetchovat po odkazech
Druhá mezera je zajímavější. Jak může klient znát odpověď už ve chvíli kliknutí. Dřív to Next.js řešil hrubou silou: pro každý odkaz ve viewportu poslal prefetch request. Sidebar s dvaceti odkazy na chaty znamenal dvacet requestů, i když všechny mířily na tutéž trasu /chat/[id].
Nový model si půjčuje trik ze SPA. Ta umí odpovědět okamžitě, protože má napřed poslaný kód pro danou trasu — per-route code splitting. Next.js teď dělá totéž s renderem: prefetchne jednu znovupoužitelnou skořápku na trasu, ne na odkaz, a nacachuje ji na klientovi. Dvacet chatů sdílí jednu skořápku /chat/[id].
Posun je v tom, co je jednotka prefetche. Ne „stránka, na kterou tenhle odkaz míří", ale „tvar trasy, který se dá naplnit jakýmkoli parametrem". Tím se z kvadratického plýtvání stane jeden fetch, a mimochodem vznikne základ pro offline navigaci.
Skořápka jako baseline, ne všechno nebo nic
Skořápka je záměrně mělká — vyrenderuje se do hloubky toho, co je dostupné synchronně nebo označené 'use cache'. Zbytek dotéká po síti. Když u konkrétního odkazu chceš přednačíst víc, přidáš <Link prefetch> a Next.js dojde hlouběji, pořád ale jen k tomu, co zná v build time.
Tím padá staré dilema „prefetchovat všechno, nebo nic". Skořápka na trasu je levný základ pro všechny odkazy, cílený prefetch je opt-in tam, kde se to vyplatí.
Co si z toho odnést
Když řešíš, proč navigace nepůsobí okamžitě, rozděl si to na dvě mezery — pomalý server a pomalá síť — a řeš každou zvlášť. První se řeší tím, že server neblokuje. Druhá tím, že správně zvolíš jednotku přednačítání.
A ta jednotka je obecnější lekce než konkrétní flag. Prefetchovat po odkazech znamená platit za každou instanci zvlášť. Prefetchovat po trasách znamená zaplatit jednou za tvar a znovu ho použít. Kdykoli něco předpočítáváš per instanci, zeptej se, jestli neexistuje sdílený tvar o úroveň výš.