๐—ก๐—ฒ๐˜…๐˜.๐—ท๐—ฆ ๐—ฃ๐—ฒ๐—ฟ๐—ณ๐—ผ๐—ฟ๐—บ๐—ฎ๐—ป๐—ฐ๐—ฒ: ๐—›๐—ผ๐˜„ ๐˜๐—ผ ๐—›๐—ถ๐˜ ๐Ÿญ๐Ÿฌ๐Ÿฌ ๐—Ÿ๐—ถ๐—ด๐—ต๐˜๐—ต๐—ผ๐˜‚๐˜€๐—ฒ

You can hit a 100 Lighthouse score with Next.js. Simply using the framework is not enough. Common mistakes keep many scores stuck in the 70s.

Lighthouse scores depend on five main metrics:

โ€ข Total Blocking Time (TBT): 30% weight. Target < 200ms. โ€ข Largest Contentful Paint (LCP): 25% weight. Target < 2.5s. โ€ข Cumulative Layout Shift (CLS): 15% weight. Target < 0.1. โ€ข First Contentful Paint (FCP): 10% weight. Target < 1.8s. โ€ข Speed Index: 10% weight. Target < 3.4s.

Focus on TBT first. It measures how much JavaScript blocks the main thread.

Optimize your images. Use the Next.js Image component to prevent layout shifts and serve WebP files. Only use the priority property on your LCP image. Using it on too many images ruins your performance.

Fix your fonts. Do not use standard link tags for Google Fonts. This blocks rendering. Instead, use next/font/google to self-host fonts. This removes layout shifts and flashes of unstyled text.

Watch your bundle size. Use @next/bundle-analyzer to see what slows you down.

Replace heavy libraries with native code:

Use static rendering whenever possible. Static pages load much faster from a CDN. Use ISR to refresh data on a schedule. Avoid forcing dynamic rendering unless you need cookies or headers.

Lazy load heavy components. Use next/dynamic for charts, maps, or text editors. This keeps them out of your initial bundle.

Control third-party scripts. Use next/script to manage when scripts load:

Stop layout shifts (CLS):

Final tips:

Source: https://dev.to/thekitbase/nextjs-performance-best-practices-how-to-hit-100-lighthouse-in-2026-2k9e