A plain React single-page app scored 100 on Lighthouse's SEO audit in our test, yet its first HTML response held no title, no heading and no article text. Lighthouse runs JavaScript before it audits. GPTBot, ClaudeBot and PerplexityBot do not, so to them that page was empty.
Quick comparison
| Rank | Framework | Version tested | Built on | Sitemap | Best for |
|---|---|---|---|---|---|
| 1 | Astro | 7.3.8 | Any UI library, or none | Official integration | Blogs, docs, marketing sites |
| 2 | SvelteKit | 3.0.1 | Svelte 5 | Write a route | Interactive sites that stay light |
| 3 | Qwik | 1.20.2 | Qwik | Written by the static build | Large apps that must load fast |
| 4 | Next.js | 16.4.0 | React 19 | Built in (sitemap.ts) | React teams and large ecosystems |
| 5 | Nuxt | 4.6.1 | Vue 3 | Nuxt SEO module | Vue teams |
#1 Astro

Astro fits content sites: blogs, documentation, marketing pages and stores where most of the page is text and images. In our test it sent the full article in the first response and only 108 bytes of JavaScript, all of it inline for the button.
It made zero script requests. Lighthouse gave it 100 for performance with a 0.9 second Largest Contentful Paint (LCP), the fastest of the eight.
The reason is a default the other frameworks do not share. The Astro islands docs say Astro renders every UI component "to just HTML & CSS, stripping out all client-side JavaScript automatically." You opt a component back into the browser only when it needs to be interactive.

Real sites show the same pattern. In August 2026, 71.0% of 43,850 Astro origins passed Core Web Vitals on mobile, the highest of any framework in the HTTP Archive technology report. Sitemaps come from the official @astrojs/sitemap integration, which writes the file at build time. This site runs on Astro.
- Best for: Content-led sites where search traffic is the main channel.
- Where it struggles: App-like products with many logged-in, interactive screens.
- SEO tooling: Official sitemap integration; titles, meta and JSON-LD are plain HTML in the page.
#2 SvelteKit

SvelteKit suits interactive sites that still need to stay light: dashboards with public pages and product sites with real client-side features. It shipped 37 KB of JavaScript in our test, the least of any framework that hydrates the whole page, and scored 100 for performance.
Svelte compiles components to small JavaScript at build time instead of shipping a runtime library. The SvelteKit SEO docs state that "SvelteKit employs SSR by default", so a new project starts with server-rendered HTML. Any route can be prerendered to static HTML with one line.

SvelteKit tied Astro for the largest one-year gain among the five, 7.6 points: from 43.0% to 50.6% of mobile origins passing Core Web Vitals, across 9,682 sites in August 2026. One setup note from our build: SvelteKit 3 moved its config into the Vite plugin and renamed the $lib alias to #lib, so older tutorials will not run as written.
- Best for: Teams that want app features without heavy JavaScript.
- Where it struggles: No official sitemap package; you write a sitemap route yourself.
- SEO tooling: SSR by default, per-route prerendering,
<svelte:head>for tags.
#3 Qwik

Qwik is for large interactive sites where load speed is the priority. It recorded 0 ms of Total Blocking Time (TBT) in our test, the only framework at zero, while shipping 28 KB of JavaScript. All five SEO elements we checked were in the raw HTML.
Most frameworks hydrate: the browser downloads the code and runs the page logic again before buttons work. The Qwik resumability docs describe the alternative: Qwik "pauses execution on the server, and resumes execution on the client," loading code for a component only when someone uses it.

The field data is strong but thin. Qwik passed Core Web Vitals on 62.5% of mobile origins and 92.2% of desktop origins in August 2026, from only 1,334 sites. We tested the stable 1.20.2 release. Qwik 2 is at release candidate 2.0.0-rc.2 on npm and moves to new package names, so expect migration work.
- Best for: Big storefronts and apps where every interaction must feel instant.
- Where it struggles: Fewer libraries and tutorials, and a major version change in progress.
- SEO tooling: A
headexport per route for title, meta, links and JSON-LD; the static build wrote sitemap.xml without setup.
#4 Next.js

Next.js is the pick for teams already writing React. It is the most used framework in this list. 20.8% of developers in the Stack Overflow 2025 survey used it, against 4.5% for Astro. Its SEO tools are the most complete out of the box.
The Metadata API builds titles, descriptions, canonical tags and Open Graph tags from a metadata object.
sitemap.ts and robots.ts generate those files from code. Our page passed every raw HTML check.
The cost is weight. Next.js shipped 143 KB of JavaScript, including about 9.6 KB of inline data React uses to hydrate. That cost 386 ms of TBT. Its performance score of 91 was the lowest of the eight. Real Next.js sites improved over the year, from 27.9% to 35.1% passing on mobile across 374,612 origins.
- Best for: React teams that want SEO features built in.
- Where it struggles: The heaviest JavaScript in our test and the most main-thread blocking.
- SEO tooling: Metadata API, sitemap.ts, robots.ts, Open Graph image generation.
#5 Nuxt

