Poradnik: Total Blocking Time (TBT)

co TBT measures, the 50ms long-task math, why it's the lab proxy dla INP (nie a Core Web Vital), i how to fix a red score — z a techniczne SEO.

Opublikowano po raz pierwszy: 26 cze 2026 · Ostatnia aktualizacja: 3 sie 2026 · Advanced
Języki

Total Blocking Time (TBT) jest the sum of the blocking portion — the time above 50 ms — of każdy long task między pierwszy Contentful Paint i Time to Interactive. It's a lab-tylko metric, the single largest weight (30%) in the Lighthouse wydajność score, i the lab proxy dla the Core Web Vital INP (it używany to proxy FID). It jest nie a Core Web Vital i nigdy pokazuje up in Search Console lub CrUX. Lighthouse mobilny thresholds: good ≤200 ms, poor >600 ms. You fix it the same way you fix INP — break up long JS tasks, code-split, defer lub remove unused JS, i cut third-party script cost. My honest take: robić it dla użytkownicy i conversions, nie dla a ranking bump.

TL;DR — TBT jest the total amount of time, między pierwszy Contentful Paint i Time to Interactive, że the main thread był blocked long enough to zapobiegać input responsiveness. It sums the blocking portion (duration − 50 ms) of każdy long task (dowolny main-thread task ponad 50 ms). It’s a lab metric — the single largest weight (30%) in the Lighthouse 10 score i the lab proxy dla INP — ale it jest nie a Core Web Vital i nigdy appears in CrUX lub Search Console. mobilny thresholds: good ≤200 ms, poor >600 ms. Fix it like you’d fix INP: break up long JS tasks, code-split, defer/remove unused JS, tame third-party scripts. My honest take: fix it dla użytkownicy, nie dla a ranking bump.

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

co TBT actually measures

Google’s definition jest the place to start. TBT jest “the total amount of time po pierwszy Contentful Paint (FCP) gdzie the main thread był blocked dla long enough to zapobiegać input responsiveness.” The przeglądarka’s main thread procesy one task at a time; podczas gdy it’s busy z a long chunk of działać, it może’t react to a click, a tap, lub a keypress. TBT quantifies how much of twój strona-load window jest spent in że blocked state.

Two definitions robić wszystkie the działać here:

  • A long task jest “a task że runs on the main thread dla więcej niż 50 milliseconds.”
  • The blocking portion of a task jest jego duration minus 50 ms. Tasks at lub poniżej 50 ms contribute exactly 0 ms.

TBT jest the sum of tamte blocking portions między FCP i Time to Interactive (TTI). So pierwszy Contentful Paint jest the start wiersz: nothing przed the pierwszy paint counts, ponieważ there’s nothing on screen to interact z yet.

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

The worked przykład

Google’s own tabela jest the clearest illustration. Imagine five tasks run on the main thread między FCP i TTI:

Task durationBlocking time (duration − 50 ms)
Task one: 250 ms200 ms
Task two: 90 ms40 ms
Task three: 35 ms0 ms
Task four: 30 ms0 ms
Task five: 155 ms105 ms
Total Blocking Time345 ms

Tasks three i four są poniżej the 50 ms wiersz, so they contribute nothing. Task one bloki dla 250 − 50 = 200 ms, task five dla 155 − 50 = 105 ms. dodaj blocking portions — 200 + 40 + 0 + 0 + 105 — i you get 345 ms of TBT. że’s a “needs improvement” score, driven almost entirely by two heavy tasks.

ten jest the counter-intuitive part worth internalizing: “A mały liczba of tasks on the main thread doesn’t necessarily mean niski blocking time. Conversely, a duży liczba of tasks doesn’t necessarily lead to tons of blocking time.” (że framing jest NitroPack’s, relayed here — reverified wobec the live źródło 2026-07-18.) co matters jest whether individual tasks cross 50 ms, nie how wiele tasks there są.

The pomiar window: FCP to TTI

The window ends at Time to Interactive“the time z gdy the strona starts ładowanie to gdy jego main sub-zasoby mieć załadowany i it jest capable of reliably responding to użytkownik input quickly.” In Lighthouse, TTI jest found by searching forward dla a five-second “quiet window” z no long tasks i no więcej niż two in-flight network żądania.

Worth noting: TTI itself był removed z Lighthouse 10 ponieważ it proved overly sensitive to outlier network żądania i long tasks, producing wysoki variability. TBT survived i became the primary interactivity metric. As Philip Walton put it, “Newer, alternative, metrics like Largest Contentful Paint (LCP), Total Blocking Time (TBT), i Interaction to następny Paint (INP) są zwykle better metrics to używać in place of TTI.” TBT didn’t zastępować TTI as the window’s endpoint — it’s a better single liczba dla the same underlying problem. i TTI’s disappearance z the Lighthouse raport UI isn’t the same twierdzenie as TTI no longer bounding Lighthouse’s domyślny navigation window — the window itself jest nadal measured że way poniżej the hood.

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)

