seojuice

SEO for Next.js, React, and Nuxt: Three Decisions About When HTML Exists

Vadim Kravcenko
Vadim Kravcenko
Mar 25, 2026 · 11 min read

TL;DR: The SEO question is not “which JavaScript framework ranks better.” That framing is already broken. Google, AI crawlers, and boring old link discovery reward the same thing: complete HTML, stable metadata, clean routes, and pages that do not need a browser miracle before the main content exists.

I learned this the annoying way at mindnow, on vadimkravcenko.com, and now while building seojuice.io. React is not bad for SEO, but client-only rendering is a bad default for pages that need to be found. Static-first pages create fewer mysteries. Fewer mysteries mean fewer indexing problems.

Everyone answering "best SEO framework" is answering the wrong question

The top result for this topic being a Reddit thread tells you something. Most people searching for seo for nextjs react nuxt are not looking for a framework benchmark. They are trying to calm a fear: “Did we pick the wrong stack?”

That thread probably helps because peers answer fast. “Next.js is good.” “Nuxt is fine.” “Google can render JavaScript.” Useful, but shallow. The Medium-style articles cover titles, meta descriptions, SSR, static generation, sitemaps, and image performance. The Core Web Vitals articles go deeper on speed. Still, they often treat SEO like a framework feature checklist.

The missing angle is simpler — Next.js, React, and Nuxt are three different decisions about when HTML exists, not three SEO scores.

Rendering in this context is the process of pulling data into a template.

Martin Splitt, Search Developer Advocate at Google, quoted in Search Engine Journal

For SEO, translate that sentence like this: rendering decides whether the crawler gets a page or a promise. If your pricing copy, canonical tag, and internal links exist in raw HTML, life is boring. If they appear only after JavaScript runs, you have added a dependency to discovery (the current practical question).

Thesis: choose the rendering contract before the framework

Next.js and Nuxt are usually safer than raw React for SEO because they make server-rendered or static HTML easy. Google does not prefer their logos. Raw React can rank perfectly well when pages are pre-rendered, rendered on the server, or not meant to rank at all.

The risk starts when business-critical content exists only after client-side JavaScript executes.

The main issue with CSR usually is the risk that something goes wrong during transmission, the user won't see any content. That can also have SEO implications.

Martin Splitt, Search Developer Advocate at Google, quoted in Search Engine Journal

The common shortcut is half true. Google can render JavaScript. That does not make client-side rendering equal. Rendering costs time, adds failure points, and now has a second market problem—AI crawlers.

Vercel and Merj reported that ChatGPT and Claude fetch JavaScript files but do not execute them. That single fact changes the tradeoff. If your content needs a browser runtime to exist, Google might eventually see it. ChatGPT probably will not.

Use this mental model:

  • SEO-safe by default: static HTML, SSR, ISR, server components, and route-level metadata.
  • SEO-conditional: hybrid apps where public pages render server-side and dashboards render client-side.
  • SEO-risky: client-only React for public pages, JavaScript-injected canonicals, empty app shells, and route changes that do not update head tags reliably.

Stop asking “Next or Nuxt?” first. Ask what /pricing returns before JavaScript runs.

CSR, SSR, SSG, ISR, and server components in plain English

Client-side rendering: the blank receipt problem

In a plain Vite or old CRA-style React app, the server often returns a root element and scripts. The browser builds the page later. Some crawlers can do that work. Many cannot.

Empty shell:

<div id="root"></div><script src="/assets/app.js"></script>

Content in source:

<main><h1>Project management software</h1><p>Plan work...</p></main>

The second version gives crawlers something real immediately. The first asks them to execute an application before they can understand the page.

Server-side rendering: HTML exists on request

SSR creates HTML when the request arrives. It is strong for dynamic pages: marketplaces, inventory, personalized-but-indexable SaaS pages, and content where freshness matters. The server can fetch data, fill the template, return HTML, and then let the browser hydrate interactive pieces.

