Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

Core Web Vitals — optymalizacja LCP, CLS i INP dla hostingu

Opublikowano: 10 kwietnia 2026 · Kategoria: Hosting / Wydajność

Core Web Vitals to trzy metryki Google mierzące doświadczenie użytkownika: LCP (szybkość ładowania), CLS (stabilność układu) i INP (responsywność). Od 2021 roku są czynnikiem rankingowym — strona z dobrymi vitals może wyprzedzić konkurenta z lepszymi linkami, jeśli jest szybsza i stabilniejsza.

Progi Core Web Vitals — co jest "good"?

Metryka Good (zielony) Needs Improvement Poor (czerwony)
LCP (Largest Contentful Paint) < 2.5s 2.5s – 4.0s > 4.0s
CLS (Cumulative Layout Shift) < 0.1 0.1 – 0.25 > 0.25
INP (Interaction to Next Paint) < 200ms 200ms – 500ms > 500ms

LCP — Largest Contentful Paint

LCP mierzy czas do wyświetlenia największego elementu widocznego w viewporcie (najczęściej hero image, nagłówek H1 lub baner). Cel: poniżej 2.5s.

1. Optymalizacja TTFB — pierwszy krok

LCP = TTFB + czas renderowania. Jeśli TTFB jest 1.5s, LCP poniżej 2.5s jest prawie niemożliwe. Dobre TTFB to mniej niż 200ms (Google) lub 600ms (akceptowalne).

# Pomiar TTFB przez curl
curl -o /dev/null -s -w "TTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://example.com

# Narzędzia online:
# - https://www.webpagetest.org/ (zakładka "Web Vitals")
# - https://pagespeed.web.dev/ (Google PageSpeed Insights)
# - Google Search Console → Core Web Vitals (dane rzeczywiste)

Jak obniżyć TTFB:

  • Cache strony — WP Rocket, LiteSpeed Cache, Nginx FastCGI Cache. Cached TTFB to 20-50ms zamiast 300-800ms.
  • OPcache PHP — kompilacja PHP do bytecode. Bez OPcache każde żądanie parsuje PHP od nowa.
  • Redis/Memcached — cache bazy danych. Wolne zapytania SQL = wysoki TTFB.
  • CDN z edge caching — Cloudflare, BunnyCDN serwują HTML z serwera brzegowego, 20-50ms TTFB globalnie.
  • Lepszy hosting — NVMe zamiast HDD, LiteSpeed zamiast Apache, VPS zamiast shared z przeładowanym serwerem.

2. Preload LCP image

<!-- W <head> — przeglądarka pobiera obraz ZANIM przetworzy CSS -->
<link rel="preload" as="image" href="/images/hero.webp" fetchpriority="high">

<!-- Dla responsive images -->
<link rel="preload" as="image"
  href="/images/hero-800.webp"
  imagesrcset="/images/hero-400.webp 400w, /images/hero-800.webp 800w"
  imagesizes="(max-width: 600px) 400px, 800px"
  fetchpriority="high">

<!-- NIE dodawaj loading="lazy" do LCP image! -->
<img src="/images/hero.webp" alt="Hero" fetchpriority="high">

3. Optymalizacja obrazów

  • Format WebP/AVIF — 25-50% mniejszy niż JPEG przy tej samej jakości
  • Właściwy rozmiar — obraz 1920px na mobile to przepalona przepustowość. Użyj srcset.
  • Kompresja — Squoosh, ImageMagick z quality=80
  • Unikaj CSS background-image dla LCP — przeglądarka nie może preload-ować. Użyj <img>.

CLS — Cumulative Layout Shift

CLS mierzy nieoczekiwane przesunięcia elementów podczas ładowania. Wartość 0.1 to próg "good" — powyżej użytkownicy przypadkowo klikają nie te przyciski.

Główne przyczyny CLS i jak je naprawić

<!-- Problem: obraz bez wymiarów przesuwa treść podczas ładowania -->
<img src="photo.jpg" alt="Zdjęcie">  <!-- ZLE -->

<!-- Rozwiązanie: zawsze podawaj width i height -->
<img src="photo.jpg" alt="Zdjęcie" width="800" height="600">  <!-- DOBRZE -->

<!-- CSS: rezerwuj miejsce dla aspect ratio -->
<style>
img { aspect-ratio: attr(width) / attr(height); height: auto; width: 100%; }
</style>
/* Fonty: font-display: swap może powodować CLS jeśli fallback font jest inny */
/* Lepiej: font-display: optional (nie podmienia fontów) lub size-adjust */

@font-face {
    font-family: 'MyFont';
    src: url('/fonts/myfont.woff2') format('woff2');
    font-display: swap;  /* dobry dla LCP, może powodować CLS */
}