One więcej scoping note: “FCP to TTI” describes Lighthouse’s domyślny navigation audit specifically. Other narzędzia, lub Lighthouse itself running a timespan trace zamiast a pełny strona-load navigation, może total a różny measured window — the 50 ms long-task math doesn’t change, ale the start i end points of co gets summed są narzędzie- i trace-mode-specific, nie a universal law of the metric.

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

jest TBT a Core Web Vital? No.

ten jest the najbardziej common misconception, so let’s być blunt o it. The three Core Web Vitals są LCP, INP, i CLS. TBT jest nie one of them. Google’s own wording: “Total Blocking Time (TBT) jest a lab metrics jest vital in catching i diagnosing potential interactivity problemy że może impact INP. However, it jest nie part of the Core Web Vitals ustawić ponieważ they są nie pole-measurable, nor robić they reflect a użytkownik-centric outcome.” (The grammar in że zdanie jest theirs, nie mine.)

So gdzie robi TBT pokazywać up, i gdzie doesn’t it?

  • gdzie you see it: Lighthouse, PageSpeed Insights’ lab tab, i Chrome DevTools — wszystkie simulated/lab environments.
  • gdzie you don’t: Google Search Console’s Core Web Vitals raport, CrUX, lub dowolny pole data. tamte tylko carry LCP, INP, i CLS.

If someone tells you they’re “watching TBT in Search Console,” they’re mistaken — GSC raporty pole data, i TBT isn’t a pole metric.

One correction worth będąc precise o: TBT będąc lab-recommended isn’t the same as TBT będąc pole-impossible. You może technically compute a TBT-style total in the pole z the Long Tasks API — Google says so directly: “It jest possible to mierzyć TBT in the pole, ale we don’t rekomendować ten as użytkownik interaction może affect twój strona’s TBT in ways że lead to lots of variance in twój raporty.” że’s a recommendation wobec it, nie a technical wall. co’s actually prawdziwy bez exception jest narrower: CrUX i Search Console’s Core Web Vitals raport nigdy carry TBT, pełny stop — tamte pipelines tylko ever collect LCP, INP, i CLS.

TBT jest the lab proxy dla INP

Here’s why TBT exists at wszystkie. Lab narzędzia load a strona in a simulated environment z no rzeczywisty użytkownik, so they może’t mierzyć Interaction to następny Paint — INP needs rzeczywisty clicks i taps. TBT fills że gap: “the Total Blocking Time (TBT) metric jest lab-measurable i jest a proxy dla INP.”

The two są mechanically powiązany: “Although INP i TBT są calculated differently, they są oba reflections of a blocked main thread podczas the bootstrap proces. gdy the main thread jest blocked, the przeglądarka jest delayed in responding to użytkownik interactions.” And empirically, “A niski TBT często correlates z a niski Interaction to następny Paint (INP).”

ale “proxy” jest nie “substitute.” Google jest explicit: “Total Blocking Time (TBT) może być a reasonable proxy metric dla INP, ale it’s nie a substitute dla INP in i of itself.” They diverge in rzeczywisty ways:

  • wysoki TBT, fine INP. TBT measures blocking podczas load. If twój użytkownicy don’t actually try to interact podczas że blocked window — they wait dla the strona to look finished pierwszy — ich INP może być fine even z an ugly TBT.
  • Fine TBT, poor INP. INP również covers slow event handlers i renderowanie działać że fire po load, plus things like the przeglądarka’s 300 ms tap opóźnienie on non-mobilny-optimized strony — none of który TBT sees.

gdy the lab i pole disagree, trust the pole. INP (the rzeczywisty-użytkownik liczba) takes priority ponad TBT (the lab estimate).

One historical note że trips people up: TBT używany to być the lab proxy dla pierwszy Input opóźnienie (FID). INP replaced FID as a Core Web Vital on March 12, 2024, so TBT jest now INP’s proxy. The underlying mechanism nigdy changed — it’s zawsze był o a blocked main thread podczas load — ale dowolny older artykuł calling TBT “FID’s proxy” predates że switch.

Why TBT dominates the Lighthouse score

TBT carries the largest single weight in the Lighthouse wydajność score — 30%, a weighting introduced in Lighthouse 10 i, verified live wobec Chrome’s scoring docs on 2026-07-18, nadal unchanged przez the current Lighthouse 13:

MetricWeight
pierwszy Contentful Paint10%
Speed Index10%
Largest Contentful Paint25%
Total Blocking Time30%
Cumulative Layout Shift25%

Treat że tabela as version-i-date-scoped, nie a permanent constant — Lighthouse ma changed jego weights przed i może again. Re-verify wobec Lighthouse wydajność scoring przed quoting it in an audit deck.