Static generation: HTML exists before request

SSG creates HTML at build time. Blogs, docs, glossaries, marketing pages, comparison pages, and most landing pages fit this model. They change less often than people think. ISR in Next.js and prerender patterns in Nuxt give you a middle path: keep static speed, refresh pages when content changes.

Server components: less JavaScript is the SEO feature

Server components are not magic—they reduce how much JavaScript the browser has to download, parse, and hydrate. That helps users, Core Web Vitals, and crawler reliability.

Server components allow you to extract logic out of your client-side bundle.

Daniel Roe, Nuxt Core Team Lead, in A guide to Nuxt server components

Diagram comparing when HTML is created in CSR, SSR, SSG, ISR, and server component rendering models
Source: SEOJuice rendering model diagram

Next.js SEO: good defaults, sharp edges

Next.js is the strongest default for React teams that need SEO. The App Router changed the conversation because React Server Components make server-first composition natural. The Pages Router can still be excellent, but teams often mix useEffect, client data fetching, and ad hoc head tags until page source no longer matches what users see.

For indexable routes, use the App Router metadata API for titles, descriptions, canonicals, Open Graph, and robots directives. Use generateMetadata when metadata depends on route data. Use server components as the default for main content. Add client components only where state is needed.

generateStaticParams, static rendering, dynamic rendering, and ISR give you route-level choices. A glossary can be static. A product page can use ISR. A live inventory page may need SSR. A dashboard can be client-heavy because it is usually behind authentication.

The bad habit is making everything "use client" because one dropdown needed state. That turns a server-first framework into a client-rendered app with extra steps.

Images, fonts, and scripts matter too. next/image helps with sizing and formats. Font handling reduces layout shifts. Script loading should keep analytics, chat widgets, and experiments away from the critical rendering path.

Use route handlers or a trusted package for sitemap.xml and robots.txt. Generate them from real routes, not a forgotten spreadsheet. The HTTP Archive Web Almanac 2025 found only about 2% of pages with a canonical missing in raw HTML but present in the rendered DOM. JavaScript-injected canonicals are the exception, not the pattern to copy.

Rule: if the page needs to rank, its main content and critical head tags should come from the server. Client components are fine for filters, calculators, tabs, nav state, and dashboards.

Decision tree for choosing static rendering, ISR, SSR, or client-only rendering in Next.js SEO
Source: SEOJuice Next.js route decision tree

React SEO without Next.js: fine for apps, fragile for public content

React is a UI library. It does not decide your SEO architecture. If you ship a Vite app where every route is created in the browser, you own the rendering problem.

There are three valid paths:

  1. Use React for the app shell and keep indexable pages outside it.
  2. Add SSR, SSG, or static pre-rendering through a meta-framework or build process.
  3. Keep the route client-only only when it does not need organic traffic.

This is how seojuice.io is structured. Public pages can be static-first while authenticated dashboard screens can be React-heavy. That looks like inconsistency until you see the underlying rule — matching rendering strategy to search value (yes, this happens to non-public routes too).

The common bugs are predictable: React Helmet updates that happen too late, product pages that fetch content only after mount, infinite client filters that create crawl traps, soft 404s where the app says “not found” but the server returns 200, and internal links built as buttons or click handlers instead of crawlable anchors.

Raw React becomes an SEO problem when it is the only way your public content exists.

Nuxt SEO: Vue’s safer public-site default, if you do not disable it

Nuxt is strong for SEO because SSR and hybrid rendering are first-class. Vue has no secret search advantage. Nuxt 3 with Nitro gives teams clean options for SSR, prerendering, server routes, and metadata composables.

Use useSeoMeta and useHead for route metadata, but keep the output server-rendered. Route rules let you decide which pages are SSR, static, or hybrid. Nitro prerendering works well for blogs, docs, landing pages, and content hubs.

Nuxt server components can reduce client bundle weight, matching Daniel Roe’s point above. The win is not the feature name. The win is less code shipped to pages whose job is to be read, crawled, and trusted.

