
Dall'interazione al paint
INP segue il percorso completo di un'interazione: input, lavoro del browser, aggiornamento del layout e nuovo paint. Ottimizzare la reattività significa ridurre ogni attesa prima del feedback visibile.
INP è il nuovo Core Web Vital che sostituisce FID e misura la reattività di tutte le interazioni dell'utente. Scopri cos'è, come misurarlo, le cause comuni di degradazione e le strategie pratiche per ottimizzarlo.

INP segue il percorso completo di un'interazione: input, lavoro del browser, aggiornamento del layout e nuovo paint. Ottimizzare la reattività significa ridurre ogni attesa prima del feedback visibile.
Fino a marzo 2024, Google misurare la reattività con FID (First Input Delay): il tempo tra quando l'utente interagisce (click, tap, pressione tastiera) e quando il browser inizia a processare quel comando.
FID aveva un limite: misurava solo il primo input. Se il tuo sito era lento per tutti gli input eccetto il primo, non lo sapevi. Per questo motivo, INP (Interaction to Next Paint) lo ha sostituito come Core Web Vital.
Definizione: INP misura il tempo totale dall'input dell'utente fino al paint successivo visibile sullo schermo.
INP considera tutte le interazioni durante la sessione (non solo la prima) e premia i siti che rispodono velocemente, coerentemente. Una soglia di INP "buono" è generalmente considerata sotto 200 milliseconds. Se il tuo INP supera i 500ms, è tempo di agire.
Perché Google ha deciso questo cambio? Perché misura meglio la user experience reale. Gli utenti non si fermano dopo il primo click: continuano a interagire con il sito (scroll, filtri, form). Se il sito rallenta dopo il primo input, gli utenti se ne accorgono e si frustrano.
INP non è solo il tempo di elaborazione (come FID). È la misura completa di cosa succede quando un utente interagisce.
INP misura dall'input all'ultimo paint visibile (next paint). Se il sito impiega 500ms per rispondere a un click, l'utente si accorge di un ritardo di mezzo secondo. Non è accettabile.
La differenza chiave: FID misurava solo il delay prima che il browser iniziasse a processare (input event → inizio processing). INP misura l'intera durata (input event → presentation delay → paint). È una misura più realistica della user experience.
Google non divide l'INP in componenti singoli. Misura il totale. Quindi la tua priorità è: quale componente è il bottleneck?
Troppo codice JavaScript che gira al click. Se il tuo framework carica 500KB di JS e l'utente clicca, il main thread si blocca per processare quel codice.
Soluzione: Code splitting, lazy loading, tree-shaking per rimuovere JS inutilizzato.
Il thread principale del browser è occupato (parsing, execution, layout). Quando l'utente clicca, il browser attende che il main thread sia libero prima di processare l'input. Questo crea un delay enorme.
Soluzione: Ridurre il carico del main thread, usare Web Workers per calcoli pesanti, rinviare le task non critiche.
Una singola task JavaScript che impiega più di 50ms blocca il main thread. Se ce ne sono più di una al click, il delay si accumula.
Soluzione: Frammentare le long task in piccoli chunk, usare setTimeout() o requestIdleCallback().
Se il tuo sito ha centinaia di event listener e ognuno fa un lavoro pesante, il click attiva più listener e ciascuno compete per il main thread.
Soluzione: Usare event delegation, debouncing, throttling.
Layout trashing: il tuo codice legge le proprietà del DOM (width, height) che causa un reflow, poi modifica il DOM, che causa un altro reflow. Migliaia di reflow = paint lento.
Soluzione: Batch le operazioni DOM, usa requestAnimationFrame(), evita di mescolare letture e scritture del DOM.
Se il click attiva una fetch al server e il server non risponde velocemente, INP ne soffre. Però il server non è il bottleneck principale per INP (è più per la performance percepita).
Soluzione: Ottimizza il backend, usa caching, fetch anticipato.
Accedi a pagespeed.web.dev, inserisci l'URL del tuo sito, e Google mostra l'INP della pagina di desktop e mobile.
Vantaggi: Ufficiale, gratuito, mostra anche suggerimenti di ottimizzazione, accesso ai dati del Chrome UX Report.
Limitazioni: Misura su un device generico; non riflette i tuoi utenti reali. PageSpeed Insights è un snapshot, non una metrica continuativa.
Google raccoglie i dati di performance reali dai browser Chrome degli utenti. Puoi accedervi tramite CrUX Dashboard o via BigQuery.
Vantaggi: Dati reali dai tuoi utenti, storico mensile, segmentato per device type e connection type.
Limitazioni: I dati sono pubblici (se il tuo sito ha sufficiente traffico), ci vuole circa un mese per apparire nel CrUX.
Integra la libreria web-vitals nel tuo sito (NPM: web-vitals). Misura INP lato client e invia i dati a Google Analytics o alla tua piattaforma di monitoring.
Codice di esempio:
import {onINP} from 'web-vitals';
onINP(metric => {
console.log('INP:', metric.value, 'ms');
// Invia a Google Analytics o al tuo monitoring
});Vantaggi: Misura reale dal tuo sito, integrazione con GA4 disponibile.
Apri Chrome DevTools (F12), vai al tab "Performance". Clicca su un elemento, esegui un'azione, e Chrome registra la timeline di processing, rendering, e paint.
Vantaggi: Visione dettagliata di ogni singola operazione, debug preciso.
Limitazioni: È un tool di debug, non per monitoring continuativo.
Meno codice JavaScript = meno processamento al click. Azioni concrete:
Se hai calcoli pesanti (data processing, algoritmi), sposta il lavoro in un Web Worker. Il main thread rimane libero per processare l'input.
Se hai una task che impiega 200ms, dividila in chunk più piccoli (< 50ms):
// BAD: long task
for (let i = 0; i < 1000000; i++) {
expensiveCalculation();
}
// GOOD: chunked
function processInChunks(data, chunkSize = 1000) {
let i = 0;
function processChunk() {
for (let j = 0; j < chunkSize && i < data.length; j++, i++) {
expensiveCalculation(data[i]);
}
if (i < data.length) {
setTimeout(processChunk, 0); // Cede il main thread
}
}
processChunk();
}Non aggiungere un listener a cento elementi. Usa event delegation (un listener sul parent) e debounce gli event ricorrenti (scroll, resize, input):
// Debounce esempio
function debounce(func, delay) {
let timeout;
return function (...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func(...args), delay);
};
}
element.addEventListener('input', debounce(() => {
performSearch();
}, 300));Evita di alternare letture e scritture del DOM (layout thrashing):
// BAD: layout thrashing
for (const el of elements) {
el.style.width = el.offsetWidth + 10 + 'px'; // Legge offset, causa reflow
}
// GOOD: batch
const widths = [];
for (const el of elements) {
widths.push(el.offsetWidth); // Tutte le letture
}
for (let i = 0; i < elements.length; i++) {
elements[i].style.width = (widths[i] + 10) + 'px'; // Tutte le scritture
}Se sai che un click caricherà una risorsa (immagine, stylesheet, script), preload anticipatamente:
<link rel="preload" href="/important-script.js" as="script">
<link rel="prefetch" href="/next-page.html">Non basta misurare una volta. Integra il monitoraggio INP in GA4 o in un servizio di monitoring. Crea un alert se INP degrada.
Ecco una checklist pratica e ordinata per migliorare l'INP:
INP sostituisce FID perché misura ciò che conta davvero: la reattività percepita dall'utente durante l'intera sessione. Un sito che risponde velocemente al primo click ma si blocca al secondo è un sito lento. INP te lo dice subito.
Approfondisci la SEO tecnica e la performance:
INP è un fattore di ranking. Ti aiutiamo a misurarlo, identificare i bottleneck e implementare le strategie di ottimizzazione giuste per il tuo progetto.