Performance isn't an afterthought — it's an architectural decision made (or missed) at the start of a project. These are the patterns I reach for on every Next.js build.
Font loading
Google Fonts via the next/font package is the fastest path to good typography performance. The font files are self-hosted on the same domain, eliminating the extra DNS lookup. Set display: 'swap' and preload the weights you'll actually use — not all of them.
Image handling
The Next.js Image component handles WebP conversion, responsive srcsets, and lazy loading automatically. The patterns I see missed: not setting explicit width/height (causes layout shift), and not using priority on above-the-fold images (delays LCP).
Bundle analysis
Run @next/bundle-analyzer before every production deployment. The number of times I've caught a date library (moment.js at 67KB) sneaking into a bundle that needed millisecond-level formatting is embarrassing. date-fns does the same thing at 3KB for tree-shakeable imports.
Route prefetching
Next.js prefetches links in the viewport by default. For large applications, this can flood the network. Consider setting prefetch={false} on navigation links and let the router handle prefetching on hover instead.