Skip to content
Core Web Vitals & SpeedTBT

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 / StateRequirement / TargetStatus
Good (Fast)≤ 200 msOptimal
Needs Improvement200 ms – 600 msNeeds Work
Poor (Slow)> 600 msAvoid / 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.

src/components/DynamicWidget.tsx
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" /> }
);
Automated Verification

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 ScanWise

Common TBT Mistakes & How to Fix Them

Common TBT Mistakes & How to Fix Them
MistakeWhy It HurtsThe 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).