Nuxt has the same failure mode as Next.js: teams turn public pages into client-only experiences because it feels faster during development. Nuxt can protect you from that, but only if content and metadata stay server-visible.

Framework SEO default Main risk
Raw React Client-rendered unless you add SSR or prerendering Empty source for public pages
Next.js App Router Server-first with React Server Components Overusing "use client"
Next.js Pages Router Good with SSR/SSG discipline Client fetching and scattered head tags
Nuxt 3 SSR and hybrid rendering built in Accidental client-only public pages
Comparison chart of SEO defaults in React, Next.js App Router, Next.js Pages Router, and Nuxt 3
Source: SEOJuice framework defaults comparison

How AI crawlers break client-side rendering all over again

Traditional SEO advice says Google can render JavaScript. True. Incomplete.

Vercel and Merj reported that ChatGPT and Claude fetch JavaScript files but do not execute them. ChatGPT requests included JavaScript files 11.50% of the time. Claude’s were 23.84%. GPTBot generated 569 million requests in the measured month and Claude 370 million, together roughly 20% of Googlebot’s 4.5 billion.

Gemini and AppleBot behave differently because they can render through browser-based infrastructure. Fine. The practical takeaway does not change: if answer engines cannot see your product copy, documentation, pricing, or comparison pages without JavaScript execution, they may never see it at all.

The same study found ugly 404 waste. ChatGPT spent 34.82% of fetches on 404 pages. Claude spent 34.16%. Googlebot was at 8.22%. AI crawlers are clumsy. Do not make them guess.

For Next.js and Nuxt teams, this means:

  • Generate accurate sitemaps from real routes.
  • Return 410 for intentionally removed pages where appropriate.
  • Redirect old slugs cleanly.
  • Keep canonical tags in raw HTML.
  • Make internal links crawlable.
  • Avoid hiding important copy behind client-only interactions.
Chart comparing JavaScript rendering and 404 fetch waste for Googlebot, ChatGPT, Claude, Gemini, and AppleBot
Source: SEOJuice chart based on Vercel and Merj crawler data

The boring layer that decides a lot — metadata, canonicals, robots, and sitemaps

Rendering gets the attention. Metadata often decides whether the page is understood correctly.

Every indexable route needs a unique title, description, canonical, robots directive, Open Graph tags, and primary structured data when relevant. Canonicals should be in server-rendered HTML, not patched into the DOM after hydration (not the rendered DOM). The Web Almanac canonical stat matters because it shows the web has already converged here.

Pagination and faceted navigation need rules before launch. Which filters are indexable? Which combinations are noindex? Which URLs canonicalize upward? Ecommerce sites can create millions of crawlable URLs by accident.

robots.txt should be generated from environment-aware rules so staging does not leak and production does not block itself. XML sitemaps should come from the CMS, content source, or route registry. Hand-maintained sitemaps rot.

Use 404 for missing pages, 410 for intentionally removed pages when the old URL has no replacement, and redirects when a better destination exists. That sounds basic until logs show AI crawlers hammering dead URLs for months.

Need Next.js Nuxt Raw React
Route metadata Metadata API / generateMetadata useSeoMeta / useHead Add SSR, prerendering, or server templates
Sitemap Route handler or package Nitro route or module Build script or backend
Canonical Server-render via metadata Server-render via head composables Risky if only client-injected
Public content Server/static route SSR/prerender route Pre-render or SSR required

Performance is a multiplier, not a foundation

Core Web Vitals matter. They just cannot save a page whose content and metadata are invisible.

For LCP, server-render above-the-fold content, optimize images, avoid loader waterfalls, and cache the HTML path. For INP, reduce hydration, split heavy client components, and do not ship dashboard code to marketing pages. For CLS, reserve image, ad, and embed dimensions. Handle fonts correctly. For TTFB, choose static, edge, or server rendering based on freshness needs and cache behavior.

