Optimalizace LCP: Předběžné načítání obrazu, kritické CSS a SSR
Il Největší obsahová barva (LCP) měřit čas, který ubíhá od načtení stránky do okamžiku, kdy je v ní viditelný největší prvek je vykreslen výřez. Google považuje LCP pod 2,5 sekundy za „dobré“, mezi 2,5 a 4 sekundami „bude zlepšeno“, nad 4 sekundy „špatné“. Je to jeden ze tří Core Web Vitals, které přímo ovlivňují hodnocení ve vyhledávání.
Optimalizace LCP vyžaduje pochopení kritická cesta: sekvence operací, které musí prohlížeč dokončit, než bude moci prvek vykreslit LCP. Jakékoli zbytečné prostředky na kritické cestě zpožďují LCP. Čtyři strategie vyšší dopad — předběžné načítání obrázků, kritické inline CSS, optimalizace fontů a vykreslování na straně serveru – ve většině případů zkraťte LCP o 500 ms-2 sekundy součástí skutečných případů.
Co se naučíte
- Jak prohlížeč zjišťuje a načítá prvek LCP: kritická cesta
- fetchpriority="high": sdělte prohlížeči, který obrázek má prioritu
- rel="preload": Předběžně načte zdroje, než je analyzátor objeví
- Kritické inline CSS: eliminujte blokování vykreslování šablon stylů
- font-display: swap a volitelné, aby se zabránilo FOIT, který zpožďuje LCP
- Vykreslování na straně serveru: Odstraňte vodopád JS pro LCP
- Měřte skutečný dopad pomocí WebPageTest a PerformanceObserver
Kritická cesta pro LCP
Před optimalizací musíte pochopit, co ve vašem konkrétním případě blokuje LCP. Prohlížeč při vykreslování prvku LCP postupuje takto:
// 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="high": Explicitní priorita prohlížeče
Prohlížeč používá interní prioritní systém k rozhodnutí, které zdroje načíst
dříve. Ve výchozím nastavení mají obrázky nízkou nebo střední prioritu. Atribut
fetchpriority="high" sděluje prohlížeči, že tento obrázek je LCP
prvek a musí být načten jako první.
Critical CSS Inline: Eliminujte blokování vykreslování
Externí šablony stylů blokují vykreslování, dokud nejsou staženy a analyzovány. Pomalá síť nebo pomalý server může zpozdit LCP pouze o 500 ms-2 sekundy pro soubor CSS. Řešení: vložit kritické CSS přímo v HTML (CSS potřebný k vykreslení obsahu nad okrajem) e načíst zbytek asynchronně.
// 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
],
},
}),
],
});
Optimalizace písma: Eliminujte FOIT na kritické cestě
Webová písma často blokují vykreslování textu prvku LCP. Pokud písmo není
stále načten, prohlížeč čeká na (FOIT - Flash of Invisible Text) předtím
vykreslit text. font-display: swap ukažte nejprve záložní
pak nahradí, ale vytvoří CLS. font-display: optional a výběr
lepší pro LCP: použijte záložní, pokud písmo již není uloženo v mezipaměti.
/* 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;
}
Vykreslování na straně serveru: Eliminujte vodopád JavaScript
Jednostránkové aplikace (SPA) s vykreslováním na straně klienta mají problém strukturální pro LCP: prohlížeč musí stáhnout HTML, spustit JavaScript, vznést požadavky na data a poté vykreslit obsah. Tento "vodopád" může přidejte 1-3 sekundy na LCP. Server-Side Rendering (SSR) to řeší odeslání již vykresleného HTML klientovi.
// 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
Měření dopadu: Před a po
// 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)
Kontrolní seznam optimalizace LCP
- Identifikujte prvek LCP pomocí DevTools Performance nebo WebPageTest
- Přidejte fetchpriority="high" a odstraňte loading="lazy" z prvku LCP
- Pro obrázky: použijte AVIF/WebP, responzivní srcset, explicitní rozměry
- Vložte kritické CSS nad okraj, zbytek načtěte asynchronně
- Předem načtěte písmo používané prvkem LCP
- Pokud používáte SSR: Ujistěte se, že prvek LCP je v počátečním HTML
- Změřte LCP P75 pomocí CrUX nebo web-vitals.js ve výrobě
Závěry
Optimalizace LCP je v podstatě cvičením ve zkrácení času na kritické cestě: každý zdroj, který musí prohlížeč stáhnout před vykreslením prvek LCP je příležitostí ke zlepšení. S prioritou načítání, kritickým CSS inline a SSR můžete u typických mobilních připojení dosáhnout LCP pod 1 sekundu.







