Tüm yazılar
24 Ağustos 20263 dk okuma

Hata Gibi Görünmeyen Next.js Önbellek Hataları

Yayına aldığım her önbellek hatası gayet geçerli bir sayfa render etti. Veri sadece eskiydi, ya da başkasına aitti, ya da sayfa henüz yoktu.

Next.js önbelleği, framework'ün en sık bozduğum kısmı ve neredeyse hiçbir zaman hata olarak görünmedi. Sayfa yükleniyor. Veri sadece eski, ya da başkasına ait, ya da geçen salı biten bir build'e göre sayfa henüz yok.

Aşağıdakilerin hepsi yayına aldığım bir hata, dokümantasyon özeti değil.

Birden fazla önbellek var ve birini temizlemek diğerlerini temizlemiyor

İşin kökü burası. Bir istek önbelleklenmiş bir fetch'ten, önbelleklenmiş bir render'dan, ya da build sırasında önceden üretilmiş bir rota segmentinden sunulabilir. Bunlar birbirinden bağımsız süre doldurur ve farklı çağrılarla geçersizleştirilir.

Yani revalidateTag verinizi tazelemesi sayfanın değişeceği anlamına gelmiyor. Render edilmiş çıktı hâlâ önbellekteyse taze verinin gidecek yeri yok.

Artık edindiğim alışkanlık: bir şey güncellenmediğinde, koda dokunmadan önce hangi önbelleğin onu tuttuğunu sormak. Yarı yarıya kod zaten doğruydu.

404 de diğerleri gibi önbelleklenmiş bir yanıttır

Bu madde yakın zamanda bana bir öğleden sonraya mal oldu.

CMS'e sayfa ekledim. Rota generateStaticParams kullanıyor, yani dağıtılmış build sabit bir slug listesi biliyordu ve yeniler o listede yoktu. Veri önbelleğini temizledim, CMS'in yeni sayfaları döndürdüğünü doğruladım, URL'ler yine 404 verdi.

Veri sorunsuzdu. Build'in hiç üretmediği bir yol için render edilen 404'ün kendisi önbelleklenmişti ve sorgu önbelleğini temizlemek ona hiçbir şey yapmadı. Yanıtta bunu size söyleyen hiçbir şey yok: önbelleklenmiş 404 ile gerçek 404 birebir aynı görünüyor.

Dinamik sayfa ekliyorsanız etiketin yanında yolu da temizleyin. Veri için revalidateTag, rota için revalidatePath.

Sabit yazılmış tarih, tarayıcılara söylenen bir yalandır

Sitemap'imde lastModified: new Date("2026-08-20") vardı; bir kez yazılmış ve unutulmuş. Her sayfa, o satırın yazıldığı günden beri değişmediğini iddia ediyordu.

Daha kötüsü, sitemap'te hiç revalidate yoktu; deploy anında üretilip donuyordu. Yedi sayfa eklendi ve hiçbir yerde duyurulmadı. İki hata da sessizdi, çünkü sitemap'in görünür bir belirtisi yok: hata vermiyor, sadece sessizce doğru olmayı bırakıyor.

Ara sıra kendinizinkini okuyun. Kodu değil, gerçek XML'i.

Önbellek, bir kullanıcının sayfasını memnuniyetle başkasına sunar

Korkutucu olanı, çünkü sessiz ve bayat render değil veri sızıntısı.

Giriş yapmış bir kullanıcı için render edilmiş sayfa, önbellek açısından sadece bir sayfadır. Server Component'te çerez okursanız Next o rotayı statik render'dan çıkarır, ki istediğiniz budur. Kullanıcı verisini çerezlere hiç dokunmayan bir yoldan çekerseniz, bir hesabın yanıtı başkasına sunulabilir.

Akıl yürütmek yerine test edin. İki tarayıcı, iki hesap, aynı rota. İki dakika.

Pencereyi bilerek seçin

Gördüğüm revalidate sayılarının çoğu bir kez seçilmiş ve bir daha bakılmamış. Benimkiler de öyleydi: haftada bir değişen içerikte bir saat, neredeyse hiç değişmeyen ana sayfada altmış saniye.

Soru ne kadar taze istediğiniz değil. Bayat olmanın gerçek maliyetinin ne olduğu. Bir saat geride kalan blog listesi sorun değil. Bir saat geride kalan sitemap, yeni bir sayfanın keşfini bir saat geciktirir. Bir saat geride kalan fiyat sayfası bir destek konuşmasıdır.

Bayatlığın gerçekten maliyeti olduğu yerde, her ziyaretçi için pencereyi kısaltmak yerine bir temizleme uç noktası ekleyin ve yayınladığınızda çağırın.

Hepsinin altındaki kural

Önbellek hataları kendini duyurmaz. Buradaki her arıza gayet geçerli bir sayfa render etti, ve onları bulmamın tek sebebi doğru olduğunu varsaydığım çıktıya gidip bakmamdı.

O yüzden gerçek sitemap'e bakın. Sayfayı ikinci bir hesapta açın. Az önce eklediğiniz URL'yi kontrol edin. Framework size söylemeyecek, çünkü onun açısından yanlış giden bir şey yok.

Sıkça sorulan sorular

revalidateTag'den sonra sayfam neden hâlâ eski veriyi gösteriyor?

Çünkü birden fazla önbellek var. revalidateTag veriyi tazeler, ama render edilmiş rota hâlâ önbellekteyse taze verinin gidecek yeri yoktur. Koda dokunmadan önce hangi önbelleğin tuttuğunu sorun.

CMS'e yeni eklenen sayfalar neden 404 dönüyor?

404 de önbelleklenmiştir. generateStaticParams ile dağıtılmış build sabit bir slug listesi bilir, ve hiç üretmediği bir yol için render ettiği 404 de diğerleri gibi önbelleklenmiş bir yanıttır. Etiketin yanında yolu da revalidatePath ile temizleyin.

Next.js önbelleği bir kullanıcının sayfasını başkasına sızdırabilir mi?

Evet, kullanıcı verisi çerezlere hiç dokunmayan bir yoldan çekiliyorsa. Server Component'te çerez okumak rotayı statik render'dan çıkarır, ki istediğiniz davranış budur. Akıl yürütmek yerine iki tarayıcıda iki hesapla test edin.