A technical SEO checklist for JavaScript-heavy sites
A JavaScript SEO checklist for React, Vue, Svelte and Next.js sites: rendering, indexing, Core Web Vitals, internal links and AI crawler access, with fixes.

Key takeaways
- Ship primary content, titles and meta tags in the initial HTML, not after hydration.
- Client-side routers must return real 404s and self-referencing canonicals.
- Measure Core Web Vitals on mobile with field data, and fix LCP and INP first.
- Allow AI crawlers and publish llms.txt; they read HTML, not your JavaScript bundle.
JavaScript frameworks are excellent for product teams and frequently hostile to crawlers. The good news is that most SEO problems on React, Vue, Svelte and Next.js sites fall into a short list of checks: rendering, indexing, performance, links and crawler access. Work through the list below in order; each item includes the symptom, the check and the fix.
Rendering
Primary content is in the initial HTML
Check: view the raw page source, not the inspector. Titles, meta descriptions, headings and body copy should be present. Fix: enable server-side rendering or static prerendering. SvelteKit, Next.js, Nuxt and Astro all support it; the site you are reading is fully prerendered.
Google's rendered view matches the user's
Check: Search Console's URL Inspection tool, "View crawled page". Fix: remove content that depends on user interaction, scroll or client-side fetches that run after load.
No content behind hydration errors
Check: browser console on production for hydration warnings. Fix: make server and client output identical; mismatches can wipe rendered content.
Indexing
Correct status codes
Check: a missing route should return 404, not a 200 with a "not found" component. Fix: configure the framework to return real status codes; in SvelteKit use the error helper, in Next.js the notFound function.
Self-referencing canonicals
Check: every indexable page carries a canonical tag pointing to its own clean URL with a consistent trailing-slash policy. Fix: generate canonicals from the route, not from the request URL, so parameters never leak in.
Parameters and facets are controlled
Check: crawl the site and count unique URLs versus intended pages. Fix: canonicalise or block filter and sort parameters; keep faceted URLs out of the sitemap.
The XML sitemap tells the truth
Check: it lists only indexable 200 pages and lastmod reflects real changes. Fix: generate it at build time from your content source, never from a build timestamp.
Performance
Core Web Vitals on mobile
Check: field data in Search Console and PageSpeed Insights. Targets: LCP under 2.5 seconds, INP under 200 milliseconds, CLS under 0.1. Fix: preload the hero image and set explicit dimensions, self-host fonts with a fallback stack, defer third-party scripts, and split bundles so the first route ships only what it needs.
Hydration cost
Check: total JavaScript on the landing page. Fix: reduce client components, lazy-load below-the-fold interactivity, and prefer islands or partial hydration where the framework supports it.
Links and structure
Real anchor elements
Check: navigation and pagination use anchor tags with href attributes. Fix: replace click-handler navigation with links; crawlers do not click buttons.
Reachable within three clicks
Check: crawl depth report. Fix: add hub pages, footer links and related-content modules for important pages that sit too deep.
Consistent internal URLs
Check: internal links never point at redirecting or non-canonical variants. Fix: centralise URL generation in one helper.
Structured data
Emit JSON-LD in the server-rendered HTML for Organization, BreadcrumbList and the page type (Article, Service, FAQPage). Validate with the Rich Results Test. Our schema generator produces the blocks.
AI crawlers
Allow the crawlers you want
Check: robots.txt for GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot and Google-Extended. Fix: allow them explicitly unless there is a business reason not to; they read HTML only, which is another argument for server rendering.
Publish llms.txt
A plain-text file at the root summarising your key pages and what they are about helps assistants understand the site quickly.
Framework notes
Next.js
Use the App Router with server components for content pages, generateMetadata for titles and canonicals, and the notFound helper for missing routes. Avoid fetching primary content in useEffect.
SvelteKit
Set prerender to true for marketing pages, use the error helper for 404s, and keep trailingSlash consistent across the site so canonicals and sitemap entries match.
Nuxt and Vue
Prefer server-side rendering or Nuxt's static generation. Watch for content that only renders after onMounted.
Single-page apps without a meta-framework
Add a prerendering step at build time, or a rendering service in front of the app. Confirm that every route, including deep links, returns full HTML.
Monitoring
Add an automated crawl to your deployment pipeline that fails on missing titles, canonical changes, new noindex tags or status code regressions. Most technical SEO damage on JavaScript sites happens silently during a release.
If any of this is unclear on your site, our technical SEO service starts with exactly these checks, and a free audit will flag the biggest issues within 48 hours.
Frequently asked questions
Can Google render JavaScript?
Yes, but rendering is queued and resource-limited, and other search engines and AI crawlers render far less. Server-side rendering or prerendering removes the dependency.
Do AI crawlers execute JavaScript?
Most do not. GPTBot, ClaudeBot and PerplexityBot read the HTML response. Content that only exists after client-side rendering is invisible to them.
Is a single-page application bad for SEO?
Not if it is server-rendered or prerendered, returns correct status codes and uses real links. The framework is not the problem; the rendering strategy is.
Written by
AI SEO Growth Agency
Senior SEO and AI search strategists who run growth programmes for SaaS, ecommerce and professional services brands. We publish what we learn from client work every week.
About the team

