LCP Optimizasyonu: Görüntü Ön Yüklemesi, Kritik CSS ve SSR
Il En Büyük İçerikli Boya (LCP) geçen zamanı ölç sayfanın yüklenmesinden en büyük öğenin göründüğü ana kadar görünüm penceresi oluşturulur. Google, 2,5 saniyenin altındaki LCP'yi "iyi" olarak değerlendiriyor, 2,5 ila 4 saniye arasında "geliştirilecek", 4 saniyeden fazla "zayıf". Bu üçünden biri Arama sıralamalarını doğrudan etkileyen Önemli Web Verileri.
LCP'yi optimize etmek aşağıdakileri anlamayı gerektirir: kritik yol: sıra tarayıcının öğeyi oluşturabilmesi için tamamlaması gereken işlemlerin sayısı LCP. Kritik yoldaki gereksiz kaynaklar LCP'yi geciktirir. Dört strateji daha yüksek etki — görselin önceden yüklenmesi, kritik satır içi CSS, optimizasyon yazı tipleri ve Sunucu Tarafı İşleme — çoğu durumda LCP'yi 500 ms-2 saniye kadar azaltır gerçek vakaların bir parçası.
Ne Öğreneceksiniz
- Tarayıcı LCP öğesini nasıl keşfeder ve yükler: kritik yol
- fetchpriority = "yüksek": tarayıcıya hangi resmin öncelikli olduğunu söyleyin
- rel = "preload": Ayrıştırıcı onları keşfetmeden önce kaynakları önceden yükleyin
- Kritik CSS satır içi: stil sayfalarının oluşturulmasının engellenmesini ortadan kaldırın
- font-display: LCP'yi geciktiren FOIT'i önlemek için takas ve isteğe bağlı
- Sunucu Tarafı İşleme: LCP için şelale JS'yi ortadan kaldırın
- WebPageTest ve PerformanceObserver ile gerçek etkiyi ölçün
LCP için Kritik Yol
Optimize etmeden önce, sizin özel durumunuzda LCP'yi neyin engellediğini anlamanız gerekir. Tarayıcı, LCP öğesini oluşturmak için şu adımları izler:
// PerformanceObserver: misura il tuo LCP reale
const observer = new PerformanceObserver((list) => {
// L'ultimo entry e il piu aggiornato
const entries = list.getEntries();
const lastEntry = entries[entries.length - 1];
console.log('LCP Element:', lastEntry.element?.tagName);
console.log('LCP Time:', lastEntry.startTime.toFixed(0), 'ms');
console.log('LCP URL:', lastEntry.url); // se e un'immagine
// Breakdown del tempo LCP
if (lastEntry.element) {
const el = lastEntry.element;
const rect = el.getBoundingClientRect();
console.log('Element size:', rect.width * rect.height, 'px^2');
}
});
observer.observe({ type: 'largest-contentful-paint', buffered: true });
// Quali elementi vengono considerati per l'LCP?
// - img elements
// - image elements dentro svg
// - video elements (usa il poster)
// - background-image (solo via CSS)
// - block-level elements con testo (h1, p, div con testo visibile)
// L'elemento piu grande nel viewport al momento del paint
// Come trovare l'elemento LCP in DevTools:
// 1. Apri Chrome DevTools > Performance
// 2. Registra un caricamento
// 3. Cerca "LCP" nella timeline
// 4. Clicca sull'entry: mostra quale elemento
fetchpriority = "yüksek": Açık Tarayıcı Önceliği
Tarayıcı hangi kaynakların yükleneceğine karar vermek için dahili bir öncelik sistemi kullanır
önce. Varsayılan olarak resimler düşük veya orta önceliğe sahiptir. Özellik
fetchpriority="high" tarayıcıya bu görüntünün LCP olduğunu söyler
öğedir ve önce yüklenmesi gerekir.
Kritik CSS Satır İçi: İşleme Engellemeyi Ortadan Kaldırın
Harici stil sayfaları, indirilene ve ayrıştırılana kadar görüntü oluşturmayı engeller. Yavaş bir ağ veya yavaş bir sunucu, LCP'yi yalnızca 500 ms-2 saniye geciktirebilir Bir CSS dosyası için. Çözüm: kritik CSS'yi satır içi doğrudan HTML'de (içeriği ekranın üst kısmında oluşturmak için CSS gereklidir) e geri kalanını eşzamansız olarak yükleyin.
// Tool per estrarre automaticamente il Critical CSS
// criticalcss (npm) oppure Vite Critical CSS plugin
// Configurazione Vite con vite-plugin-critical
// vite.config.ts
import { defineConfig } from 'vite';
import critical from 'vite-plugin-critical';
export default defineConfig({
plugins: [
critical({
criticalUrl: 'http://localhost:4173',
criticalBase: 'dist/',
criticalPages: [
{ uri: '/', template: 'index' },
{ uri: '/blog', template: 'blog' },
],
criticalConfig: {
inline: true,
dimensions: [
{ width: 375, height: 812 }, // iPhone
{ width: 1440, height: 900 }, // Desktop
],
},
}),
],
});
Yazı Tipi Optimizasyonu: Kritik Yoldaki FOIT'i Ortadan Kaldırın
Web yazı tipleri genellikle LCP öğesi metninin oluşturulmasını engeller. Yazı tipi değilse
hala yüklüyse, tarayıcı önce (FOIT - Görünmez Metin Flash'ı) bekler
metni işleyin. font-display: swap önce geri dönüşü göster
daha sonra değiştirir, ancak bir CLS oluşturur. font-display: optional ve seçim
LCP için daha iyi: yazı tipi önceden önbelleğe alınmamışsa geri dönüşü kullanın.
/* Font loading ottimizzato per LCP */
/* 1. Preconnect al CDN del font (risparmia ~100ms di DNS lookup) */
/* Nel :
*/
/* 2. Preload del font critico (quello usato dall'LCP element) */
/* Nel :
*/
/* 3. font-display strategy */
@font-face {
font-family: 'Inter';
src: url('/fonts/inter-latin-400.woff2') format('woff2');
font-weight: 400;
font-style: normal;
font-display: optional;
/* optional: usa il font solo se gia in cache.
Al primo caricamento usa system font (zero FOIT, zero CLS).
Dal secondo caricamento usa il web font. */
unicode-range: U+0000-00FF; /* Solo Latin: riduce dimensione */
}
/* Per testi LCP critici: usa fallback con metriche simili */
/* Riduci CLS da font swap usando size-adjust */
@font-face {
font-family: 'Inter-Fallback';
src: local('Arial'); /* Font di sistema come fallback */
ascent-override: 90%;
descent-override: 22%;
line-gap-override: 0%;
size-adjust: 107%;
/* Metriche calibrate per ridurre il layout shift */
}
.lcp-heading {
font-family: 'Inter', 'Inter-Fallback', system-ui;
}
Sunucu Tarafı Oluşturma: JavaScript Şelalesini Ortadan Kaldırın
İstemci tarafı işlemeli Tek Sayfalı Uygulamalarda (SPA'lar) bir sorun var LCP için yapısal: tarayıcı HTML'yi indirmeli, JavaScript'i yürütmeli, verilere istekte bulunun ve ardından içeriği işleyin. Bu "şelale" LCP'ye 1-3 saniye ekleyin. Sunucu Tarafı İşleme (SSR) bu sorunu çözer önceden oluşturulmuş HTML'yi istemciye gönderme.
// Impatto SSR sull'LCP: misurazioni reali
// SPA senza SSR: waterfall tipico
// 0ms - Browser riceve HTML (vuoto, solo )
// 200ms - Scarica bundle JavaScript (150KB gzipped)
// 400ms - Esegue JavaScript, monta il framework
// 600ms - Prima render: scheletro UI (loading spinner)
// 800ms - API request per i dati
// 1200ms - Risposta API
// 1300ms - Render con dati: LCP event
// LCP = ~1300ms (buono ma potrebbe essere meglio)
// Con SSR: nessun waterfall
// 0ms - Browser invia request
// 150ms - Server renderizza HTML completo con dati
// 350ms - Browser riceve HTML gia renderizzato con l'LCP element visibile
// 350ms - LCP event: l'elemento e gia nella pagina!
// LCP = ~350ms (eccellente)
// Angular Universal (SSR) - esempio di configurazione
// angular.json: abilita SSR
// "server": { "builder": "@angular-devkit/build-angular:application" }
// app.config.server.ts:
import { ApplicationConfig } from '@angular/core';
import { provideServerRendering } from '@angular/platform-server';
export const serverConfig: ApplicationConfig = {
providers: [
provideServerRendering(),
],
};
// Next.js: LCP ottimale con SSR e Image component
// Ogni pagina e server-rendered by default in App Router
// Il componente Image gestisce automaticamente:
// - fetchpriority="high" per above-fold images
// - preload link nel head
// - srcset per responsive images
// - dimensioni esplicite per evitare CLS
Etkinin Ölçülmesi: Öncesi ve Sonrası
// Misura il tuo LCP prima di ottimizzare
// e dopo per verificare il miglioramento
// web-vitals.js: libreria Google per misurare CWV
import { onLCP, onFID, onCLS } from 'web-vitals';
function sendToAnalytics(metric) {
// Invia a Google Analytics o sistema custom
gtag('event', metric.name, {
value: Math.round(metric.value),
metric_id: metric.id,
metric_value: metric.value,
metric_delta: metric.delta,
metric_rating: metric.rating, // 'good' | 'needs-improvement' | 'poor'
});
}
onLCP(sendToAnalytics);
// WebPageTest: test sintetico con waterfall dettagliato
// https://www.webpagetest.org
// Parametri raccomandati:
// - Location: EC2 Frankfurt (per utenti EU)
// - Connection: 4G (LTE) - 9 Mbps down, 9 Mbps up, 170ms RTT
// - Repeat Views: si (testa cache)
// - Video capture: si (vedi frame-by-frame quando appare l'LCP)
// Risultati da cercare nel waterfall:
// - Quante risorse bloccano il rendering? (Resources in Critical Chain)
// - Quando viene scoperta l'immagine LCP? (piu presto = meglio)
// - Quanto dura il "Render-Blocking" bar? (dovrebb essere < 200ms)
LCP Optimizasyon Kontrol Listesi
- LCP öğesini DevTools Performance veya WebPageTest ile tanımlayın
- fetchpriority="high" ekleyin ve LCP öğesindenloading="lazy" ifadesini kaldırın
- Resimler için: AVIF/WebP, duyarlı srcset, açık boyutlar kullanın
- Kritik CSS'yi ekranın üst kısmında satır içi yapın, geri kalanını eşzamansız yükleyin
- LCP öğesi tarafından kullanılan yazı tipini önceden yükleyin
- SSR kullanıyorsanız: LCP öğesinin ilk HTML'de olduğundan emin olun
- Üretimde LCP P75'i CrUX veya web-vitals.js ile ölçün
Sonuçlar
LCP optimizasyonu temelde zamanı azaltmaya yönelik bir alıştırmadır kritik yolda: tarayıcının oluşturmadan önce indirmesi gereken her kaynak LCP öğesi iyileştirme için bir fırsattır. Getirme önceliğiyle kritik CSS satır içi ve SSR ile tipik mobil bağlantılarda 1 saniyenin altındaki LCP'lere ulaşabilirsiniz.







