Total Blocking Time (TBT) e SEO

Cosa misura il TBT, la matematica dei long task da 50 ms, perché è il proxy di laboratorio per INP (non una Core Web Vital) e come correggere un punteggio rosso — da un punto di vista tecnico SEO.

Prima pubblicazione: 26 giu 2026 · Ultimo aggiornamento: 22 ago 2026 · Advanced
Lingue

Il Total Blocking Time (TBT) è la somma della parte bloccante — il tempo oltre i 50 ms — di ogni long task tra First Contentful Paint e Time to Interactive. È una metrica solo di laboratorio, il peso maggiore (30%) nel punteggio Performance di Lighthouse, e il proxy di laboratorio per la Core Web Vital INP (in precedenza era il proxy per FID). NON è una Core Web Vital e non appare mai in Search Console o CrUX. Soglie mobile di Lighthouse: buono ≤200 ms, scarso >600 ms. Lo si corregge allo stesso modo di INP — spezzare i long task JS, code-splitting, rimandare o rimuovere JS inutilizzato, e ridurre il costo degli script di terze parti. La mia opinione onesta: fallo per gli utenti e le conversioni, non per un aumento del ranking.

TL;DR — Il TBT è la quantità totale di tempo, tra First Contentful Paint e Time to Interactive, in cui il thread principale è stato bloccato abbastanza a lungo da impedire la reattività all’input. Somma la parte di blocco (durata − 50 ms) di ogni long task (qualsiasi attività del thread principale oltre 50 ms). È una metrica di laboratorio — il peso singolo più grande (30%) nel punteggio Lighthouse 10 e il proxy di laboratorio per INP — ma non è una Core Web Vital e non appare mai in CrUX o Search Console. Soglie mobile: buono ≤200 ms, scarso >600 ms. Risolvilo come risolveresti l’INP: spezza le attività JS lunghe, fai code-splitting, rimanda/rimuovi JS inutilizzato, doma gli script di terze parti. La mia opinione onesta: risolvilo per gli utenti, non per un aumento di ranking.

Evidence for this claim Lighthouse classifies mobile TBT at 200 milliseconds or less as good and above 600 milliseconds as poor. Scope: Lighthouse mobile TBT scoring guidance; desktop scoring differs. Confidence: high · Verified: Chrome Developers: Total Blocking Time

Cosa misura realmente il TBT

La definizione di Google è il punto di partenza. Il TBT è “la quantità totale di tempo dopo First Contentful Paint (FCP) in cui il thread principale è stato bloccato abbastanza a lungo da impedire la reattività all’input.” Il thread principale del browser elabora un’attività alla volta; mentre è occupato con un lungo blocco di lavoro, non può reagire a un clic, a un tocco, o a una pressione di un tasto. Il TBT quantifica quanto della finestra di caricamento della tua pagina viene speso in quello stato bloccato.

Due definizioni fanno tutto il lavoro qui:

  • Una long task è “un’attività che gira sul thread principale per più di 50 millisecondi.”
  • La parte di blocco di un’attività è la sua durata meno 50 ms. Le attività a o sotto i 50 ms contribuiscono esattamente 0 ms.

Il TBT è la somma di quelle porzioni di blocco tra FCP e Time to Interactive (TTI). Quindi First Contentful Paint è la linea di partenza: nulla prima della prima pittura conta, perché non c’è ancora nulla sullo schermo con cui interagire.

Evidence for this claim TBT sums the portion above 50 milliseconds of long main-thread tasks between FCP and Time to Interactive. Scope: Lighthouse lab metric definition; not a field Core Web Vital. Confidence: high · Verified: Chrome Developers: Total Blocking Time

L’esempio pratico

La tabella di Google è l’illustrazione più chiara. Immagina cinque attività eseguite sul thread principale tra FCP e TTI:

Durata dell’attivitàTempo di blocco (durata − 50 ms)
Attività uno: 250 ms200 ms
Attività due: 90 ms40 ms
Attività tre: 35 ms0 ms
Attività quattro: 30 ms0 ms
Attività cinque: 155 ms105 ms
Tempo di blocco totale345 ms

Le attività tre e quattro sono sotto la soglia dei 50 ms, quindi non contribuiscono nulla. L’attività uno blocca per 250 − 50 = 200 ms, l’attività cinque per 155 − 50 = 105 ms. Somma le porzioni di blocco — 200 + 40 + 0 + 0 + 105 — e ottieni 345 ms di TBT. Questo è un punteggio “da migliorare”, guidato quasi interamente da due attività pesanti.

