Why your Next.js site is slow (and it isn't React)
A breakdown of the three real culprits behind sluggish App Router builds, with a 12-line check you can run on any production deploy.
Every quarter a client forwards us a Lighthouse score and blames React. It's almost never React.
1. Uncached CMS fetches at request time App Router server components make it trivially easy to fetch data inside a component that runs on every request. If your CMS client doesn't cache and your page has six components each fetching the same story, you're making six network round-trips on every page load.
2. Images served at wrong dimensions The Next.js Image component handles resizing, but only if you give it accurate width and height props. CMS-driven images often have dynamic dimensions. Skipping those props forces layout shift, tanking your CLS score.
3. Third-party scripts on the main thread Analytics, chat widgets, and A/B testing SDKs loaded synchronously block the main thread. Move everything to next/script with strategy=lazyOnload unless it absolutely must run before paint.