Core Web Vitals (CWV) to trzy metryki wydajności, które Google używa jako sygnał rankingowy: LCP (ładowanie), INP (interaktywność) i CLS (stabilność wizualna). Problem: większość właścicieli stron nie wie, jak czytać raporty CWV, myli dane laboratoryjne z polowymi i naprawia nie to, co trzeba. Poniżej opisujemy, jak interpretować te dane — żebyś naprawiał rzeczy, które realnie wpływają na pozycje i konwersję.
Pole vs lab — fundamentalna różnica
To jest źródło 90% nieporozumień. Dane CWV pochodzą z dwóch źródeł:
- Dane polowe (field / CrUX) — zebrane od prawdziwych użytkowników w Chrome przez ostatnie 28 dni. To jest prawda o Twojej stronie — jak ją widzą realni użytkownicy na realnych urządzeniach i połączeniach.
- Dane laboratoryjne (lab / Lighthouse) — symulacja na jednym urządzeniu, z jednym połączeniem, w kontrolowanych warunkach. To jest przybliżenie — przydatne do debugowania, ale NIE pokazuje, jak strona działa w realnym świecie.
Kluczowe: Google używa danych polowych (CrUX) jako sygnału rankingowego, NIE laboratoryjnych. Wynik 95 w Lighthouse z laptopa nie znaczy nic, jeśli dane polowe pokazują LCP 4 sekundy na mobile. I odwrotnie — wynik 60 w Lighthouse nie jest problemem, jeśli dane polowe są zielone.
LCP — Largest Contentful Paint
LCP mierzy, kiedy największy element wizualny na stronie (zwykle hero image lub nagłówek H1) jest w pełni załadowany i widoczny. Google chce: <2.5s (dobre), 2.5–4.0s (do poprawy), >4.0s (słabe).
Co najczęściej psuje LCP (z naszych projektów):
- Duże obrazy bez optymalizacji — hero image 2 MB zamiast 200 KB. Rozwiązanie: WebP/AVIF, responsive images (srcset), preload dla LCP image.
- Wolny serwer (TTFB) — jeśli serwer odpowiada po 1.5s, LCP nie może być poniżej 1.5s + czas renderowania. Rozwiązanie: Redis, CDN, lepszy hosting.
- Render-blocking CSS/JS — pliki CSS i JS, które muszą się załadować zanim cokolwiek się wyświetli. Rozwiązanie: critical CSS inline, defer/async dla JS.
- Web fonty — ładowanie fontów z Google Fonts blokuje renderowanie. Rozwiązanie: font-display: swap, self-hosting fontów.
INP — Interaction to Next Paint
INP (od marca 2024 zastąpił FID) mierzy responsywność strony na interakcje użytkownika: kliknięcia, tappy, wpisywanie tekstu. Google chce: <200ms (dobre), 200–500ms (do poprawy), >500ms (słabe).
INP jest najtrudniejszą metryką do optymalizacji, bo zależy od JavaScriptu wykonywanego w przeglądarce. Co najczęściej psuje INP:
- Ciężki JavaScript — Elementor, jQuery, Swiper, Lightbox, Share widgets. Każdy skrypt blokuje main thread. Rozwiązanie: usunięcie zbędnych skryptów, lazy loading, web workers.
- Hydration w React/Next.js — client-side hydration dużych komponentów blokuje interaktywność. Rozwiązanie: Server Components, streaming, partial hydration.
- Event handlery w pętli — addEventListener na setki elementów (np. każdy produkt w katalogu). Rozwiązanie: event delegation.
CLS — Cumulative Layout Shift
CLS mierzy, jak bardzo elementy strony „skaczą" podczas ładowania. Google chce: <0.1 (dobre), 0.1–0.25 (do poprawy), >0.25 (słabe).
Co najczęściej powoduje CLS:
- Obrazy bez wymiarów — brak width/height na <img> powoduje, że przeglądarka nie rezerwuje miejsca. Rozwiązanie: zawsze podawaj width i height (lub aspect-ratio w CSS).
- Reklamy i embedy — AdSense, iFrame YouTube, widgety social media ładują się z opóźnieniem i przesuwają treść. Rozwiązanie: rezerwacja miejsca za pomocą min-height.
- Web fonty bez font-display: swap — tekst renderowany jednym fontem zmienia rozmiar po załadowaniu innego. Rozwiązanie: font-display: swap + dopasowanie fallback fontu.
- Dynamicznie wstrzykiwane banery — consent banery (cookie), alerty, promocje. Rozwiązanie: zarezerwuj miejsce lub użyj overlay zamiast push-down.