Nuxt is the Vue equivalent of Next.js and the right choice for Vue teams. It shipped 70 KB of JavaScript in our test, about half of Next.js, and scored 100 for performance with 48 ms of TBT.
useSeoMeta sets meta tags "as a flat object with full TypeScript support." Sitemaps, robots.txt, structured data and OG images come from Nuxt SEO, a community toolkit that installs as one module.

Nuxt sits fifth because of the field numbers. Only 28.6% of 94,069 Nuxt origins passed Core Web Vitals on mobile in August 2026, lower than Next.js. Our lab result shows the framework itself is not heavy, so plugins, images and third-party scripts on real sites likely explain much of the gap.
- Best for: Vue teams that want SSR and SEO tags with little setup.
- Where it struggles: Low mobile pass rates across real Nuxt sites.
- SEO tooling: useSeoMeta, useHead, and the Nuxt SEO module for sitemaps and schema.
Frameworks that missed the cut
React Router, Angular and a plain client-rendered React app also went through the test. None made the top five.

React Router 8.4 (the framework that absorbed Remix) passed every raw HTML check with prerendering and scored 99. It shipped 114 KB of JavaScript, and its real sites had the weakest trend here: mobile pass rates fell from 25.6% to 24.3% over the year.
Angular 22.2 passed too, but only after we turned on server rendering with the --ssr flag. The Angular SSR guide warns that client-side rendering "may negatively affect search engine optimization (SEO)." Angular had the lowest field score of the frameworks we looked up: 16.4% of mobile origins passing.
A React single-page app built with Vite sent a 278-byte HTML shell. Everything else arrived by JavaScript.
- Title tag reads "App"
- No meta description or canonical
- No JSON-LD
- Empty div, 0 paragraphs
- 278 bytes
- Title tag is the article title
- Description and canonical present
- Article JSON-LD present
- All 10 paragraphs present
- 3,611 bytes
Why the first HTML response matters
Google does run JavaScript, but later. A Vercel and MERJ study of over 100,000 Googlebot fetches on nextjs.org found that 100% of HTML pages were fully rendered. The median page waited 10 seconds in the render queue, the 75th percentile 26 seconds, and the 90th percentile about 3 hours.
Google's JavaScript SEO basics page still recommends server rendering: "server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript." Its dynamic rendering page calls the old bot-only workaround "not a recommended solution."
AI crawlers are the bigger gap. Vercel's AI crawler analysis found that "none of the major AI crawlers currently render JavaScript" in December 2024. GPTBot made 569 million requests on Vercel's network in a month and Claude 370 million. Both fetched JavaScript files but did not execute them. Gemini and AppleBot were the exceptions.
Rules in robots.txt can block these bots before rendering even matters. Our study of AI crawler blocking in Southeast Asia measures how many sites block them in robots.txt.
How to check what your framework sends
You can run the same check on any live page in under five minutes.
- 1View sourceOpen view-source: on the URL, not DevTools Elements
- 2Find the titleSearch the source for your page title and H1
- 3Find the textSearch for a sentence from the last paragraph
- 4Find the tagsLook for canonical, description and ld+json
- 5Run LighthouseOnly after the raw HTML passes
If the title or the article text is missing from view-source, a search engine has to render the page to see it. Most AI crawlers will not.
Structured data is a common miss: our structured data adoption study covers what sites in the region publish. For a wider checklist, see our SEO and AEO principles for front-end developers and the head-to-head of Nuxt vs Next.js vs Astro for SEO.
The per-framework results, including every raw HTML check, Lighthouse metric and the HTTP Archive field figures, are in best-javascript-frameworks-for-seo.csv. The test method and caveats are in the summary JSON.
Hire a technical SEO freelancer to audit your framework
I co-founded Seotal and lead its SEO and GEO work. Crawler access is part of how we screen specialists: AEO/GEO candidates audit a live site for AI crawler access, schema errors and citations before they join.
Hire SEO freelancers from $15 an hour with profiles in 72 hours, or first read what a technical SEO freelancer covers. For AI search visibility, see our AEO/GEO specialists.
JavaScript frameworks for SEO: frequently asked questions
Is React bad for SEO?
No. React rendered on the server, as Next.js and React Router do, sends complete HTML. The risk is a client-only React app, which sends an empty shell until JavaScript runs.
Does Google index JavaScript content?
Google renders pages in headless Chromium after a queue, so it indexes content that JavaScript adds. It arrives later, and most AI crawlers will not see it.
Should I migrate my site to Astro for SEO?
Only if the current site fails the view-source check or its field Core Web Vitals. A Next.js or Nuxt site that sends full HTML and passes Core Web Vitals has no SEO reason to move.
What about Gatsby?
We did not test Gatsby. In the August 2026 HTTP Archive data, 45.3% of 9,545 Gatsby origins passed Core Web Vitals on mobile, down from 12,418 origins a year earlier.
![5 Best JavaScript Frameworks for SEO [2026 Research + Tested]](/assets/blog/best-javascript-frameworks-for-seo-cover.png)
Nuxt.js vs Next.js vs Astro for SEO in 2026
Top 10 SEO Agencies in Singapore (2026)
Vietnamese SEO: Cốc Cốc, Diacritics and Keyword Research