Next.js Rendering Strategije Objašnjene na Jednom Mjestu
Ako gradite Next.js aplikaciju i niste sigurni trebate li koristiti SSR, SSG, ISR ili jednostavno Client-Side Rendering — niste jedini. Ovo je jedna od prvih tehničkih odluka koja direktno utječe na brzinu stranice, SEO i korisničko iskustvo. U ovom vodiču prolazimo kroz svaku strategiju, objašnjavamo kada je koristiti i što se događa “ispod haube” kako biste mogli donijeti informiranu odluku.
Što je renderiranje i zašto je važno za SEO i performanse?
Renderiranje je proces pretvaranja React komponenti u HTML koji korisnik vidi u pregledniku. Način na koji se to događa — na serveru, klijentu ili u trenutku buildanja — izravno određuje koliko brzo se stranica učitava i hoće li Google uspješno indeksirati njezin sadržaj.
Next.js je jedinstven po tome što nudi više strategija u okviru jednog projekta. Svaka stranica u /app direktoriju može koristiti drugačiji pristup ovisno o prirodi njenog sadržaja.
SSG — Static Site Generation
Što je SSG?
Static Site Generation znači da se HTML generira u trenutku builda, prije nego ijedan korisnik dođe na stranicu. Rezultat se sprema kao statička datoteka i servira direktno s CDN-a.
// app/blog/[slug]/page.tsx — App Router primjer
export async function generateStaticParams() {
const posts = await fetchAllPosts();
return posts.map((post) => ({ slug: post.slug }));
}
export default async function BlogPost({ params }: { params: { slug: string } }) {
const post = await fetchPost(params.slug);
return <article>{post.content}</article>;
}
Prednosti SSG-a
- Najbrže moguće učitavanje — HTML je već spreman, nema čekanja na server
- Izvrsno za SEO — Googlebot čita potpun HTML odmah
- Niska cijena hostinga — statičke datoteke ne zahtijevaju serverske resurse
- Visoka pouzdanost — nema šanse za server error u runtime-u
Kada koristiti SSG?
SSG je idealan za sadržaj koji se rijetko mijenja:
- Blog postovi i članci
- Marketing landing stranice
- Dokumentacija
- Stranice usluga i portfolio
Ograničenja SSG-a
Ako imate tisuće stranica, build može biti spor. Svaka promjena sadržaja zahtijeva novi build i deployment. Nije prikladan za sadržaj koji se mijenja u realnom vremenu.
SSR — Server-Side Rendering
Što je SSR?
Server-Side Rendering znači da se HTML generira na svakom requestu, u trenutku kada korisnik posjeti stranicu. Server dohvaća podatke, renderira komponentu i šalje gotov HTML.
// app/dashboard/page.tsx — svaki request generira svježi HTML
export const dynamic = 'force-dynamic';
export default async function Dashboard() {
const data = await fetchLiveData(); // dohvaća svježe podatke na svakom requestu
return <DashboardView data={data} />;
}
U App Routeru, svaka Server Component koja koristi cookies(), headers() ili searchParams automatski postaje dinamična.
Prednosti SSR-a
- Uvijek svježi podaci — savršeno za dashboarde, korisničke profile, košarice
- Personalizirani sadržaj — možete servirati različit sadržaj ovisno o korisniku
- SEO za dinamičan sadržaj — Google dobiva potpun HTML čak i za personalizirane stranice
Kada koristiti SSR?
- Korisničke nadzorne ploče
- Stranice profila i naloga
- Pretraživanje s filterima u URL-u
- Sadržaj koji ovisi o autentikaciji
Ograničenja SSR-a
Sporiji Time to First Byte (TTFB) u usporedbi sa SSG-om jer svaki request čeka na server response. Zahtijeva serversku infrastrukturu i skuplje je za hosting od statičkih stranica.
ISR — Incremental Static Regeneration
Što je ISR?
ISR je Next.js-ov hibridni pristup koji kombinira prednosti SSG-a i SSR-a. Stranice se generiraju statički, ali se automatski regeneriraju u pozadini nakon definiranog vremenskog intervala.
// app/products/[id]/page.tsx
export const revalidate = 3600; // regeneriraj svakih sat vremena
export default async function ProductPage({ params }: { params: { id: string } }) {
const product = await fetchProduct(params.id);
return <ProductDetail product={product} />;
}
On-Demand ISR
Uz on-demand revalidaciju možete pokrenuti regeneraciju odmah kada se sadržaj promijeni, npr. iz CMS webhookova:
// app/api/revalidate/route.ts
import { revalidatePath } from 'next/cache';
import { NextRequest } from 'next/server';
export async function POST(request: NextRequest) {
const { path } = await request.json();
revalidatePath(path);
return Response.json({ revalidated: true });
}
Prednosti ISR-a
- Brzina statičke stranice za prve posjetitelje
- Svježi podaci bez potrebe za punim re-buildom
- Idealno za CMS-driven sadržaj poput blogova s čestim ažuriranjima
Kada koristiti ISR?
- E-commerce stranice proizvoda (cijena i zalihe se mijenjaju, ali ne u sekundu)
- Novinski portali i blog s čestim objavama
- Stranice s podacima koji se ažuriraju svakih nekoliko sati
- Svaki sadržaj koji je “svjež dovoljno” uz vremenski interval
CSR — Client-Side Rendering
Što je CSR?
Kod Client-Side Renderinga, HTML koji server šalje je minimalan (skeleton), a svi podaci se dohvaćaju i renderiraju direktno u pregledniku korisnika putem JavaScripta.
'use client';
import { useEffect, useState } from 'react';
export function LiveChart() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('/api/chart-data')
.then(res => res.json())
.then(setData);
}, []);
if (!data) return <Skeleton />;
return <Chart data={data} />;
}
Kada koristiti CSR?
CSR nije strategija za cijelu stranicu — u Next.js App Routeru koristite 'use client' direktivu samo za interaktivne komponente:
- Grafikoni koji se ažuriraju u realnom vremenu
- Interaktivni filteri koji ne trebaju SEO
- Korisničke preferencije koje se čitaju iz lokalne pohrane
- Komponente ovisne o browser API-jima (geolokacija, clipboard itd.)
SEO napomena
Sadržaj rendriran isključivo na klijentu nije pouzdano indeksiran od strane Googlebota. Ako stranica ovisi o CSR-u za ključni sadržaj, to može negativno utjecati na organski doseg.
Partial Pre-rendering (PPR) — Što dolazi u Next.js 15+
Next.js uvodi Partial Pre-rendering kao eksperimentalnu funkcionalnost koja kombinira statički i dinamički sadržaj unutar jedne stranice. Statički dijelovi (header, navigacija, sadržaj) se servira odmah, dok se dinamički dijelovi (košarica, obavijesti) streamaju naknadno.
import { Suspense } from 'react';
export default function ProductPage() {
return (
<>
<StaticProductInfo /> {/* rendrirano statički */}
<Suspense fallback={<CartSkeleton />}>
<DynamicCart /> {/* streamano dinamički */}
</Suspense>
</>
);
}
Ovo je budućnost Next.js arhitekture — pratite dokumentaciju za status stabilnosti.
Usporedna tablica: koja strategija za koji slučaj?
| Strategija | Brzina | SEO | Svježi podaci | Prikladno za |
|---|---|---|---|---|
| SSG | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ❌ | Blog, landing, dokumentacija |
| ISR | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | E-commerce, CMS sadržaj |
| SSR | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | Dashboard, profili, pretraga |
| CSR | ⭐⭐ | ⭐ | ⭐⭐⭐⭐⭐ | Interaktivni widgeti, real-time UI |
Kako Next.js App Router mijenja logiku odabira?
S App Routerom (uvedenim u Next.js 13), sve komponente su po defaultu Server Components — što znači statičke, osim ako ne koristite dinamičke funkcije. Ovo je važna promjena u odnosu na Pages Router gdje ste eksplicitno birali getStaticProps ili getServerSideProps.
Ključna pravila App Routera
Statičke po defaultu: Komponente bez dinamičkih funkcija automatski se prerendiraju kao SSG.
Dinamičke ako koriste: cookies(), headers(), searchParams ili fetch bez cachiranja.
Granularno cachiranje: Svaki fetch poziv može imati vlastitu strategiju:
// Cache zauvijek (SSG ponašanje)
fetch(url, { cache: 'force-cache' });
// Nikad ne cachirati (SSR ponašanje)
fetch(url, { cache: 'no-store' });
// Revalidirati svakih N sekundi (ISR ponašanje)
fetch(url, { next: { revalidate: 3600 } });
Česte greške i kako ih izbjeći
Greška 1: Korištenje 'use client' preširoko
Mnogi programeri stavljaju 'use client' na cijele stranice jer trebaju jedan interaktivan element. Bolje rješenje je izolirati interaktivni dio u zasebnu Client Component i ostaviti ostatak kao Server Component.
Greška 2: Zanemarivanje revalidacije kod ISR-a
Ako koristite ISR s dugim intervalom (npr. 24 sata) za e-commerce, korisnici mogu vidjeti zastarjele cijene. Uvijek implementirajte on-demand revalidaciju uz webhook iz vašeg CMS-a ili backend sustava.
Greška 3: SSR za statičan sadržaj
Korištenje force-dynamic na stranici koja se ne mijenja nepotrebno opterećuje server i usporava TTFB. Ako se sadržaj ne mijenja, SSG ili ISR su uvijek bolji izbor.
Greška 4: CSR za sadržaj koji treba SEO
Blog postovi, opisi usluga ili landing stranice rendreni na klijentu neće biti pouzdano indeksirani. Uvijek koristite SSG ili SSR za sadržaj koji ciljate ključnim riječima.
Praktičan primjer: arhitektura MasteryMesh stranice
Na ovoj stranici koristimo kombinaciju strategija:
- SSG za stranice usluga, industrija i blog postove — sadržaj se rijetko mijenja i SEO je prioritet
- ISR za blog listu — nova objava triggera on-demand revalidaciju
- SSR za kontakt stranicu s personaliziranim elementima
- CSR samo za interaktivne UI komponente (tema, mobilni izbornik)
Ovaj hibridni pristup daje maksimalnu brzinu tamo gdje je sadržaj statičan, uz fleksibilnost tamo gdje je potrebna dinamičnost.
FAQ
Koja je razlika između SSR i SSG u Next.js App Routeru? SSG generira HTML u trenutku builda jednom za sve korisnike. SSR ga generira na svakom requestu. U App Routeru razlika je određena time koristite li dinamičke funkcije — ako ne, stranica je automatski statična (SSG). Ako koristite cookies() ili headers(), postaje dinamična (SSR).
Može li jedna Next.js aplikacija koristiti više strategija? Da, i to je jedna od najvećih prednosti Next.js-a. Svaka stranica (route) može imati vlastitu strategiju. Možete imati SSG blog uz SSR dashboard unutar iste aplikacije bez ikakve konfiguracije na razini projekta.
Utječe li odabir strategije renderiranja na Core Web Vitals? Direktno. SSG daje najmanji TTFB i najbolji LCP jer se HTML servira odmah s CDN-a. SSR je nešto sporiji jer čeka na server, ali pruža svježe podatke. CSR ima najlošiji inicijalni prikaz jer korisnik vidi prazan ekran dok se JavaScript ne izvrši.
Je li ISR dobar za e-commerce? Da, ali uz on-demand revalidaciju. Timski interval (npr. svakih sat vremena) može biti prerizičan za cijene i zalihe. Implementirajte webhook koji triggera revalidaciju čim se proizvod promijeni u vašem backend sustavu.
Koji je najčešći izbor za marketing web stranicu? SSG je gotovo uvijek pravi izbor za marketing stranice. Sadržaj se rijetko mijenja, brzina učitavanja je ključna za konverziju i SEO, a statičke datoteke su jeftinije za hosting. ISR dodajte ako stranica povlači podatke iz CMS-a koji se ažurira redovito.
Što je Partial Pre-rendering i trebam li ga koristiti? PPR je eksperimentalna funkcionalnost u Next.js 15 koja miješa statički i dinamički sadržaj unutar jedne stranice. Za produkcijske projekte još nije preporučljivo oslanjati se na njega dok ne dosegne stabilnost — pratite Next.js changelog.
Zaključak
Nema jednog ispravnog odgovora — postoji pravi odgovor za svaki tip stranice. SSG za sadržaj koji se rijetko mijenja, ISR za CMS-driven stranice, SSR za personalizirane i dinamičke route, CSR samo za interaktivne UI komponente bez SEO zahtjeva.
Ako gradite projekt i niste sigurni kako strukturirati rendering strategije za specifičan slučaj, slobodno nas kontaktirajte. Ovo je dio svakog Next.js projekta koji radimo, i rado ćemo provesti kratak tehnički pregled.
MasteryMesh gradi Next.js aplikacije i WordPress web stranice za tvrtke koje ozbiljno pristupaju digitalnom poslovanju. Pogledajte naše usluge ili nas kontaktirajte za besplatni audit.