İLETİŞİME GEÇİN
LCP, INP ve CLS neyi ölçer, eşikleri nedir ve üretimde nasıl iyileştirilir? Saha ve laboratuvar ölçümünden performans bütçesine pratik bir rehber.

Core Web Vitals, Google'ın bir web sayfasındaki kullanıcı deneyimini üç ölçüyle özetlediği metrik setidir: sayfanın ana içeriğinin ne kadar hızlı göründüğü, etkileşimlere ne kadar çabuk yanıt verildiği ve yerleşimin ne kadar sabit kaldığı. Google bu metrikleri arama sıralamasında kullandığı sayfa deneyimi sinyallerinin bir parçası olarak tanımlıyor; ancak içeriğin alakası her zaman önce gelir. Asıl kazanç, sayfanın kullanıcı için gerçekten daha hızlı ve kararlı hâle gelmesidir. Bu yazıda her metriğin neyi ölçtüğünü, nasıl ölçüleceğini ve üretimde hangi müdahalelerin işe yaradığını ele alıyoruz.
Bu eşikler, sayfayı ziyaret eden kullanıcıların 75. yüzdelik dilimine göre değerlendirilir. Yani ortalama değil, yavaş cihaz ve bağlantılardaki kullanıcıları da kapsayan bir değer esas alınır.
İki tür veri vardır ve ikisi farklı sorulara cevap verir:
web-vitals kütüphanesi kullanılabilir.import { onLCP, onINP, onCLS } from "web-vitals";
function gonder(metrik) {
navigator.sendBeacon("/api/vitals", JSON.stringify({
ad: metrik.name,
deger: metrik.value,
sayfa: location.pathname,
}));
}
onLCP(gonder);
onINP(gonder);
onCLS(gonder);
Saha verisi "sorun var mı ve kimde?" sorusunu, laboratuvar verisi "neden ve düzeldi mi?" sorusunu yanıtlar. İkisini birlikte kullanmak gerekir.
LCP süresi dört alt parçaya ayrılabilir: sunucunun ilk baytı gönderme süresi (TTFB), LCP kaynağının yüklenmeye başlamadan önce beklediği süre, kaynağın indirilme süresi ve indirildikten sonra ekrana çizilene kadar geçen süre. Hangi parçanın uzun olduğunu bilmeden yapılan iyileştirme çoğu zaman yanlış yere harcanır. Chrome DevTools'un Performance panelinde bu dağılım ayrıca gösterilir.
Yüksek TTFB'nin yaygın nedenleri; her istekte yeniden hesaplanan sayfalar, yavaş veritabanı sorguları ve kullanıcıdan uzak sunuculardır. Statik üretilebilen sayfaları önceden üretmek, değişmeyen içeriği CDN'de önbelleğe almak ve sayfanın ilk bölümünü yavaş veriyi beklemeden göndermek (streaming) bu süreyi kısaltır.
LCP öğesi çoğu sayfada bir kahraman görseli ya da büyük bir başlıktır. Görselse:
<img src="/hero.avif" alt="..." width="1200" height="600"
fetchpriority="high">
loading="lazy" vermeyin; tarayıcı yüklemeyi geciktirir.<link rel="preload" as="image"> ile tarayıcıya önceden bildirin.fetchpriority="high" ile tarayıcıya bu kaynağın öncelikli olduğunu söyleyin.srcset ile mobil cihazlara küçük sürümü gönderin.Büyük CSS dosyaları ve head içindeki senkron script'ler, kaynak inmiş olsa bile çizimi geciktirir. Kritik olmayan script'leri defer veya async ile yükleyin. LCP öğesi bir metinse, web fontu beklenirken metnin görünmez kalmaması için font-display: swap ya da optional kullanın.
INP kötüyse sorun neredeyse her zaman ana iş parçacığının (main thread) meşgul olmasıdır. Kullanıcı tıkladığında tarayıcı o sırada çalışan uzun bir görevi bitirmeden yanıt veremez. Bir etkileşimin süresi üç bölümden oluşur: girdi gecikmesi, olay işleyicinin çalışma süresi ve sonrasındaki çizim süresi.
scheduler.yield(), diğerlerinde setTimeout ile bu yapılabilir.useTransition ve useDeferredValue, örneğin büyük bir listenin filtrelenmesini düşük öncelikli yaparak yazma alanının akıcı kalmasını sağlar.Uzun görev, ana iş parçacığını 50 milisaniyeden uzun süre meşgul eden görev olarak tanımlanır. Aşağıdaki desen, büyük bir listeyi işlerken bu sınıra yaklaşıldığında tarayıcıya söz hakkı verir:
function anaIsParcaciginaVer() {
if (globalThis.scheduler?.yield) return scheduler.yield();
return new Promise((resolve) => setTimeout(resolve, 0));
}
async function satirlariIsle(satirlar) {
let baslangic = performance.now();
for (const satir of satirlar) {
isle(satir);
if (performance.now() - baslangic > 50) {
await anaIsParcaciginaVer();
baslangic = performance.now();
}
}
}
width ve height nitelikleri ya da CSS aspect-ratio ile tarayıcı yeri önceden ayırır.size-adjust gibi tanımlayıcılarla web fontuna yaklaştırmak, font yüklendiğinde metnin zıplamasını engeller.transform kullanın. top veya height gibi yerleşimi değiştiren özellikleri canlandırmak kaymaya sayılabilir.Tek seferlik bir iyileştirme, birkaç ay içinde yeni özellikler ve eklenen script'lerle geri kaybolabilir. Bunu önlemenin yolu performansı sürecin parçası yapmaktır:
Core Web Vitals'ı bir SEO maddesi olarak değil, kullanıcıların sayfanızı nasıl deneyimlediğinin bir ölçüsü olarak görmek, hangi iyileştirmenin öncelikli olduğuna karar vermeyi de kolaylaştırır.
Yorumlar yakında etkinleştirilecek.

Token, primitive ve composite bileşen katmanlarıyla erişilebilir, temalanabilir ve sürdürülebilir bir React tasarım sistemi nasıl kurulur?

Server Components, paralel veri yükleme, Suspense ile streaming, önbellek kararları ve Server Actions: App Router ile performans odaklı bir Next.js mimarisi nasıl kurulur?

Mobil uygulama projenize başlamadan önce verilecek en kritik kararlardan biri: native mi, cross-platform mı? İki yaklaşımı dürüstçe karşılaştırıyor, doğru seçimi nasıl yapacağınızı anlatıyoruz.