/* Bezpieczniej: preload fontu + font-display: block z krótkim timeout */
/* Lub użyj font-display: optional — brak FOUT, brak CLS */
  • Reklamy i embeds — zarezerwuj miejsce przez min-height przed załadowaniem
  • Bannery cookie — nie wstawiaj na górze strony, używaj fixed/sticky pozycji
  • Animacje CSS — używaj tylko transform i opacity — nie powodują layout shift
  • Dynamiczne treści — skeleton screens zamiast pojawienia się elementu z niczego

INP — Interaction to Next Paint

INP mierzy czas od interakcji użytkownika (klik, tapnięcie) do następnego renderowania. Główne przyczyny złego INP:

  • Long Tasks JS — zadania JS trwające ponad 50ms blokują główny wątek. Narzędzie: Chrome DevTools → Performance → "Long Tasks" (czerwone bloki)
  • Zbyt dużo JS — bundle 1MB+ = długi parsing. Code splitting, lazy loading komponentów, tree shaking
  • Ciężkie event handlers — np. klik triggeruje synchroniczne obliczenia. Przenieś do Web Worker lub użyj requestAnimationFrame
  • WordPress plugins — Contact Form 7, WooCommerce, slidersy — każdy dodaje JS. Audyt przez Query Monitor lub WP Hive
// Pomiar INP w JavaScript (PerformanceObserver)
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.interactionId) {
      console.log('INP candidate:', entry.duration, 'ms', entry.name);
    }
  }
});
observer.observe({ type: 'event', buffered: true, durationThreshold: 16 });

Narzędzia pomiarowe

  • PageSpeed Insightspagespeed.web.dev — dane lab (Lighthouse) + dane field (CrUX). Najważniejsze do sprawdzenia.
  • Lighthouse CLInpx lighthouse https://example.com --output=html — lokalne testy, działa bez Chrome DevTools. Dobry do CI/CD.
  • WebPageTestwebpagetest.org — waterfall chart, CWV po lokalizacji, film z ładowania strony.
  • Google Search Console — Core Web Vitals report z danymi CrUX — rzeczywiste doświadczenie użytkowników.
  • Chrome DevTools — F12 → Performance → nagraj ładowanie. Widoczne Long Tasks, Layout Shifts i Main Thread Activity.

Najczęstsze pytania

Jakie są docelowe wartości Core Web Vitals? +
Google definiuje: LCP (Largest Contentful Paint) powinno być poniżej 2.5 sekundy. CLS (Cumulative Layout Shift) powinno być poniżej 0.1. INP (Interaction to Next Paint) powinno być poniżej 200ms. Wartości od 2.5 do 4s LCP, 0.1-0.25 CLS, 200-500ms INP to "needs improvement". Powyżej tych progów to "poor". Ocena opiera się na 75. percentylu użytkowników z ostatnich 28 dni (dane CrUX).
Jak hosting wpływa na Core Web Vitals? +
Hosting bezpośrednio wpływa na LCP przez TTFB (Time to First Byte). Słaby serwer z TTFB powyżej 600ms praktycznie uniemożliwia osiągnięcie LCP poniżej 2.5s. Hosting wpływa na: szybkość PHP/bazy danych (czas generowania strony), limity pamięci (OOM = wolna strona), jakość dysku (NVMe vs HDD), CDN (jak blisko użytkownika jest serwer). CLS i INP zależą głównie od frontendu, ale hosting może blokować zasoby (fonty, CSS) powodując layout shift.
Czym różni się INP od FID (First Input Delay)? +
FID mierzył tylko opóźnienie pierwszej interakcji (czas do startu obsługi eventu). INP (Interaction to Next Paint) mierzy czas od każdej interakcji (klik, tapnięcie, naciśnięcie klawisza) do kolejnego renderowania — czyli pełny czas odpowiedzi. INP jest surowszą metryką: strona może mieć dobry FID ale zły INP jeśli kliknięcie triggeruje długie obliczenia JS. Od marca 2024 INP zastąpił FID w Core Web Vitals.
Jak mierzyć Core Web Vitals dla realnych użytkowników? +
Dane lab (Lighthouse, PageSpeed Insights) symulują warunki w kontrolowanym środowisku i nie odzwierciedlają rzeczywistości. Dane field (CrUX - Chrome User Experience Report) to prawdziwe pomiary z przeglądarek Chrome. CrUX dostępny przez: PageSpeed Insights (zakładka "Dane terenowe"), Google Search Console (Core Web Vitals report), BigQuery (raw data). Minimalne 1000 wizyt z Chrome w 28 dniach — mała strona może nie mieć danych CrUX.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.