Questa è la parte controintuitiva che vale la pena interiorizzare: “Un piccolo numero di attività sul thread principale non significa necessariamente un basso tempo di blocco. Al contrario, un grande numero di attività non porta necessariamente a un sacco di tempo di blocco.” (Quella formulazione è di NitroPack, riportata qui — riverificata sulla fonte live il 2026-07-18.) Ciò che conta è se le attività individuali superano i 50 ms, non quante attività ci sono.

La finestra di misurazione: da FCP a TTI

La finestra termina al Time to Interactive“il tempo dall’inizio del caricamento della pagina a quando le sue principali sotto-risorse sono state caricate ed è in grado di rispondere in modo affidabile all’input dell’utente rapidamente.” In Lighthouse, il TTI si trova cercando in avanti una “finestra di quiete” di cinque secondi senza attività lunghe e con non più di due richieste di rete in volo.

Vale la pena notare: il TTI stesso è stato rimosso da Lighthouse 10 perché si è rivelato eccessivamente sensibile a richieste di rete anomale e attività lunghe, producendo un’alta variabilità. Il TBT è sopravvissuto ed è diventato la metrica di interattività primaria. Come ha detto Philip Walton, “Nuove metriche alternative come Largest Contentful Paint (LCP), Total Blocking Time (TBT) e Interaction to Next Paint (INP) sono solitamente metriche migliori da usare al posto del TTI.” Il TBT non ha sostituito il TTI come endpoint della finestra — è un numero singolo migliore per lo stesso problema di fondo. E la scomparsa del TTI dall’interfaccia del report di Lighthouse non è la stessa affermazione del TTI che non delimita più la finestra di navigazione predefinita di Lighthouse — la finestra stessa è ancora misurata in quel modo sotto il cofano.

Evidence for this claim TTI being removed as a displayed Lighthouse metric does not by itself mean TTI stopped bounding the default Lighthouse navigation TBT window. Scope: lab recommended Confidence: high · Verified: Total Blocking Time (TBT)

Un’altra nota di delimitazione: “FCP to TTI” descrive specificamente l’audit di navigazione predefinito di Lighthouse. Altri strumenti, o Lighthouse stesso che esegue una traccia di intervallo di tempo invece di una navigazione completa di caricamento pagina, possono totalizzare una finestra misurata diversa — la matematica delle attività lunghe di 50 ms non cambia, ma i punti di inizio e fine di ciò che viene sommato sono specifici dello strumento e della modalità di traccia, non una legge universale della metrica.

Evidence for this claim TBT begins after FCP, but the endpoint is tool and trace-mode specific: page-load tools commonly use TTI, Lighthouse navigation audits default to stopping at TTI, and other tools or timespan traces may total a different measured window. Scope: navigation audits Confidence: high · Verified: Total Blocking Time

Il TBT è un Core Web Vital? No.

È l’equivoco più comune: le tre Core Web Vitals sono LCP, INP e CLS; TBT non è tra queste. Google scrive: “Total Blocking Time (TBT) is a lab metrics is vital in catching and diagnosing potential interactivity issues that can impact INP. However, it is not part of the Core Web Vitals set because they are not field-measurable, nor do they reflect a user-centric outcome.” (traduzione) «Total Blocking Time è una metrica di laboratorio utile per individuare e diagnosticare potenziali problemi di interattività che possono influire su INP; non fa però parte delle Core Web Vitals perché non è misurata sul campo né riflette un risultato incentrato sull’utente». La grammatica della frase originale è di Google.

Quindi dove appare il TBT e dove non appare?

  • Dove lo vedi: Lighthouse, PageSpeed Insights’ lab tab, e Chrome DevTools — tutti ambienti simulati/lab.
  • Dove non lo vedi: il report Core Web Vitals di Google Search Console, CrUX, o qualsiasi dato di campo. Quelli includono solo LCP, INP e CLS.

Se qualcuno ti dice che sta “guardando TBT in Search Console”, si sbaglia — GSC riporta dati di campo, e TBT non è una metrica di campo.

Una correzione su cui vale la pena essere precisi: TBT raccomandato in lab non è la stessa cosa di TBT impossibile in campo. Puoi tecnicamente calcolare un totale in stile TBT in campo con la Long Tasks API — Google lo dice direttamente: “It is possible to measure TBT in the field, but we don’t recommend this as user interaction can affect your page’s TBT in ways that lead to lots of variance in your reports.” (traduzione) «È possibile misurare TBT in campo, ma non lo consigliamo perché l’interazione dell’utente può influenzare il TBT della tua pagina in modi che portano a molta varianza nei tuoi report.» Questa è una raccomandazione contro, non un muro tecnico. Ciò che è realmente vero senza eccezioni è più ristretto: CrUX e il report Core Web Vitals di Search Console non includono mai TBT, punto e basta — quelle pipeline raccolgono solo LCP, INP e CLS.

