Teknik Rehber
2025
Core Web Vitals 2025: INP, LCP, CLS İyileştirme için Adım Adım Check-List
2025’te Core Web Vitals ( INP, LCP, CLS ) skorlarını kalıcı olarak “Good” seviyesine taşımak için
pratik teşhis akışı, iyileştirme taktikleri ve kontrol listeleri hazırladık.
Hedef: daha hızlı yükleme, akıcı etkileşim, sıfıra yakın layout shift.
- Alan verisi odaklı iyileştirme: CrUX + GA4 ile gerçek kullanıcı verisine göre optimizasyon.
- Hedefe yönelik taktikler: INP için JS optimizasyonu, LCP için kritik yol kısaltma, CLS için ölçü tanımlama.
- Uygulanabilir kontrol listeleri: Her metrik için adım adım yapılacaklar.
Gerçek kullanıcı etkileşimlerinde gecikme
En büyük içerikli boyanın gerçekleşme süresi
Toplam layout shift skoru
Core Web Vitals Nedir? 2025 Eşikleri
Core Web Vitals, Google’ın kullanıcı deneyimi odaklı hız sinyalleridir. 2025’te değerlendirmede öne çıkan
üç ana metrik: INP (Interaction to Next Paint), LCP (Largest Contentful Paint) ve CLS (Cumulative Layout Shift).
Kullanıcının etkileşim yapmasından (tıklama, dokunma, klavye) sonra görsel tepki verene kadar geçen süre.
Sayfadaki en büyük içerik öğesinin (görsel, başlık, blok) yüklenme süresi.
Beklenmedik layout kaymalarının toplam skorudur; okuma ve etkileşimi bozar.
Hızlı Teşhis Akışı (Field → Lab)
Gerçek kullanıcı verisi (origin & URL).
Sayfa/cihaz/ülke kırılımları, sorunlu segmentler.
Lighthouse, WebPageTest, DevTools Profiler.
Küçük parça değiştir, yeniden ölç.
INP: Etkileşim Gecikmesini Düşürme
Başlıca Nedenler
- Ağır JS paketleri, main thread blokajı
- Senkron 3P script’ler (chat, tag manager aşırılığı)
- Uzun event handler’lar, DOM reflow döngüleri
Hızlı Kazanımlar
- Code-split & lazy-load: Route/şablon başına JS paketlerini küçültün.
- Non-critical JS “defer”: Kullanıcı etkileşimi sonrası yükleyin.
- Event delegasyonu: Tek bir üst kapsayıcıya dinleyici tanımlayın.
<!-- 1) Kritik olmayan script'leri ertele -->
<script src="/js/widgets.js" defer></script>
<!-- 2) Etkileşim sonrası yükleme (mikro görev) -->
<button id="openChat">Canlı Destek</button>
<script>
document.getElementById('openChat').addEventListener('click', async () => {
const { initChat } = await import('/js/chat-widget.js'); // dynamic import
initChat();
});
</script>
<!-- 3) Event delegasyonu -->
<ul id="menu">...</ul>
<script>
document.getElementById('menu').addEventListener('click', (e) => {
const item = e.target.closest('[data-menu-item]');
if(!item) return;
// kısa, saf JS handler
});
</script>
LCP: En Büyük İçerikli Boyayı Hızlandırma
Kritik Yol Kısaltma
- Preconnect ve DNS-prefetch ile istek hazırlığı
- LCP görselini preload + fetchpriority=”high”
- Responsive, sıkıştırılmış görseller (WebP/AVIF)
- Kritik CSS inline, geri kalanı media / async
<!-- Kaynak hazırlığı -->
<link rel="preconnect" href="https://cdn.site.com" crossorigin>
<link rel="dns-prefetch" href="//cdn.site.com">
<!-- LCP görseli preload -->
<link rel="preload" as="image" href="/img/hero@2x.avif" imagesrcset="/img/hero.avif 1x, /img/hero@2x.avif 2x" imagesizes="(max-width: 768px) 100vw, 1200px">
<!-- Görsel bileşeni -->
<img
src="/img/hero.avif"
srcset="/img/hero.avif 600w, /img/hero@2x.avif 1200w"
sizes="(max-width: 768px) 100vw, 1200px"
width="1200" height="630" fetchpriority="high" decoding="async" alt="Ürün kahraman görseli">
CLS: Görsel/Sekme Kaymalarını Önleme
Kaynaklı Problemler
- Boyut tanımlanmayan görseller/video iframeleri
- Sonradan yüklenen reklam/widget bileşenleri
- Web fontları (FOIT/FOUT), dinamik içerik enjeksiyonları
Çözüm Prensipleri
- Genişlik/yükseklik veya aspect-ratio tanımlayın
- Reklam/yer tutucu alanları önceden rezerve edin
- Tipografi için font-display: swap veya optional
/* Görsel/iframe boyutları */
.card .thumb {
aspect-ratio: 16/9; /* ya da width/height attribute kullanın */
object-fit: cover;
}
/* Reklam alanı rezerve etme */
.ad-slot {
min-height: 250px; /* olası yükseklikler: 250, 280, 600 */
}
/* Font yüklemesi */
@font-face{
font-family:"Inter";
src:url("/fonts/inter-var.woff2") format("woff2");
font-display:swap; /* optional da kullanılabilir */
}
Ölçümleme & Raporlama (CrUX, GA4, GSC)
- INP: 480 ms → 180 ms
- LCP: 3.8 s → 2.2 s
- CLS: 0.22 → 0.06
Not: Örnek veri; CrUX “last 28 days” penceresi baz alınarak raporlanır.
<!-- Web Vitals'ı GA4'e gönderme (örnek) -->
<script type="module">
import {onLCP, onINP, onCLS} from 'https://unpkg.com/web-vitals?module';
function sendToGA4({name, value}) {
window.gtag && gtag('event', name, {
value: Math.round(name === 'CLS' ? value * 1000 : value), // CLS * 1000
event_category: 'web-vitals',
non_interaction: true
});
}
onLCP(sendToGA4); onINP(sendToGA4); onCLS(sendToGA4);
</script>
Teknik Kontrol Listesi (Hızlı Uygulama)
INP
- JS paketleri < 200KB (gzip/brotli)
- 3P script’ler defer + lazy
- Uzun handler < 50 ms
LCP
- LCP görseli preload + high priority
- Kritik CSS inline < 10KB
- CDN + preconnect
CLS
- Tüm görsellere width/height
- Reklam/iframe alanı rezerve
- Font display: swap
Sık Sorulan Sorular