
Next.js projelerindeki performans sorunlarını keşfet ve Core Web Vitals skorlarını iyileştirmek için pratik optimizasyon tekniklerini öğren.
Next.js kutudan çıktığı gibi harika araçlar sunar ancak uygulamanızı otomatik olarak hızlı yapmaz. Eğer Lighthouse skorlarınız düşüyorsa veya kullanıcılar sayfada kaymalar (layout shift) yaşıyorsa, bazı yaygın performans tuzaklarına düşüyor olabilirsiniz.
Bu yazıda, Next.js projelerini yavaşlatan en büyük 4 nedeni ve modern App Router özellikleri ile bunları nasıl çözeceğinizi inceliyoruz.
"use client")Modern Next.js uygulamalarındaki 1 numaralı performans katili, sırf hook veya event listener kullanabilmek için her dosyanın en başına "use client" yazmaktır.
Tüm sayfa ağacını Client Component haline getirmek; bu durum JavaScript paket (bundle) boyutunu büyütür ve tüm render yükünü kullanıcının tarayıcısına yıkar.
Bileşenlerinizi varsayılan olarak Server Component olarak tutun. "use client" direktifini bileşen ağacının olabildiğince derinine — yalnızca etkileşimli yapraklara (butonlar, inputlar, açılır menüler) taşıyın.
Görseller web üzerindeki indirilen baytların çoğunluğunu oluşturur. Standart HTML <img> etiketleri veya yanlış yapılandırılmış next/image bileşenleri LCP (Largest Contentful Paint) skorunuzu mahveder.
Devasa, sıkıştırılmamış PNG'ler yüklemek veya açık width ve height değerleri vermemek.
Her zaman Next.js'in yerleşik <Image /> bileşenini kullanın, doğru sizes prop'unu verin ve Sanity'nin görsel altyapısının modern WebP/AVIF formatları sunmasına izin verin.
Bileşenler içinde ardışık (sequential) veri çekmek, tarayıcının İstek A bittikten sonra İstek B'ye başlamasını beklediği ağ tıkanıklıklarına (waterfall) yol açar.
Tek bir bileşen içinde paralel hale getirilmemiş çok sayıda bağımlı await fetch() çağrısı yapmak.
Bağımsız veri akışlarını aynı anda tetiklemek için JavaScript'in Promise.all() metodunu kullanın:
async function getData(postId: string) {
const [postData, commentsData] = await Promise.all([
fetch(`[https://api.example.com/posts/$](https://api.example.com/posts/$){postId}`),
fetch(`[https://api.example.com/posts/$](https://api.example.com/posts/$){postId}/comments`),
]);
return {
post: await postData.json(),
comments: await commentsData.json(),
};
}
Google Analytics, canlı destek widget'ları veya takip script'lerini strateji yönetimi olmadan doğrudan layout içine gömmek ana iş parçacığını (main thread) bloke eder.
Ham <script src="..."> etiketleri kullanmak.
Next.js <Script> bileşenini uygun yükleme stratejileriyle (strategy="lazyOnload") kullanın.
@next/bundle-analyzer kullanarak paket boyutunuzu denetleyin.Suspense sınırlarını stratejik kullanın.