Understanding Core Web Vitals
Google's Core Web Vitals are the decisive performance metrics for SEO and user experience:
LCP (Largest Contentful Paint): How long does it take for the largest visible element on the page to load? Target: under 2.5 seconds, ideally under 1 second.
INP (Interaction to Next Paint): How quickly does the page react to user input? Target: under 200ms, ideally under 50ms.
CLS (Cumulative Layout Shift): How much do elements shift during loading? Target: under 0.1, ideally 0.02 or less.
Next.js offers better out-of-the-box conditions for all three metrics than WordPress or classic SPAs — but incorrect implementations can nullify these advantages.
Google uses Core Web Vitals as a ranking factor. Pages with good vitals rank on average 15–25% better than comparable pages with poor vitals.
Image optimization with next/image
Images are the most common LCP killer. Next.js `` solves most issues automatically:
Automatic WebP/AVIF conversion: Next.js delivers images in the best format the browser supports. AVIF is 40–60% smaller than JPEG at the same quality.
Lazy loading: Images below the viewport load only when the user scrolls. Sets `loading="lazy"` correctly.
Priority flag for LCP images: The main image (often the hero image) should have `priority` so it loads early. Missing this flag is a common LCP cause.
Fixed dimensions: Always set `width` and `height` to prevent CLS caused by late-loading images.
Blur placeholder: `placeholder="blur"` shows a blurred placeholder while loading and prevents visual jumps.
Common mistake: the hero image without the priority flag. Add priority to all above-the-fold images — this often improves LCP by 0.5–1.5 seconds.
Choosing the right rendering strategy
Next.js offers multiple rendering modes — the wrong choice costs performance:
Static Generation (SSG): Pages are rendered at build time and delivered as static HTML files. Fastest possible load time. Suited for pages that rarely change (landing pages, blog posts).
Incremental Static Regeneration (ISR): Static pages are refreshed in the background. Ideal for pages that change occasionally (product pages, news). The `revalidate` parameter controls update frequency.
Server-Side Rendering (SSR): Pages are rendered on every request. Necessary for personalized content, but slower. Caution: using SSR for everything is a common performance mistake.
React Server Components (RSC): With the App Router, components can render server-side — without shipping JavaScript to the client. Reduces bundle size and improves INP.
Optimize fonts and external scripts
next/font for Google Fonts
Never embed Google Fonts directly via CDN. `next/font/google` loads fonts locally and eliminates the network request to Google's servers — saves 200–500ms and improves privacy.
next/script for external scripts
Analytics, chat widgets, A/B testing tools — always embed with `
