If you're choosing between Next.js and React for a new project —or considering migration— SEO should be a decisive factor.
Both frameworks use React, but their approach to rendering and SEO is fundamentally different. Here's the honest comparison.
The core difference: rendering
React (Create React App, Vite)
Standard React apps use client-side rendering (CSR). The server sends an empty HTML shell, and JavaScript renders everything in the browser.
SEO impact:
- Googlebot must execute JavaScript to see your content
- JS execution delays indexing (sometimes by weeks)
- Content injected via JavaScript may not be indexed properly
- Social media crawlers often fail to read Open Graph tags
Next.js
Next.js uses server-side rendering (SSR) or static site generation (SSG) by default. The server sends fully rendered HTML.
SEO impact:
- Googlebot sees complete HTML immediately
- Content is indexed on the first crawl
- Metadata, structured data, and content are available in the initial HTML
- AI crawlers can parse content without JavaScript execution
Head-to-head comparison
| Factor | React (CSR) | Next.js (SSR/SSG) | |--------|------------|-------------------| | Initial HTML | Empty shell | Fully rendered | | Googlebot sees | Requires JS execution | Complete content | | Indexing speed | Slow (weeks) | Fast (days) | | Metadata API | Manual (react-helmet) | Built-in (generateMetadata) | | Image optimization | Third-party | Built-in (next/image) | | Core Web Vitals | Manual setup | Built-in optimization | | Structured data | Manual injection | Server-side injection | | AI crawler friendly | No (JS required) | Yes | | Open Graph tags | Client-side | Server-side (reliable) |
Core Web Vitals: a practical comparison
LCP (Largest Contentful Paint)
- React CSR: The browser must download, parse, and execute React + your app bundle before rendering anything useful. LCP often exceeds 3-4 seconds.
- Next.js: Pre-rendered HTML arrives immediately. LCP is typically under 2 seconds.
CLS (Cumulative Layout Shift)
- React CSR: Images and fonts loaded dynamically cause layout shifts as the page renders.
- Next.js: Built-in image and font optimization prevents layout shifts automatically.
INP (Interaction to Next Paint)
- React CSR: After initial load, interactions can lag while the JS runtime initializes.
- Next.js: Server components can handle interactions server-side, reducing client JS.
When React CSR still makes sense
Client-side rendering is not always wrong. These cases favor React CSR:
- Web applications (dashboards, admin panels) that require authentication
- Apps where SEO is irrelevant (internal tools, logged-in experiences)
- Interactive tools (calculators, editors, games) where initial render speed is less important
If your site needs to be found on Google, however, Next.js is the better choice.
Migration from React to Next.js
Good news: Next.js is React. Your components, state management, and most of your code work in Next.js with minimal changes.
Typical migration steps:
- Create a Next.js app and move your pages to the App Router
- Replace client-side routing with Next.js navigation
- Add
generateMetadatato each page - Optimize images with
next/image - Replace
react-helmetwith the built-in Metadata API - Test and deploy
Most React apps can be migrated to Next.js in 1-3 weeks.
The verdict
For any site where organic search traffic matters, Next.js is the clear winner. The SEO advantages are not marginal —they're structural. Server rendering, built-in optimization, and reliable metadata make it the best choice for ranking.
Already using React? Check our WordPress to Next.js migration (if coming from WordPress) or custom web development for new projects. Our Next.js SEO guide covers implementation details.
