VITE SEO AUDIT · SPA · CLIENT-SIDE RENDERING · AI VISIBILITY

Free Vite SEO Audit

A default Vite SPA renders content client-side — Googlebot sees an empty HTML shell on first crawl and waits for JavaScript to run before indexing content. Meta tags set by React Helmet or vue-meta arrive too late. DeepSEOAnalysis audits Vite apps and surfaces exactly which pages have raw-HTML content gaps and how to fix them.

Audit my Vite app →How we score

WHAT WE CHECK

6 Vite-specific SEO checks

The audit distinguishes between raw HTML content (what Googlebot reads on first visit) and rendered DOM content (what appears after JavaScript runs) — the gap between these two determines your Vite app's SEO exposure.

⚠️

Client-side rendering SEO gaps

Vite's default output is a client-side rendered SPA — a nearly empty HTML shell with a `<div id="app"></div>` and JavaScript bundles that build the page in the browser. Googlebot does crawl JavaScript-rendered content, but in a two-wave process: first wave reads the raw HTML (the empty shell); second wave renders the JavaScript and reads the populated content, which can take hours to days. For pages where content freshness, rapid indexing, or competitive ranking are important, this delay is significant. The audit checks whether page content (H1, body text, internal links) is present in the raw HTML or only after JavaScript execution — flagging pure SPA rendering as a critical SEO gap for content-heavy pages.

🏷️

Meta tag injection timing

In a Vite SPA, page titles and meta descriptions are typically set by client-side libraries: `react-helmet-async`, `@vueuse/head`, or `vue-meta`. These run after JavaScript hydrates, meaning the raw HTML `<head>` contains only the default title from `index.html` — Googlebot's first-wave crawl sees the same generic title on every page. Fix options: (a) move to SSR or SSG so each page's HTML response includes the correct `<title>` and `<meta name="description">`; (b) use `vite-plugin-html` to inject page-specific metadata at build time for static routes; (c) use a framework like Nuxt, SvelteKit, or Remix that handles server-side metadata rendering. The audit checks whether title tags and meta descriptions are in the raw HTML or only in the rendered DOM.

🗺️

Sitemap configuration

Vite has no built-in sitemap generation. Options: `vite-plugin-sitemap` for static Vite apps (define routes in `vite.config.ts`, the plugin outputs `sitemap.xml` to `dist/`); a manually maintained `public/sitemap.xml` file (least automated, but works for any Vite setup); or the meta-framework's sitemap module (Nuxt `@nuxtjs/sitemap`, SvelteKit `vite-plugin-sitemap`). Common gaps: the sitemap only includes static routes but misses dynamic routes (blog posts, product pages) that require fetching from an API or CMS at build time; the sitemap isn't referenced in `public/robots.txt` via a `Sitemap:` directive. The audit checks sitemap presence, page coverage, and Sitemap directive in robots.txt.

🤖

robots.txt in public/

Vite serves static files from the `public/` directory at the URL root. A `public/robots.txt` file is served at `/robots.txt`. If no robots.txt exists in `public/`, Vite's dev server and built app have no robots.txt — Googlebot defaults to allow all crawling. Common gaps after creating one: no `Sitemap:` directive pointing to the sitemap URL, no disallow for development or utility paths, or AI crawlers accidentally blocked. Common SPA-specific issue: SPA apps often have routes that produce the same HTML shell regardless of URL (the JS router handles 404s by rendering the app) — without a robots.txt disallowing hash-based or utility routes, these empty-shell URLs may be crawled and contribute to index bloat. The audit checks all major AI crawler user-agents and flags any that are blocked.

🚀

SSR and SSG upgrade paths

The SEO-optimal move for a Vite SPA that competes in search is to add server-side rendering (SSR) or static site generation (SSG). Options without changing the framework: `Vike` (formerly vite-plugin-ssr) adds SSR/SSG to any Vite+React/Vue/Svelte app with minimal migration. Options by migrating to a Vite-powered meta-framework: React → Remix or TanStack Start; Vue → Nuxt; Svelte → SvelteKit. For pure marketing/content pages, SSG (pre-rendering at build time) is sufficient and avoids server runtime costs. For dynamic content (user-specific, real-time), SSR with appropriate caching is needed. The audit identifies which pages are client-rendered and which have server-rendered HTML, and quantifies the content coverage gap in the raw HTML for each client-rendered page.

🧠

AI visibility for Vite apps

AI visibility setup for a Vite app: `public/llms.txt` in the `public/` directory (served at `/llms.txt` automatically); FAQPage JSON-LD as a React component (`<FaqSchema items={faqs} />`), Vue component, or inline `<script type="application/ld+json">` in the component's rendered HTML — but it must be server-rendered (SSR/SSG) to be picked up by crawlers that don't execute JavaScript. If the app is a pure SPA, JSON-LD embedded via Helmet or vue-meta may not be seen by AI crawlers. `public/robots.txt` must explicitly allow GPTBot, ClaudeBot, and PerplexityBot. The audit checks all five GEO signals and specifically flags structured data that's only present in the rendered DOM (not raw HTML) as a risk for AI crawler visibility.

HOW IT WORKS

Audit your Vite app in 60 seconds

  1. Enter your Vite app URL. Works with any Vite deployment: Vercel, Netlify, Cloudflare Pages, AWS Amplify, GitHub Pages, or custom server. The audit crawls the live site and tests both raw HTML and rendered DOM responses per page.
  2. We crawl and analyse both rendering layers. The engine crawls up to 50 pages (free), checking raw HTML for content, title, and meta — then comparing against the rendered DOM. Pages where titles, H1s, or body content are absent from raw HTML are flagged with specific rendering-gap severity scores.
  3. You get a prioritised report. Rendering gaps and their SSR/SSG fix options first — then sitemap config, robots.txt, AI visibility signals, and Core Web Vitals — each with the specific Vite plugin, framework migration path, or public/ file change to implement.

FAQ

Questions about the Vite SEO audit

Does DeepSEOAnalysis detect Vite-specific SEO issues?

Yes. The engine detects Vite app signatures — client-side rendered SPAs, React/Vue/Svelte component meta tag injection, and the public/ directory structure — and surfaces framework-specific guidance alongside the 80+ general checks.

Is a Vite SPA good for SEO?

A default Vite SPA (client-side rendering only) has significant SEO challenges: Googlebot has to execute JavaScript to see any page content, and meta tags set via React Helmet or vue-meta are only applied after JavaScript runs. Google does crawl JavaScript-rendered content, but there is a two-wave rendering delay (hours to days between first crawl and JS-rendered index). For content-heavy sites competing in search, SSR or SSG is strongly recommended. Vite supports both via vite-plugin-ssr (now Vike), or by using a framework built on Vite — Nuxt (Vue), SvelteKit (Svelte), or Remix (React) — which add server-side rendering or static generation.

How do I add a sitemap to a Vite app?

For static Vite sites: `vite-plugin-sitemap` generates an XML sitemap at build time from your route list. For SSR/SSG Vite apps via a meta-framework (Nuxt, SvelteKit), use the framework's built-in sitemap module. For SPAs without SSR, a sitemap can be manually created and placed in `public/sitemap.xml` — update it whenever routes change. The audit checks sitemap presence, page coverage, and the Sitemap directive in `public/robots.txt`.

Is the Vite SEO audit free?

Yes. The complete audit is free with no signup and no email gate. Paid plans add saved history, scheduled monitoring, larger crawls (up to 1,000 pages), and agency workflows.