Core Web Vitals Optimalizálás
Mi az a Core Web Vitals és miért fontos?
A Core Web Vitals a Google három legfontosabb felhasználói élmény metrikája, amelyek azt mérik, hogy egy weboldal mennyire gyorsan tölt be, mennyire interaktív, és mennyire stabil vizuálisan. Ezek a metrikák 2021 óta hivatalos Google ranking faktorok, ami azt jelenti, hogy közvetlenül befolyásolják a keresési eredményekben való helyezésedet.
A Core Web Vitals három metrikából áll:
LCP (Largest Contentful Paint): A legnagyobb tartalmi elem betöltési ideje. Ez méri, hogy a legfontosabb tartalom (általában egy nagy kép vagy szövegblokk) mennyi idő alatt válik láthatóvá. A jó érték: kevesebb mint 2.5 másodperc.
FID (First Input Delay): Az első interakció késleltetése. Ez azt méri, hogy mennyi időbe telik, mire a böngésző reagál a felhasználó első kattintására, gombnyomására vagy érintésére. A jó érték: kevesebb mint 100 milliszekundum. (2024 márciusától az FID-t felváltja az INP - Interaction to Next Paint.)
CLS (Cumulative Layout Shift): Az összesített elrendezés-eltolódás. Ez méri a váratlan layout változásokat oldal betöltés közben (pl. amikor egy kép megjelenik és eltol egy gombot). A jó érték: kevesebb mint 0.1.
Ezek a metrikák kritikusak, mert:
- Ranking faktor: A Google figyelembe veszi őket a keresési helyezésnél
- Felhasználói élmény: Jobb metrikák = elégedettebb látogatók = alacsonyabb bounce rate
- Konverzió: Gyorsabb oldalak magasabb konverziós arányt eredményeznek
- Mobil SEO: Különösen fontos mobilon, ahol a felhasználók elvárják a gyors betöltést
Hogyan működnek a Core Web Vitals metrikák?
LCP - Largest Contentful Paint
Az LCP azt méri, hogy a viewport legnagyobb látható tartalmi eleme mennyi idő alatt töltődik be. Ez az elem lehet:
<img>tag<image>elem egy<svg>-n belül<video>tag (a poster kép)- URL-lel betöltött háttérkép (
background-image) - Szöveget tartalmazó blokk szintű elem (
<h1>,<p>, stb.)
Jó LCP érték elérése:
<!-- 1. Képek optimalizálása és preload -->
<link rel="preload" as="image" href="/hero-image.webp">
<img
src="/hero-image.webp"
alt="Hero kép"
width="1200"
height="600"
loading="eager"
fetchpriority="high"
><!-- 2. Kritikus CSS inline, többi defer -->
<style>
/* Kritikus above-the-fold CSS */
.hero { display: flex; }
</style>
<link rel="preload" href="/styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/styles.css"></noscript>// 3. Lazy loading nem-kritikus képekre
document.addEventListener('DOMContentLoaded', function() {
const lazyImages = document.querySelectorAll('img[loading="lazy"]');
if ('IntersectionObserver' in window) {
const imageObserver = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.classList.remove('lazy');
imageObserver.unobserve(img);
}
});
});
lazyImages.forEach(img => imageObserver.observe(img));
}
});# 4. Szerver válaszidő javítása (nginx config)
http {
# Gzip tömörítés
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/css application/javascript image/svg+xml;
# Cache headers
location ~* \.(jpg|jpeg|png|webp|svg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}FID/INP - First Input Delay / Interaction to Next Paint
Az FID azt méri, hogy mennyi idő telik el a felhasználó első interakciója (kattintás, tap) és a böngésző válasza között. 2024 márciusától az INP (Interaction to Next Paint) veszi át az FID helyét, amely minden interakciót mér, nem csak az elsőt.
Jó FID/INP érték elérése:
<!-- 1. JavaScript defer/async használata -->
<!-- Defer: HTML parsing után fut, sorrend megmarad -->
<script defer src="/main.js"></script>
<!-- Async: amint letöltődik, fut (sorrend nem garantált) -->
<script async src="/analytics.js"></script>// 2. Long tasks felosztása
// Rossz példa: blokkoló long task
function processLargeArray(items) {
items.forEach(item => {
// Időigényes művelet
processItem(item);
});
}
// Jó példa: felosztás kisebb taskokra
async function processLargeArrayOptimized(items) {
const chunkSize = 100;
for (let i = 0; i < items.length; i += chunkSize) {
const chunk = items.slice(i, i + chunkSize);
// Feldolgozás
chunk.forEach(item => processItem(item));
// Yield vissza a main thread-nek
await new Promise(resolve => setTimeout(resolve, 0));
}
}// 3. requestIdleCallback használata nem kritikus feladatokra
function sendAnalytics(data) {
if ('requestIdleCallback' in window) {
requestIdleCallback(() => {
fetch('/analytics', {
method: 'POST',
body: JSON.stringify(data)
});
}, { timeout: 2000 });
} else {
// Fallback régebbi böngészőkre
setTimeout(() => {
fetch('/analytics', {
method: 'POST',
body: JSON.stringify(data)
});
}, 1000);
}
}// 4. Event handler optimalizálás
// Rossz példa: szinkron, lassú handler
button.addEventListener('click', (e) => {
// Szinkron, blokkoló művelet
const result = heavyComputation();
updateUI(result);
});
// Jó példa: nem blokkoló handler
button.addEventListener('click', async (e) => {
// Immediate feedback
button.classList.add('loading');
// Async művelet
const result = await heavyComputationAsync();
// UI update
requestAnimationFrame(() => {
button.classList.remove('loading');
updateUI(result);
});
});CLS - Cumulative Layout Shift
A CLS méri a váratlan layout eltolódásokat. Minden alkalommal, amikor egy látható elem pozíciója megváltozik, az hozzájárul a CLS pontszámhoz.
CLS problémák okai és megoldásai:
<!-- 1. Képeknek MINDIG add meg a méretet! -->
<!-- Rossz példa: méret nélküli kép -->
<img src="/image.jpg" alt="Kép">
<!-- Jó példa: explicit width/height -->
<img
src="/image.jpg"
alt="Kép"
width="800"
height="600"
>
<!-- Vagy CSS aspect-ratio használata -->
<style>
.responsive-img {
width: 100%;
height: auto;
aspect-ratio: 16 / 9;
}
</style>
<img src="/image.jpg" alt="Kép" class="responsive-img"><!-- 2. Reklámok és beágyazások számára hely foglalása -->
<div class="ad-container" style="min-height: 250px;">
<!-- Reklám betöltődik ide -->
<div id="ad-slot"></div>
</div>
<style>
.ad-container {
min-height: 250px;
background: #f0f0f0;
display: flex;
align-items: center;
justify-content: center;
}
.ad-container::before {
content: 'Hirdetés betöltése...';
color: #999;
}
</style>/* 3. Font loading optimalizálás - FOUT/FOIT elkerülése */
@font-face {
font-family: 'CustomFont';
src: url('/fonts/custom.woff2') format('woff2');
font-display: swap; /* Fallback font azonnal, custom font swap */
font-weight: 400;
font-style: normal;
}
/* Vagy font-display: optional a CLS 0 értékért */
@font-face {
font-family: 'OptionalFont';
src: url('/fonts/optional.woff2') format('woff2');
font-display: optional; /* Ha nem tölt be 100ms-en belül, fallback marad */
}<!-- 4. Preload kritikus fontokra -->
<link
rel="preload"
href="/fonts/custom.woff2"
as="font"
type="font/woff2"
crossorigin
>/* 5. Animációk transform/opacity használatával (nem layout tulajdonságok) */
/* Rossz példa: CLS okozó animáció */
.bad-animation {
animation: slideIn 0.3s;
}
@keyframes slideIn {
from {
margin-top: -100px; /* Layout shift! */
}
to {
margin-top: 0;
}
}
/* Jó példa: transform használata */
.good-animation {
animation: slideInGood 0.3s;
}
@keyframes slideInGood {
from {
transform: translateY(-100px); /* Nincs layout shift */
}
to {
transform: translateY(0);
}
}// 6. Dinamikus tartalom betöltése helyőrzővel
// Rossz példa: tartalom hirtelen megjelenik
fetch('/api/content')
.then(res => res.json())
.then(data => {
document.getElementById('container').innerHTML = data.html;
});
// Jó példa: placeholder, smooth transition
const container = document.getElementById('container');
container.innerHTML = '<div class="skeleton-loader"></div>'; // Placeholder
fetch('/api/content')
.then(res => res.json())
.then(data => {
// Méret már ismert a placeholder miatt
container.style.minHeight = container.offsetHeight + 'px';
container.innerHTML = data.html;
});Core Web Vitals mérése és monitoring
1. Google PageSpeed Insights
A legegyszerűbb módszer a Core Web Vitals mérésére:
# Parancssori használat (ha API key-ed van)
curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://example.com&key=YOUR_API_KEY"Fontos megérteni:
- Lab Data: Szimulált, laboratóriumi körülmények (Lighthouse)
- Field Data: Valós felhasználói adatok (Chrome User Experience Report - CrUX)
A Field Data fontosabb, mert azt méri, amit a felhasználók ténylegesen tapasztalnak.
2. Chrome DevTools Performance Panel
// Performance mérés JavaScript-ben
performance.mark('start-task');
// ... valamilyen művelet ...
performance.mark('end-task');
performance.measure('task-duration', 'start-task', 'end-task');
const measures = performance.getEntriesByType('measure');
console.log(measures[0].duration); // milliszekundum3. Web Vitals JavaScript Library
<!-- NPM: npm install web-vitals -->
<script type="module">
import {onCLS, onFID, onLCP} from 'https://unpkg.com/web-vitals@3?module';
function sendToAnalytics({name, value, id}) {
// Küldés analytics rendszerbe
gtag('event', name, {
value: Math.round(name === 'CLS' ? value * 1000 : value),
metric_id: id,
metric_value: value,
metric_delta: value,
});
}
onCLS(sendToAnalytics);
onFID(sendToAnalytics);
onLCP(sendToAnalytics);
</script>4. PerformanceObserver API
// LCP mérése PerformanceObserver-rel
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
const lastEntry = entries[entries.length - 1];
console.log('LCP:', lastEntry.renderTime || lastEntry.loadTime);
console.log('LCP element:', lastEntry.element);
});
observer.observe({type: 'largest-contentful-paint', buffered: true});
// CLS mérése
let clsValue = 0;
const clsObserver = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (!entry.hadRecentInput) {
clsValue += entry.value;
}
}
console.log('Current CLS:', clsValue);
});
clsObserver.observe({type: 'layout-shift', buffered: true});5. Google Search Console
A Search Console “Core Web Vitals” jelentése mutatja a Field Data-t URL csoportok szerint:
- Jó URL-ek (zöld)
- Javítandó URL-ek (sárga)
- Rossz URL-ek (piros)
Hozzáférés: Search Console → Élmény → Core Web Vitals
Gyakori Core Web Vitals problémák és megoldások
LCP javítása
Probléma 1: Lassú szerver válaszidő (TTFB)
# Nginx cache konfiguráció
http {
# FastCGI cache PHP-hoz
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=PHPCACHE:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
server {
location ~ \.php$ {
fastcgi_cache PHPCACHE;
fastcgi_cache_valid 200 60m;
add_header X-Cache-Status $upstream_cache_status;
}
}
}Probléma 2: Render-blocking resources
<!-- Kritikus CSS inline -->
<style>
/* Above-the-fold critical CSS */
body { margin: 0; font-family: sans-serif; }
.header { display: flex; padding: 1rem; }
</style>
<!-- Nem-kritikus CSS async betöltése -->
<link rel="preload" href="/styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/styles.css"></noscript>Probléma 3: Optimalizálatlan képek
<!-- Modern image formátumok és responsive -->
<picture>
<source
srcset="/image-800.webp 800w, /image-1200.webp 1200w"
type="image/webp"
sizes="(max-width: 600px) 100vw, 800px"
>
<img
src="/image-800.jpg"
alt="Responsive kép"
width="800"
height="600"
loading="eager"
decoding="async"
>
</picture>FID/INP javítása
Probléma: Long JavaScript tasks
// Code splitting - csak a szükséges kód betöltése
// Webpack/Vite automatikus code splitting
const HeavyComponent = () => import('./HeavyComponent.js');
// Lazy loading komponensek (React példa)
const LazyComponent = React.lazy(() => import('./LazyComponent'));
function App() {
return (
<Suspense fallback={<div>Betöltés...</div>}>
<LazyComponent />
</Suspense>
);
}CLS javítása
Probléma: Banner/announcement bar dinamikus betöltése
/* Rossz: nincs hely foglalva */
.announcement {
background: #ff0;
padding: 1rem;
}
/* Jó: előre lefoglalt hely */
body {
padding-top: 50px; /* Announcement bar magassága */
}
.announcement {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 50px;
background: #ff0;
z-index: 1000;
}Core Web Vitals optimalizálási checklist
LCP Checklist
- Szerver válaszidő < 600ms (TTFB)
- CDN használata statikus tartalmakhoz
- Képek WebP/AVIF formátumban
- Kritikus erőforrások preload-ja
- Render-blocking JS/CSS eltávolítása vagy defer
- Lazy loading nem-kritikus tartalmakra
- Browser cache megfelelő beállítása
FID/INP Checklist
- JavaScript bundle < 100KB (gzipped)
- Third-party scriptek async/defer
- Code splitting használata
- Long tasks felosztása
- Passzív event listenerek használata
- Service Worker cache stratégia
CLS Checklist
- Képek width/height attribútuma
- Font-display: swap vagy optional
- Ad slots előre lefoglalt helye
- Skeleton loaderek dinamikus tartalomhoz
- Transform használata margin/top helyett
- Sticky elemek megfelelő pozicionálása
Összegzés
A Core Web Vitals nem csak ranking faktorok, hanem a felhasználói élmény alapvető mutatói. A három metrika (LCP, FID/INP, CLS) optimalizálása:
- Javítja a keresési helyezést - A Google figyelembe veszi őket
- Csökkenti a bounce rate-et - Gyorsabb oldal = elégedettebb felhasználók
- Növeli a konverziót - Jobb élmény = több vásárlás/regisztráció
- Növeli a mobil teljesítményt - Különösen kritikus mobilon
Kezdd a mérésekkel (PageSpeed Insights, Search Console), azonosítsd a problémákat, és kövesd a fenti optimalizálási technikákat. A legtöbb weboldal 75%-os javulást érhet el ezekkel a módszerekkel.
Következő lépések:
- Mérd meg a jelenlegi értékeket
- Azonosítsd a legnagyobb problémákat
- Implementáld a javításokat prioritás szerint (LCP → FID → CLS)
- Monitor-ozd az eredményeket
- Folyamatosan optimalizálj
A Core Web Vitals optimalizálás nem egyszeri feladat, hanem folyamatos munka. De az eredmények megérik: gyorsabb oldal, jobb felhasználói élmény, és magasabb keresési helyezések.
Kapcsolódó Videók
Google Hivatalos - Core Web Vitals Bemutatás
Forrás: Google Search Central | Hossz: ~5 perc | Nyelv: Angol (magyar felirat elérhető)
Web.dev - Core Web Vitals Deep Dive
Forrás: Google Chrome Developers | Nyelv: Angol
Gyakran Ismételt Kérdések – Core Web Vitals
Mi az a Core Web Vitals?
A Core Web Vitals a Google három legfontosabb felhasználói élmény metrikája: LCP (Largest Contentful Paint) a betöltési sebességet, FID (First Input Delay) az interaktivitást, és CLS (Cumulative Layout Shift) a vizuális stabilitást méri. Ezek a metrikák 2021 óta a Google ranking faktorai.
Milyen értékek számítanak jónak a Core Web Vitals-ban?
Jó értékek: LCP < 2.5 másodperc, FID < 100 milliszekundum, CLS < 0.1. A Google azt ajánlja, hogy az oldalak legalább 75%-a érje el ezeket az értékeket mobilon és desktopon is.
Hogyan mérhetem a Core Web Vitals értékeket?
Használd a Google PageSpeed Insights-ot, Chrome DevTools-t, Lighthouse-t vagy a Search Console Core Web Vitals jelentését. A valós felhasználói adatokhoz (Field Data) használd a Chrome User Experience Report-ot (CrUX).
Hogyan javíthatom az LCP értéket?
Optimalizáld a képeket (WebP formátum, lazy loading), használj CDN-t, csökkentsd a szerver válaszidőt, töltsd be előre a kritikus erőforrásokat (preload, preconnect), és távolítsd el a render-blocking JavaScript-et és CSS-t.
Mi okozza a magas CLS értéket?
Főbb okok: képek és videók méret nélkül, dinamikusan betöltött tartalom (hirdetések, beágyazások), webfontok villogása (FOIT/FOUT), és DOM módosítások animációk nélkül. Mindig add meg a width és height attribútumokat!
A Core Web Vitals mennyire fontos a SEO-ban?
A Core Web Vitals hivatalos ranking faktor, de a tartalom minősége továbbra is fontosabb. Két hasonló minőségű oldal esetén a jobb Core Web Vitals értékek előnyt jelenthetnek. A gyorsabb oldalak jobb felhasználói élményt adnak, ami csökkenti a bounce rate-et.