Next.js'te Cache Mekanizması
Next.js, klasik "SSR mi SSG mi?" ikilemini cache-first bir mimariye dönüştürdü. App Router ile birlikte artık her veri isteği, her sayfa ve hatta her fetch çağrısı varsayılan olarak cache'lenebilir hale geldi.
Bu makalemde;
- Next.js cache nasıl çalıştığını,
force-cache,revalidate,no-storefarklarını,- Hangi durumda hangisini kullanmam gerektiğini,
- Gerçek projelerde yapılan hataları anlatmaya çalışacağım.
1. Varsayılan Davranış: force-cache
Next.js'te Server Component içinde yapılan her fetch çağrısı varsayılan olarak cache'lenir.
const products = await fetch('https://api.example.com/products')
.then(res => res.json());
Ne Olur?
- İlk istekte API'ye gider,
- Gelen sonucu disk cache'e alır,
- Aynı istek tekrar geldiğinde API'ye gitmez,
- Sayfa reload olsa bile veri değişmez.
Not: Bu davranış admin panel, stok, fiyat, sipariş gibi verilerde soruna yol açar.
2. Gerçek Zamanlı Veri: no-store
Bu davranış, çekilen veri asla cache'lenmesin demektir.
const orders = await fetch('https://api.example.com/orders', {
cache: 'no-store'
})
.then(res => res.json());
Ne Olur?
- Her request'te API çağrılır,
- Sayfa tam SSR olur,
- Cache yok, beklemek yok, süpriz yok.
Not: Bu davranış admin panellerde, kullanıcıya özel verilerde, sepette, siparişlerde kullanılır. Blog yazılarında, ürün listelemelerde kullanılması önerilmez.
3. Kontrollü Cache: revalidate
Bu davranış, cache'i zaman bazlı olarak yönetmeyi sağlar.
const products = await fetch('https://api.example.com/products', {
next: {
revalidate: 60, // 60 saniye
},
})
.then(res => res.json())
Ne Olur?
- Veri cache'e alınır,
- 60 saniye boyunca herkes aynı cache'i görür,
- 60 saniye dolunca ilk gelen request veriyi günceller.
4. revalidate vs no-store
| Özellik | revalidate | no-store |
|---|---|---|
| Cache var mı? | var | yok |
| Performans | hızlı | yavaş |
| Gerçek zamanlılık | yok | var |
| SEO uyumu | tam | kısıtlı |
| Trafik dostu | evet | hayır |
5. Next.js Sayfa İçinde Cache Kontrolü
5.1. Statik Sayfa (Varsayılan)
export default async function Page() {
return <div>Statik içerik</div>
}
5.2. Dinamik Sayfa
export const dynamic = 'force-dynamic'
export default async function Page() {
return <div>Her zaman SSR</div>
}
5.3. Revalidate Sayfa Cache'leme
export const revalidate = 300
export default async function Page() {
return <div>5 dakikada bir güncellenir</div>
}
6. Cache İle En Çok Yapılan Hatalar
-
Yanlış: API tarafında cache kapalı ise, next.js tarafında da kapalıdır.
Doğru: Next.js kendi cache'ini tutar. -
Yanlış: Client Component'e geçince cache kalkar.
Doğru: Cache, fetch sırasında belirlenir. -
Yanlış: revalidate: 0 olarak ayarlanırsa,
no-storedavranışı sergiler.
Doğru: revalidate: 0force-cachemantığına girer.
7. Kısa Özet
| Senaryo | Kullanım |
|---|---|
| Blog | revalidate |
| Ürün listeleme | revalidate |
| Ürün detay | revalidate |
| Admin panel | no-store |
| Özel veri | no-store |
| SEO sayfaları | force-cache |
Sonuç
Next.js uygulamanızda cache mekanizması;
- Doğru kullanılırsa uçurur,
- Yanlış kullanılırsa sessizce bozar.
En temel anlamda cache kavramının anlamı; Hangi verinin ne kadar güncel olması gerekiyor? sorusuna verilen cevaptır.