Total Blocking Time
Definition
Total Blocking Time (TBT) is a lab performance metric measuring the cumulative duration between First Contentful Paint (FCP) and Time to Interactive (TTI) where the browser main thread was blocked by tasks exceeding 50 ms.
Why It Matters
TBT accounts for 30% of the total Lighthouse Performance score, making it the single heaviest weighted metric in synthetic audits. It serves as the primary laboratory proxy for field Interaction to Next Paint (INP). High TBT means the page looks loaded but freezes when users attempt to click or type.
Google Lighthouse TBT Scoring Thresholds
| Criterion / State | Requirement / Target | Status |
|---|---|---|
| Good (Fast) | ≤ 200 ms | Optimal |
| Needs Improvement | 200 ms – 600 ms | Needs Work |
| Poor (Slow) | > 600 ms | Avoid / Fail |
Practical Implementation Example
Dynamic imports delay JavaScript parsing and execution for complex non-critical components until after the initial page is interactive, keeping TBT under 100 ms.
import dynamic from 'next/dynamic';
// Lazy-load heavy charting library only when user scrolls near it
const HeavyAnalyticsChart = dynamic(
() => import('./HeavyAnalyticsChart'),
{ ssr: false, loading: () => <div className="h-64 animate-pulse bg-slate-800" /> }
);How to Audit TBT in ScanWise
ScanWise runs laboratory CPU throttling tests to identify individual long tasks (> 50 ms) on the main thread, profiling execution time by script origin.
Profile main thread long tasks and TBT in ScanWiseCommon TBT Mistakes & How to Fix Them
| Mistake | Why It Hurts | The Fix |
|---|---|---|
| Bundling large icon packs, date libraries (e.g., legacy Moment.js), or charting suites into the main bundle. | The browser must parse and compile megabytes of unused JavaScript during initial page boot, creating 800 ms+ long tasks. | Tree-shake imports, switch to modern lightweight libraries (date-fns, Lucide), and use code splitting. |
| Booting multiple heavy client tracking SDKs simultaneously on initial load. | Four tracking scripts compiling at once monopolize the main thread for hundreds of milliseconds. | Defer third-party scripts using requestIdleCallback or service worker proxying (Partytown). |
Related Engineering Guides
What Your Lighthouse Score Actually Means (And What It Misses)
Demystify Lighthouse weighting formulas and discover how TBT impacts your aggregate performance score.
INP Optimization for React Applications: Taming Long Tasks
Tame long tasks on the main thread to optimize both synthetic TBT and real-user field INP.
Eliminating Render-Blocking Resources: Critical CSS & Font Loading
Unburden the main thread during initial page boot by eliminating blocking stylesheets and scripts.