Server components help here again. Less client JavaScript reduces hydration pressure and can improve interaction latency. That is a ranking-adjacent performance win and a user win. Do not sell it as an automatic ranking jump. Sell it as risk reduction and conversion protection.

Recommended architecture by site type

At mindnow, the cleanest builds were not the ones using the newest stack. They were the ones where the team wrote down which routes deserved organic traffic before they wrote components.

Site/page type Best default Why
Blog, docs, glossary SSG/ISR or Nuxt prerender Stable content, fast HTML, easy sitemap
SaaS marketing pages Static or SSR Content must exist before JavaScript
Ecommerce category pages SSR or ISR Fresh inventory and controlled filters
Product detail pages ISR/SSR Fresh enough, crawlable, template-driven
Authenticated dashboard Client-heavy React or Vue Usually not indexable
Search result pages Noindex or controlled SSR Crawl traps happen fast
Comparison pages Static/ISR High SEO value, low interactivity need

Migration and audit checklist: what to fix first

Do not rebuild the entire app because one audit found React. Fix the route contract first. I used to start with Lighthouse scores; that was backwards (I was wrong about this for years).

  1. Fetch important URLs with JavaScript disabled and inspect raw HTML.
  2. Confirm title, description, canonical, robots, and primary content are present before hydration.
  3. Check server status codes for missing, redirected, and removed routes.
  4. Generate a sitemap from the same source that creates routes.
  5. Validate internal links are real <a> elements with crawlable href values.
  6. Move ranking pages from client-only rendering to static generation or SSR.
  7. Split client components away from public content.
  8. Measure LCP, INP, CLS, and JavaScript bundle size after the rendering change.
  9. Test with Google Search Console URL Inspection, but do not use it as the only truth.
  10. Monitor logs for Googlebot, Bingbot, GPTBot, Claudebot, and other AI crawlers.
SEO audit flow for JavaScript framework pages from raw HTML inspection to rendering and sitemap fixes
Source: SEOJuice JavaScript SEO audit flow

Final verdict: Next.js vs React vs Nuxt for SEO

Next.js is the strongest default for React teams that need SEO, especially with the App Router, metadata API, server components, and static or ISR options. Nuxt is equally strong for Vue teams because SSR, prerendering, metadata composables, and Nitro make public-site SEO straightforward.

Raw React is fine for dashboards and applications. Public marketing and content pages need SSR, SSG, or pre-rendering around it.

The real winner has never been a framework — it is the route that returns the right HTML without waiting for a browser.

Google might render your JavaScript. ChatGPT probably will not. Your users should not have to wait for your framework to prove a point.

Related SEO guides

FAQ

Is Next.js better than React for SEO?

Next.js is usually better for SEO than a plain client-rendered React app because it gives you SSR, static generation, ISR, metadata APIs, and server components. React can still rank well, but you must add the rendering architecture yourself.

Is Nuxt better than Next.js for SEO?

Not by default. Nuxt and Next.js are both excellent when public pages render HTML on the server or at build time. Choose based on your team’s Vue or React preference, then enforce route-level rendering rules.

Can Google index client-side rendered React pages?

Yes, Google can render many JavaScript pages. That does not remove the risk. Rendering can be delayed, fail, or expose metadata differences. AI crawlers add a second problem because some fetch JavaScript files but do not execute them.

Should dashboards use SSR for SEO?

Usually no. Authenticated dashboards rarely need organic traffic. Client-heavy React or Vue is fine there. Save SSR, SSG, and prerendering work for public routes that need discovery.

What is the fastest audit for JavaScript SEO?

Open the page source or fetch the URL with JavaScript disabled. If the title, canonical, robots directive, internal links, and main content are missing, fix rendering before polishing performance.

Want the route contract checked?

SEOJuice can scan public pages for missing raw HTML content, weak metadata, sitemap gaps, and JavaScript rendering risks. Start with the pages that make money, not the framework debate.