Know the targets
Google evaluates the 75th percentile of real user visits. Aim for the “good” column on mobile, where devices and networks are slowest.
Images
- Use
next/image: it serves modern formats, resizes per device and reserves space to prevent layout shift. - Mark the hero image with
priorityso it is not lazy-loaded — it is usually the LCP element. - Always pass
widthandheight(orfillwith a sized parent). - Use
sizesfor responsive images so phones do not download desktop widths.
Fonts
next/font self-hosts Google Fonts at build time, removes the extra connection to Google and adjusts the fallback font metrics to minimize layout shift.
Ship less JavaScript
- Keep components as Server Components by default; add
"use client"only to interactive leaves. - Pass server-rendered content to client components as props or children instead of importing large data modules in the client.
- Split heavy widgets with
next/dynamicand analyze bundles with@next/bundle-analyzer. - Break long tasks (> 50 ms) so input stays responsive — this is what INP measures.
Caching
For data that changes slowly, revalidate on an interval instead of fetching on every request, e.g. fetch(url, { next: { revalidate: 3600 } }).