TBT è il proxy di laboratorio per INP

Ecco perché TBT esiste. Gli strumenti di laboratorio caricano una pagina in un ambiente simulato senza utente reale, quindi non possono misurare Interaction to Next Paint — INP richiede clic e tocchi reali. TBT colma questa lacuna: “the Total Blocking Time (TBT) metric is lab-measurable and is a proxy for INP.” (traduzione) «La metrica Total Blocking Time (TBT) è misurabile in laboratorio ed è un proxy per INP.»

I due sono meccanicamente correlati: “Although INP and TBT are calculated differently, they are both reflections of a blocked main thread during the bootstrap process. When the main thread is blocked, the browser is delayed in responding to user interactions.” (traduzione) «Sebbene INP e TBT siano calcolati in modo diverso, sono entrambi riflessi di un thread principale bloccato durante il processo di bootstrap. Quando il thread principale è bloccato, il browser ritarda la risposta alle interazioni dell’utente.» E empiricamente, “A low TBT often correlates with a low Interaction to Next Paint (INP).” (traduzione) «Un TBT basso spesso è correlato a un basso Interaction to Next Paint (INP).»

Ma “proxy” non è “sostituto”. Google è esplicito: “Total Blocking Time (TBT) may be a reasonable proxy metric for INP, but it’s not a substitute for INP in and of itself.” (traduzione) «Total Blocking Time (TBT) può essere una metrica proxy ragionevole per INP, ma non è un sostituto di INP di per sé.» Divergano in modi reali:

  • TBT alto, INP buono. TBT misura il blocco durante il caricamento. Se i tuoi utenti non provano effettivamente a interagire durante quella finestra bloccata — aspettano che la pagina sembri finita prima — il loro INP può essere buono anche con un TBT brutto.
  • TBT buono, INP scarso. INP copre anche gestori di eventi lenti e lavoro di rendering che scattano dopo il caricamento, più cose come il ritardo di 300 ms del tocco del browser su pagine non ottimizzate per mobile — nessuna delle quali TBT vede.

Quando lab e campo non concordano, fidati del campo. INP (il numero dell’utente reale) ha priorità su TBT (la stima di laboratorio).

Una nota storica che confonde le persone: TBT era il proxy di laboratorio per First Input Delay (FID). INP ha sostituito FID come Core Web Vital il 12 marzo 2024, quindi TBT ora è il proxy di INP. Il meccanismo sottostante non è mai cambiato — è sempre stato un thread principale bloccato durante il caricamento — ma qualsiasi articolo più vecchio che chiama TBT “proxy di FID” precede quella transizione.

Perché TBT domina il punteggio Lighthouse

TBT ha il peso singolo più grande nel punteggio Performance di Lighthouse — 30%, un peso introdotto in Lighthouse 10 e, verificato dal vivo contro i documenti di punteggio di Chrome il 18 luglio 2026, ancora invariato fino all’attuale Lighthouse 13:

MetricaPeso
First Contentful Paint10%
Speed Index10%
Largest Contentful Paint25%
Total Blocking Time30%
Cumulative Layout Shift25%

Tratta quella tabella come limitata a versione e data, non come una costante permanente — Lighthouse ha cambiato i suoi pesi prima e può farlo di nuovo. Riverifica contro Lighthouse performance scoring prima di citarla in un deck di audit.

Questa è la ragione pratica per cui il TBT è importante negli audit SEO anche se non è un segnale di ranking: un TBT scarso ha un effetto sproporzionato su quel grande punteggio Lighthouse che tutti catturano con uno screenshot. L’esempio pratico di Addy Osmani lo rende concreto: la rimozione di un polyfill Intersection Observer ha ridotto il TBT da 400 ms a 300 ms e ha portato il punteggio Lighthouse Performance da 63 a 70. Una correzione, sette punti, grazie al peso del 30%.

Un’altra sfumatura: la soglia di categoria “Buono ≤200 ms” e il punteggio Lighthouse sono scale diverse. Per ottenere 90+ nel sottopunteggio TBT servono circa ≤300 ms su mobile, e per raggiungere 100 servono ≤100 ms. (Quelle cifre del sottopunteggio sono la documentazione di DebugBear sulla curva di punteggio, riverificata sulla fonte live il 2026-07-18.) “Buono” e “100” non sono la stessa soglia.

Il TBT influisce sul ranking SEO?

Non direttamente — e sarò più diretto di quanto facciano molti.