ten jest the practical powód TBT matters dla SEO audits even though it isn’t a ranking signal: a poor TBT ma an outsized effect on że big Lighthouse liczba everyone screenshots. Addy Osmani’s worked przykład makes it concrete — removing one Intersection Observer polyfill cut TBT z 400 ms to 300 ms i lifted the Lighthouse wydajność score z 63 to 70. One fix, seven points, z powodu the 30% weight.

One więcej nuance: the “Good ≤200 ms” kategoria threshold i the Lighthouse score są różny scales. To score 90+ on the TBT subscore you need roughly ≤300 ms on mobilny, i to hit 100 you need ≤100 ms. (tamte subscore figures są DebugBear’s documentation of the scoring curve, reverified wobec the live źródło 2026-07-18.) “Good” i “100” są nie the same bar.

robi TBT affect SEO rankings?

nie directly — i I’ll być straighter o ten than najbardziej.

TBT jest nie a ranking signal. Google’s interactivity ranking input jest INP, a pole metric. TBT jest a diagnostic że pomaga you find i fix the long tasks że hurt INP. poprawiając TBT może poprawić INP, który może marginally pomagać the strona Experience side of rankings — ale że’s two links of “may” away z twój positions.

i here’s my rzeczywisty position on the whole Core Web Vitals question, który I’ve written przed in my szybkość strony poradnik: I don’t think Core Web Vitals mieć much impact on SEO, i unless you’re extremely slow I generally won’t prioritize them. robić them dla użytkownicy i conversions, nie dla a ranking bump. że applies doubly to TBT, który jest a lab proxy dla a pole metric dla a mały ranking input. Fix it ponieważ a frozen strona loses you klienci — nie ponieważ you’re chasing a position.

co causes wysoki TBT

It’s almost zawsze JavaScript:

  • Unnecessary JavaScript ładowanie, parsing, lub execution — the Lighthouse audit’s own words. wysyłka a big bundle the strona doesn’t need at load jest the classic cause.
  • Inefficient JavaScript statements — heavy synchronous działać że monopolizes the main thread.
  • Third-party scripts — znacznik managers, chat widgets, analytics, ad scripts. często the single biggest contributor, i the one you control least.
  • Heavy framework bootstrap — React hydration i similar może run long tasks podczas startup.
  • Style/layout recalculation i garbage collection — forced synchronous layout, duży style recalcs, i GC pauses pokazywać up as main-thread tasks too; don’t assume każdy long task in the trace jest JavaScript execution.

Don’t assume bundle transfer size jest the whole story, either. Trace attribution ma rzeczywisty gaps: cross-origin frames i worker threads mieć prywatność i security limits on co a long-task observer może raport o them (see Troubleshooting), so an unattributed task in twój trace isn’t proof no third party jest involved — it może just mean the attribution API isn’t allowed to tell you.

How to fix wysoki TBT

The fixes są the same family as the INP fixes — oba come down to a blocked main thread.

  1. Find the long tasks. otwarty the Chrome DevTools wydajność panel i look dla tasks ponad 50 ms (they’re flagged z red corners), lub run the Lighthouse “Avoid long main-thread tasks” audit.
  2. Audit third-party scripts pierwszy. They’re zwykle the easiest wins. użyj DevTools Coverage i Network tabs to see co każdy script costs, i lazy-load heavy embeds (YouTube, maps, chat) behind a facade.
  3. Break up the long tasks. Yield to the main thread so the przeglądarka może handle input między chunks — “gdy tasks są broken up, the przeglądarka może respond to higher-priority działać much sooner—w tym użytkownik interactions.” The modern API jest scheduler.yield(), z a setTimeout(resolve, 0) fallback (see the Cheat Sheets tab dla the pattern). Note że Google no longer recommends isInputPending() — yield regardless of whether input jest pending.
  4. Reduce the JavaScript. Code-split duży bundles so mniej parses i evaluates at load, remove unused JS (DevTools Coverage tab pokazuje you co), i defer non-critical scripts.
  5. Move heavy computation off the main thread. Web Workers run CPU-heavy działać on a oddzielny thread, leaving the main thread free to respond.

A użyteczny side effect: long tasks że blok the main thread może również opóźnienie Largest Contentful Paint renderowanie, so fixing TBT czasami poprawia LCP too — especially gdy blokujący renderowanie JS jest involved.

gdzie to go następny

TBT lives in the Core Web Vitals family alongside jego pole counterpart Interaction to następny Paint, the ładowanie metrics Largest Contentful Paint i pierwszy Contentful Paint, i the lab narzędzia Lighthouse, PageSpeed Insights, i Speed Index że raport them. If you tylko remember one thing: TBT jest the lab ostrzeżenie light dla pole responsiveness — chase the long tasks, nie the liczba.

Add an expert note

Pin an expert quote

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