Understanding Lighthouse Performance Scores
Master Google Lighthouse scoring methodology, understand what metrics impact your score, and learn proven strategies to achieve a 90+ performance score.
What is Lighthouse?
Lighthouse is an open-source, automated tool developed by Google for improving web page quality. It runs audits for performance, accessibility, progressive web apps, SEO, and best practices.
Where to Run Lighthouse
- Chrome DevTools: Built into Chrome browser (F12 → Lighthouse tab)
- PageSpeed Insights: Google's web interface with field data
- Lighthouse CI: Automated testing in CI/CD pipelines
- Command Line:
npm install -g lighthouse
How Lighthouse Performance Score is Calculated
The performance score is a weighted average of 6 key metrics. Each metric is scored from 0-100, then combined using specific weights.
Metric Weights (Lighthouse 10+)
Note: TBT (30%) and LCP (25%) have the highest impact on your score. Focus optimization efforts here for the biggest improvements.
Lighthouse Score Ranges
Good
Excellent performance. Site delivers a fast, smooth user experience. Continue monitoring to maintain this score.
Needs Improvement
Room for optimization. Focus on metrics with the lowest scores. Follow Lighthouse recommendations.
Poor
Critical performance issues. Users likely experiencing slow load times. Immediate optimization required.
Understanding the 6 Key Metrics
1. First Contentful Paint (FCP) - 10% weight
Measures when the first text or image appears on screen. Good FCP creates perception of fast loading.
- • Eliminate render-blocking resources
- • Inline critical CSS
- • Use font-display: swap
- • Minimize server response time
2. Largest Contentful Paint (LCP) - 25% weight
Measures when the largest visible element (hero image, heading) loads. Most important Core Web Vital.
- • Preload hero images with <link rel="preload">
- • Optimize images (WebP, responsive sizing)
- • Use a CDN for faster delivery
- • Reduce JavaScript execution time
3. Total Blocking Time (TBT) - 30% weight
Sum of time the main thread is blocked from responding to user input. Highest impact on score.
- • Code split and lazy load JavaScript
- • Remove unused JavaScript
- • Minimize third-party script impact
- • Use web workers for heavy computations
4. Cumulative Layout Shift (CLS) - 25% weight
Measures visual stability. Unexpected layout shifts frustrate users and hurt conversions.
- • Always specify width/height for images and videos
- • Reserve space for ads and embeds
- • Use CSS aspect-ratio for dynamic content
- • Avoid inserting content above existing content
5. Speed Index - 10% weight
Measures how quickly content is visually displayed during page load. Lower is better.
- • Optimize above-the-fold content delivery
- • Minimize main-thread work
- • Reduce JavaScript execution time
- • Lazy load below-the-fold images
Common Issues That Lower Scores
⚠️ Large JavaScript Bundles
Single biggest cause of low scores. Large JS files increase TBT and delay interactivity.
// Use code splitting to reduce bundle sizeconst HeavyComponent = lazy(() => import('./HeavyComponent'));
// Dynamic imports for route-based splittingconst route = await import(`./routes/${routeName}`);⚠️ Unoptimized Images
Large images hurt LCP and overall page weight. Always optimize and use modern formats.
<!-- Use modern formats with fallback --><picture> <source srcset="hero.webp" type="image/webp" /> <img src="hero.jpg" alt="Hero" width="1200" height="600" loading="lazy" /></picture>
<!-- Preload critical hero image --><link rel="preload" href="hero.webp" as="image" />⚠️ Render-Blocking Resources
CSS and JavaScript that blocks rendering delays FCP and LCP.
<!-- Inline critical CSS in <head> --><style> /* Critical CSS for above-the-fold content */ body { margin: 0; font-family: sans-serif; }</style>
<!-- Load non-critical CSS asynchronously --><link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'" />
<!-- Defer non-critical JavaScript --><script src="app.js" defer></script>⚠️ Third-Party Scripts
Analytics, ads, and social widgets can significantly impact TBT.
<!-- Load third-party scripts with defer or async --><script src="https://analytics.example.com/script.js" defer></script>
<!-- Delay non-essential scripts until after page load --><script> window.addEventListener('load', () => { // Load non-essential scripts loadScript('https://chat.example.com/widget.js'); });</script>How to Achieve a 90+ Score
Proven Optimization Strategy
- 1. Reduce JavaScript execution time (30% weight)
- • Code split by route and component
- • Remove unused JavaScript
- • Defer non-critical scripts
- • Target: <200KB total JS (gzipped)
- 2. Optimize Largest Contentful Paint (25% weight)
- • Preload hero images
- • Use WebP/AVIF formats
- • Implement responsive images
- • Target: <2.5s LCP
- 3. Fix Layout Shifts (25% weight)
- • Set explicit width/height on all images
- • Reserve space for dynamic content
- • Use CSS aspect-ratio
- • Target: <0.1 CLS
- 4. Eliminate Render-Blocking Resources
- • Inline critical CSS
- • Defer non-critical CSS
- • Use font-display: swap
- • Remove unused CSS
- 5. Test Regularly
- • Run Lighthouse after each deployment
- • Test on mobile (slower devices)
- • Use "Slow 4G" throttling
- • Set up Lighthouse CI for automated checks
Lab Data vs. Field Data
Lab Data (Lighthouse)
Controlled, simulated environment with consistent conditions.
- ✓ Consistent, reproducible results
- ✓ Useful for debugging specific issues
- ✓ Available before deployment
- ✗ May not reflect real user experience
- ✗ Single network/device configuration
Field Data (CrUX)
Real user measurements from Chrome users worldwide.
- ✓ Reflects actual user experience
- ✓ Used by Google for ranking
- ✓ Shows performance across devices
- ✗ Requires 28 days of data
- ✗ Can't debug specific issues
Best Practice: Use Lab data to identify and fix issues during development. Monitor Field data to verify real-world improvements and track user experience over time.
Test Your Lighthouse Score
Get a detailed Lighthouse performance report with AI-powered recommendations to improve your score and Core Web Vitals.
Analyze Your Performance