Il TBT non è un segnale di ranking. L’input di ranking per l’interattività di Google è INP, una metrica di campo. Il TBT è un diagnostico che ti aiuta a trovare e correggere i task lunghi che danneggiano l’INP. Migliorare il TBT può migliorare l’INP, che potrebbe aiutare marginalmente l’aspetto Page Experience del ranking — ma sono due anelli di “può” lontani dalle tue posizioni.

E questa è la mia posizione reale sull’intera questione dei Core Web Vitals, che ho già scritto nella mia guida alla velocità delle pagine: non credo che i Core Web Vitals abbiano molto impatto sulla SEO e, a meno che tu non sia estremamente lento, generalmente non li darei priorità. Falli per gli utenti e le conversioni, non per un aumento del ranking. Questo vale doppiamente per il TBT, che è un proxy di laboratorio per una metrica di campo per un piccolo input di ranking. Correggilo perché una pagina bloccata ti fa perdere clienti — non perché stai inseguendo una posizione.

Cosa causa un TBT alto

È quasi sempre JavaScript:

  • Caricamento, parsing o esecuzione di JavaScript non necessario — le parole stesse dell’audit Lighthouse. Inviare un bundle grande che la pagina non serve al caricamento è la causa classica.
  • Istruzioni JavaScript inefficienti — lavoro sincrono pesante che monopolizza il thread principale.
  • Script di terze parti — tag manager, widget di chat, analytics, script pubblicitari. Spesso il contributore singolo più grande, e quello su cui hai meno controllo.
  • Bootstrap di framework pesante — l’idratazione di React e simili può eseguire task lunghi durante l’avvio.
  • Ricalcolo di stile/layout e garbage collection — layout sincrono forzato, grandi ricalcoli di stile e pause del GC appaiono anche come task del thread principale; non dare per scontato che ogni task lungo nella traccia sia esecuzione di JavaScript.

Non dare per scontato nemmeno che la dimensione di trasferimento del bundle sia tutta la storia. L’attribuzione della traccia ha lacune reali: i frame cross-origin e i thread worker hanno limiti di privacy e sicurezza su ciò che un osservatore di task lunghi può riportare su di loro (vedi Risoluzione dei problemi), quindi un task non attribuito nella tua traccia non è la prova che nessuna terza parte sia coinvolta — potrebbe semplicemente significare che l’API di attribuzione non è autorizzata a dirtelo.

Come correggere un TBT alto

Le correzioni sono della stessa famiglia delle correzioni INP — entrambe si riducono a un thread principale bloccato.

  1. Trova le attività lunghe. Apri il pannello Performance di Chrome DevTools e cerca attività oltre 50 ms (sono contrassegnate con angoli rossi), oppure esegui l’audit Lighthouse “Evita attività lunghe sul thread principale”.
  2. Controlla prima gli script di terze parti. Di solito sono le vittorie più facili. Usa le schede Coverage e Network di DevTools per vedere quanto costa ogni script e carica in modo lazy gli embed pesanti (YouTube, mappe, chat) dietro una facciata.
  3. Spezza le attività lunghe. Cedi il controllo al thread principale così il browser può gestire l’input tra i blocchi — “quando le attività vengono spezzate, il browser può rispondere al lavoro a priorità più alta molto prima, incluse le interazioni dell’utente.” L’API moderna è scheduler.yield(), con un fallback setTimeout(resolve, 0) (vedi la scheda Cheat Sheets per il pattern). Nota che Google non raccomanda più isInputPending() — cedi il controllo indipendentemente dal fatto che l’input sia in sospeso.
  4. Riduci il JavaScript. Dividi i bundle grandi in codice separato così meno codice viene analizzato ed eseguito al caricamento, rimuovi JS non utilizzato (la scheda Coverage di DevTools ti mostra cosa) e usa defer per gli script non critici.
  5. Sposta i calcoli pesanti fuori dal thread principale. I Web Worker eseguono il lavoro ad alta intensità di CPU su un thread separato, lasciando il thread principale libero di rispondere.

Un utile effetto collaterale: le attività lunghe che bloccano il thread principale possono anche ritardare il rendering di Largest Contentful Paint, quindi correggere il TBT a volte migliora anche l’LCP — specialmente quando è coinvolto JS che blocca il rendering.

Dove andare dopo

Il TBT fa parte della famiglia Core Web Vitals insieme al suo equivalente sul campo Interaction to Next Paint, le metriche di caricamento Largest Contentful Paint e First Contentful Paint, e gli strumenti di laboratorio Lighthouse, PageSpeed Insights e Speed Index che le riportano. Se ricordi solo una cosa: il TBT è la spia di laboratorio per la reattività sul campo — caccia le attività lunghe, non il numero.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.