Co dokładnie mierzy FCP
Pomiar zaczyna się w chwili nawigacji, a nie w chwili, gdy serwer odpowie. Dlatego w danych terenowych FCP obejmuje też czas zamykania poprzedniej strony, zestawienie połączenia, przekierowania i Time to First Byte (TTFB). Wolny serwer albo łańcuch przekierowań podnosi FCP, zanim przeglądarka dostanie choćby bajt HTML.
Lighthouse nie wlicza do FCP treści wewnątrz ramek iframe. Interfejs Paint Timing może też nie raportować renderowania z ramek innego pochodzenia (cross-origin), więc pomiar w JavaScripcie bywa tu niepełny.
Progi FCP
Próg web.dev dotyczy danych terenowych: 75. percentyl wizyt, osobno dla urządzeń mobilnych i komputerów. Progi Lighthouse dotyczą pojedynczego testu laboratoryjnego na danym profilu urządzenia.
W Lighthouse 10 FCP ma 10% wagi w wyniku Performance, tyle samo co Speed Index. Więcej ważą TBT (30%) oraz LCP i CLS (po 25%).
| Źródło | Dobry | Do poprawy | Słaby |
|---|---|---|---|
| web.dev (75. percentyl wizyt) | do 1,8 s | 1,8–3,0 s | powyżej 3,0 s |
| Lighthouse, mobile | 0–1,8 s | 1,8–3 s | powyżej 3 s |
| Lighthouse, desktop | 0–0,9 s | 0,9–1,6 s | powyżej 1,6 s |
FCP, LCP i TTFB: czym się różnią
Jeśli strona pokazuje ekran powitalny albo wskaźnik ładowania, FCP może być szybki, choć użytkownik nadal nie widzi niczego przydatnego. Dlatego FCP diagnozuje początek ładowania, a oceny postrzeganej szybkości dokonuje się na podstawie LCP.
- TTFB mierzy, kiedy przychodzi pierwszy bajt odpowiedzi. Poprzedza FCP i LCP, dlatego web.dev zaleca taki czas odpowiedzi serwera, żeby 75. percentyl użytkowników miał dobry FCP.
- FCP mierzy, kiedy pojawia się jakakolwiek treść. Może to być logo, nagłówek albo wskaźnik ładowania.
- LCP mierzy, kiedy pojawia się największy element treści w widocznym obszarze. To on odpowiada na pytanie, czy główna treść już jest.
Jak skrócić FCP
- Usuń zasoby blokujące renderowanie. CSS i synchroniczne skrypty w <head> wstrzymują pierwsze malowanie, dopóki się nie pobiorą.
- Skróć TTFB i unikaj wielokrotnych przekierowań. Każdy dodatkowy skok sieciowy przesuwa FCP.
- Usuń nieużywany CSS i JavaScript oraz minifikuj to, co zostaje.
- Nawiąż wcześniej połączenia z potrzebnymi domenami (preconnect) i wczytuj z wyprzedzeniem kluczowe zasoby (preload).
- Nie ukrywaj tekstu na czas ładowania fontu. font-display: swap pokazuje od razu font systemowy, co przyspiesza FCP i LCP, ale podmiana fontu może wywołać przesunięcie układu (CLS).
- Ogranicz liczbę i rozmiar żądań, głębokość łańcucha krytycznych żądań i rozmiar DOM.
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<style>
@font-face {
font-family: "Brand";
src: url("/fonts/brand.woff2") format("woff2");
font-display: swap;
}
</style>Jak mierzyć FCP
W laboratorium FCP pokazują Lighthouse, panel Performance w Chrome DevTools i PageSpeed Insights. Dane terenowe pochodzą z Chrome UX Report (CrUX), które pokazuje też PageSpeed Insights, albo z własnego RUM.
Do pomiaru u użytkowników najprościej użyć biblioteki web-vitals. Nie zmierzy ona jednak renderowania w ramkach innego pochodzenia.
import { onFCP } from 'web-vitals';
// Wypisuje FCP, gdy tylko jest dostępny
onFCP(console.log);First Contentful Paint (FCP) to czas od rozpoczęcia nawigacji do chwili, gdy przeglądarka wyrenderuje pierwszą treść strony: tekst, obraz, element SVG albo niebiały canvas. Pokazuje, jak szybko użytkownik widzi, że strona zaczęła się ładować.
Według web.dev dobry FCP to 1,8 s lub mniej, a słaby to ponad 3,0 s, liczone dla 75. percentyla wizyt. Lighthouse na desktopie stosuje ostrzejsze progi: do 0,9 s to wynik dobry, powyżej 1,6 s słaby.
Nie. Core Web Vitals to LCP, INP i CLS. FCP jest metryką pomocniczą, która pomaga diagnozować problemy z ładowaniem wpływające na LCP. W Lighthouse 10 ma 10% wagi w wyniku Performance.
FCP mierzy moment pojawienia się jakiejkolwiek treści, np. logo albo wskaźnika ładowania. LCP mierzy moment wyrenderowania największego elementu treści w widocznym obszarze, zwykle obrazu hero albo głównego nagłówka.
Najczęściej przyczyną są zasoby blokujące renderowanie: arkusze CSS i synchroniczne skrypty w <head> albo font, który ukrywa tekst do czasu pobrania. W danych terenowych FCP obejmuje też przekierowania i zestawienie połączenia, więc sprawdź cały łańcuch żądań.
Test laboratoryjny uruchomisz w Lighthouse, Chrome DevTools albo PageSpeed Insights. Dane od realnych użytkowników znajdziesz w CrUX, np. w PageSpeed Insights, albo zbierzesz je sam biblioteką web-vitals i funkcją onFCP.
Źródła i dalsza lektura
- web.dev: First Contentful Paint (FCP) dokumentacja
- Chrome for Developers: Lighthouse: First Contentful Paint dokumentacja
- Chrome for Developers: Lighthouse performance scoring dokumentacja
- web.dev: Web Vitals dokumentacja
- web.dev: Largest Contentful Paint (LCP) dokumentacja
- web.dev: Time to First Byte (TTFB) dokumentacja
- Chrome for Developers: Ensure text remains visible during webfont load dokumentacja