Trzy fazy każdej interakcji
- Opóźnienie wejścia: czekanie, aż główny wątek będzie wolny, by uruchomić handler.
- Czas przetwarzania: wykonanie kodu obsługującego zdarzenie.
- Opóźnienie prezentacji: przeliczenie layoutu i odmalowanie kolejnej klatki.
Jak poprawić INP
Kluczem jest odciążenie głównego wątku: dzielenie długich zadań (yielding), redukcja i odroczenie JavaScriptu, unikanie nadmiarowych re-renderów oraz ograniczenie kosztownych operacji na DOM w handlerach zdarzeń.
Przykład
Przykład edukacyjny: pokaż stan pracy i oddaj sterowanie przed kolejnymi porcjami. scheduler.yield() lub fallback setTimeout tworzy możliwość obsługi innych zadań; samo await requestAnimationFrame nie gwarantuje odmalowania. Dobierz porcje z profilu, obsłuż błędy i ponowne kliknięcia. Szybka informacja wizualna nie oznacza końca całej operacji asynchronicznej.
button.addEventListener('click', () => {
for (let i = 0; i < items.length; i++) {
processItem(items[i]); // blokuje główny wątek
}
updateUI();
});const yieldTask = () => globalThis.scheduler?.yield
? globalThis.scheduler.yield()
: new Promise(resolve => setTimeout(resolve, 0));
button.addEventListener('click', async () => {
button.disabled = true;
status.textContent = 'Przetwarzanie…';
try {
await yieldTask();
for (let i = 0; i < items.length; i += 100) {
for (const item of items.slice(i, i + 100)) processItem(item);
await yieldTask();
}
updateUI();
status.textContent = 'Gotowe';
} catch {
status.textContent = 'Nie udało się ukończyć operacji';
} finally {
button.disabled = false;
}
});200 milisekund lub mniej to wynik dobry, 200–500 ms wymaga poprawy, powyżej 500 ms jest słaby. Podobnie jak przy pozostałych Core Web Vitals próg dotyczy 75. percentyla.
FID mierzył opóźnienie wejścia pierwszej interakcji. INP obejmuje opóźnienie wejścia, obsługę zdarzeń i czas do kolejnego odmalowania dla kliknięć, tapnięć i klawiatury w trakcie wizyty. Nie mierzy czasu do zakończenia całej operacji sieciowej.
Obejmuje kliknięcia, tapnięcia i interakcje klawiaturą, nie hover ani przewijanie. Raportuje wynik zbliżony do najwolniejszej interakcji, pomijając część skrajnych wartości przy wielu interakcjach. Brak kwalifikującej się interakcji oznacza brak INP.
Długie zadania blokujące główny wątek: ciężkie handlery zdarzeń, przeliczanie układu wywołane odczytem i zapisem stylów w pętli oraz duże paczki JavaScriptu wykonywane w odpowiedzi na kliknięcie. Pomaga dzielenie pracy na mniejsze zadania i oddawanie kontroli głównemu wątkowi.
Źródła i dalsza lektura
- web.dev: Interaction to Next Paint (INP) dokumentacja
- web.dev: INP zastępuje FID w Core Web Vitals blog
- web.dev: Optymalizacja INP dokumentacja
- web.dev: Optimize long tasks dokumentacja