Vite is genuinely great. Fast builds, hot module replacement, clean config. There's just one problem: the default Vite output is a pure client-side SPA. And client-side SPAs are essentially invisible to search engines.

What Vite actually produces

When you run vite build, you get a dist/ folder with an index.html that looks like this:

<!DOCTYPE html>
<html>
  <head>
    <title>My Vite App</title>
    <script type="module" src="/assets/index-abc.js"></script>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

Search engine crawlers fetch this, see an empty div, and have nothing to index.

Vite SSR — the solution that nobody actually uses

Vite does have SSR support, but setting it up properly requires a custom server, streaming, hydration, and data loading patterns. For most projects built with plain Vite, this isn't realistic.

The prerendering service approach (what actually works)

The simplest solution for an existing Vite app is adding a prerendering service at the server/CDN level. The service intercepts crawler requests and serves a fully rendered HTML snapshot instead of your empty index.html.

The time math: Setting up proper SSR for an existing Vite app: 2–5 days. Setting up renderit.now prerendering: 5 minutes.

Step-by-step: adding prerendering to your Vite app

  1. Sign up for renderit.now and grab your API key
  2. Add the renderit proxy backend to your LiteSpeed or Nginx config (copy-paste from our Integration guide)
  3. Test with curl -A "Googlebot/2.1" https://yoursite.com
  4. See your full HTML — done

Ready to stop being invisible?

Renderit.now makes your React app crawlable in minutes. Plans from $28/month.

Fix my SEO now →