JavaScript Framework SEO
SEO for JavaScript frameworks — React, Next.js, Vue, Nuxt, Angular, Svelte, and Astro. How rendering mode (SSR, SSG, CSR) determines what Google can index, and which frameworks handle SEO best out of the box.
JavaScript framework SEO comes down to rendering mode: SSG and SSR give Googlebot pre-built HTML; CSR requires JavaScript execution that may or may not succeed. Next.js and Nuxt have the most built-in SEO support (SSR, SSG, ISR, metadata APIs). Pure React and Vue in CSR mode are the riskiest for SEO. Astro's island architecture is excellent for SEO by default. Angular requires SSR via @angular/ssr (formerly Angular Universal) for reliable indexation.
TL;DR — Most JavaScript frameworks build pages in your visitor’s browser (CSR). This works fine for users, but search engines might not run the JavaScript and miss your content. The fix: use a framework mode that builds pages on the server (SSR) or at build time (SSG). Next.js and Nuxt make this easy; pure React and Vue in CSR mode require extra work.
Why JavaScript frameworks have SEO concerns
Google processes JavaScript through crawling, rendering, and indexing, and blocked or failed resources can change the rendered result. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: JavaScript SEO basics Rendering mode and metadata implementation matter more than the framework brand alone. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: web.dev: Rendering on the Web
Traditional websites send complete HTML from the server. Search engine crawlers download that HTML and index the content immediately. JavaScript frameworks often work differently: the server sends a minimal HTML file, and then JavaScript runs in the browser to build the actual page content.
If a search engine crawler doesn’t run your JavaScript (or runs it but something fails), it sees an empty page. That’s the CSR SEO problem.
Rendering modes explained
- SSG (static site generation) — pages are built as HTML at deploy time. Crawlers get complete HTML with no JavaScript required. Best for SEO.
- SSR (server-side rendering) — the server builds the HTML fresh for each request. Crawlers get complete HTML. Also excellent for SEO.
- CSR (client-side rendering) — JavaScript builds the page in the browser. Crawlers must run JavaScript to see content. Google can do this, but failures happen and discovery is slower.
Frameworks by SEO safety out of the box
Safest:
- Astro — generates static HTML by default; JavaScript only where you opt in
- Next.js — offers SSG, SSR, and ISR; full metadata API; industry standard
- Nuxt — same for the Vue ecosystem; excellent SSR/SSG support
Requires configuration:
- Angular — CSR by default; needs
@angular/ssr(formerly Angular Universal) for safe SEO - React — CSR by default; needs Next.js or React Router (framework mode) for SSR/SSG
- Vue — CSR by default; needs Nuxt for SSR/SSG
- Svelte — CSR by default; SvelteKit adds SSR/SSG support
TL;DR — At the technical level, JS framework SEO is about: (1) rendering architecture for the initial HTML payload, (2) metadata injection into
<head>before the response is sent, (3) how the framework handles hydration and link discovery, and (4) ISR cache staleness. Next.js has the most complete built-in SEO tooling (Metadata API, built-inapp/sitemap.ts, image optimization). Astro is the most SEO-safe by architecture.
Rendering mode, metadata API, and ISR support by framework
Framework capabilities and defaults change by version; verify them in each framework’s official documentation. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: web.dev: Rendering on the Web No rendering mode guarantees indexing or rankings. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: JavaScript SEO basics When you’re comparing frameworks for a decision, test the same routes, content, deployment target and tooling for each candidate — a benchmark that swaps any of those isn’t measuring the framework, it’s measuring the difference in setup.
| Framework | Default rendering | Built-in metadata API | SSR/SSG support | Ecosystem SEO support |
|---|---|---|---|---|
| Astro | SSG (islands) | Yes (<head> in .astro files, Content Collections for structured data) | Both | Strong |
| Next.js | SSR/SSG (configurable) | Yes (Metadata API in App Router) | Both + ISR | Excellent |
| Nuxt | SSR by default | Yes (useHead, useSeoMeta) | Both + ISR | Excellent |
| SvelteKit | SSR by default | Yes (svelte:head) | Both | Good |
| React Router (framework mode) | SSR by default | Yes (meta export) | SSR + Deferred | Good |
| Angular | CSR by default | Via Angular Meta/Title services | Via @angular/ssr | Moderate |
| React (bare) | CSR | Manual (react-helmet-async; react-helmet is unmaintained) | Via Next.js/Gatsby | Depends on wrapper |
| Vue (bare) | CSR | Manual (@unhead/vue; vue-meta is unmaintained) | Via Nuxt | Depends on wrapper |
Remix v2 and React Router v7 merged — Remix’s server rendering and data-loading model now ships as React Router’s “framework mode,” and that’s the stable upgrade path for Remix v2 apps. Remix 3 is a separate, experimental React-less rewrite (beta), not the successor to Remix v2 — don’t treat it as a drop-in SSR option for a React codebase.
Metadata timing, crawlable links, and ISR cache staleness
Metadata injection timing — Metadata (<title>, <meta>) must be in the
server response, not added by JavaScript after page load. Next.js’s Metadata API,
Nuxt’s useSeoMeta, and Astro’s <head> component handle this correctly.
document.title = '...' or React Helmet in CSR mode does not — it runs after the
initial HTML is served.
Link discovery — Googlebot discovers links by parsing HTML. Links added via
JavaScript (onClick, dynamic routing without <a> tags) may not be discovered.
Use real <a href> elements for important navigation.
Hydration and duplicate content — If SSR and CSR render different content (hydration mismatch), you may end up with indexed content that doesn’t match what users see. Test for hydration errors in the browser console.
Soft 404s — Client-side routers can silently render a “page not found” UI while returning a 200 HTTP status. Search engines index these as real pages. Make sure your 404 page returns a real 404 status, and server-side redirects return 301.
ISR cache invalidation — In Next.js and Nuxt ISR setups, stale pages can be
served to crawlers during the revalidation window. Set a time-based revalidate
interval, and for content that changes on a schedule you don’t control (a CMS save,
for example), pair it with on-demand revalidation triggered from a webhook-backed
route handler — see the Next.js ISR guide
for the full API.
// app/blog/[id]/page.tsx — time-based revalidation
export const revalidate = 3600 // re-check this page at most once an hour
// app/api/revalidate/route.ts — on-demand revalidation, called by a CMS webhook
import { revalidatePath } from 'next/cache'
import { NextRequest, NextResponse } from 'next/server'
export async function POST(request: NextRequest) {
const { path, secret } = await request.json()
if (secret !== process.env.REVALIDATE_SECRET) {
return NextResponse.json({ message: 'Invalid secret' }, { status: 401 })
}
revalidatePath(path) // e.g. '/blog/1' — next request regenerates fresh HTML
return NextResponse.json({ revalidated: true })
} JavaScript framework SEO is primarily determined by rendering mode. SSG (pages built as static HTML at deploy time) and SSR (pages rendered server-side per request) are both safe for search engine indexation. CSR (pages rendered entirely in the browser via JavaScript) is riskier — Google can execute JavaScript, but failures and delays are common, and discovery is slower.
Next.js (React meta-framework): Most complete built-in SEO support. App Router Metadata API, SSG/SSR/ISR, image optimization, built-in app/sitemap.ts (the next-sitemap package is now only needed for extensions it doesn’t cover), link-level prefetching. Industry standard for SEO-sensitive React apps.
Nuxt (Vue meta-framework): Equivalent capabilities for Vue. Built-in useSeoMeta() and useHead() composables, SSR/SSG/ISR, Nuxt SEO module. Excellent for Vue-based sites.
Astro: Island architecture ships zero JavaScript by default. Pages are static HTML; interactivity added via explicit “islands.” Best SEO safety of any JS framework by default. Great for content-heavy sites.
SvelteKit: SSR by default, excellent metadata support via svelte:head. Solid SEO with minimal configuration.
Angular: CSR by default, requires @angular/ssr (formerly Angular Universal) for reliable indexation. Historically the most SEO-problematic of the major frameworks.
React (bare): CSR by default. Requires Next.js, React Router (framework mode), or Gatsby for SSR/SSG. Note: Remix v2’s server-rendering model has merged into React Router v7/v8 as “framework mode” — that’s the maintained upgrade path, not the separate, experimental React-less Remix 3 beta. Don’t use bare CRA/Vite-React for content that must rank.
Vue (bare): Same issue. Use Nuxt for SEO-critical Vue applications.
Svelte (bare): CSR by default. Use SvelteKit for SSR/SSG.
JavaScript framework SEO checklist
Universal (applies to all frameworks)
- Verify rendering mode:
curl -s URL | grep "<title>"— title must appear in raw HTML - Check that
<title>and<meta name="description">are in the server response - Use real
<a href>tags for all navigable links (not just click handlers) - Ensure 404 pages return HTTP 404, not 200
- Ensure redirects use server-side 301/302, not
window.location.href - Generate and submit an XML sitemap
- Add
robots.txtto your public directory
Next.js
- Use the App Router Metadata API (
metadataexport orgenerateMetadata()) - Choose SSG (
generateStaticParams) or SSR (dynamic = 'force-dynamic') per route - Add an
app/sitemap.tsfile (App Router’s built-in sitemap support) for most sites; reach for thenext-sitemappackage only if you need cross-domain sitemaps or other extensions the built-inMetadataRoute.Sitemaptype doesn’t model - Use
next/imagefor all images (automatic WebP, sizing, lazy-load) - Verify ISR
revalidatevalues — set short windows for frequently-updated pages
Nuxt
- Use
useSeoMeta()oruseHead()in every page component - Install the
@nuxtjs/sitemapmodule - Use Nuxt’s built-in SSR (or
nuxt generatefor SSG) - Configure
robots.txtvia@nuxtjs/robots
Astro
- Pass SEO props to your
<BaseHead>component on every page - Use Astro’s
@astrojs/sitemapintegration - Keep JavaScript islands minimal — avoid converting static sections to islands
Angular
- Enable SSR via
ng add @angular/ssr - Use
MetaandTitleservices for metadata - Add transfer state to prevent API double-fetching on hydration
Framework deep dives
Related reading
JavaScript Frameworks
JavaScript frameworks — React, Vue, Angular, Next.js, Nuxt, Svelte, Astro — are libraries or meta-frameworks for building web UIs. Their SEO impact depends on rendering mode: SSR and SSG deliver pre-rendered HTML; CSR-only apps require Googlebot to execute JavaScript before it can index content.
Related: JavaScript SEO, Headless CMS
JavaScript Frameworks
JavaScript frameworks are toolkits — either component libraries (React, Vue, Svelte) or full meta-frameworks built on top of them (Next.js, Nuxt, SvelteKit, Astro, Angular) — for building interactive web user interfaces. They abstract DOM manipulation, state management, and routing into reusable components.
From an SEO perspective, the framework itself matters less than its rendering mode:
- Server-Side Rendering (SSR): HTML is generated on the server per request. Googlebot receives fully rendered HTML immediately — same as a traditional server-rendered site.
- Static Site Generation (SSG): HTML is pre-built at deploy time. Fastest delivery; excellent for SEO.
- Client-Side Rendering (CSR): The server sends a minimal HTML shell; the browser runs JavaScript to build the DOM. Googlebot must execute JS to see content, adding latency and occasionally causing indexing gaps.
Most modern meta-frameworks (Next.js, Nuxt, Astro) support SSR and SSG by default, making SEO outcomes roughly equivalent to traditional CMS platforms when configured correctly.
Related: JavaScript SEO, Headless CMS
Build-time retrieval analysis plus live signals for this exact article. The automatic chunk report includes a deterministic readiness score and is ready without a model download.
Search Console
sampleGA4 traffic (28d)
sampleCloudflare traffic (7d)
sampledCrUX field data (28d, phone)
sampleGoogle NLP entities
localChangelog
Updated Jul 19, 2026.
Editorial summary and recorded change details.Summary
Corrected version drift: Remix v2/React Router v7-v8 merger, Astro.glob() removal, and three unmaintained metadata libraries.
Change details
-
Replaced the advanced-lens Remix row with React Router (framework mode) and added a note that Remix v2's SSR model merged into React Router v7/v8, while Remix 3 is a separate, experimental React-less beta — not a drop-in Remix v2 upgrade.
-
Removed the Astro.glob() reference from the metadata-API column (removed in Astro v6); replaced with the current <head>/Content Collections approach.
-
Flagged vue-meta and react-helmet as unmaintained since 2020 and pointed to their maintained replacements, @unhead/vue and react-helmet-async.
-
Updated the Next.js sitemap guidance to recommend the built-in app/sitemap.ts first, with next-sitemap only for extensions it doesn't cover (next-sitemap itself hasn't published since 2023).
-
Standardized Angular Universal references to its current package name, @angular/ssr.
-
Added a like-for-like testing caveat for cross-framework comparisons (matched routes, content, deployment target, and tooling).
Full comparison unavailable — no prior snapshot was archived for this revision.