---
title: "Discussion on \"SEO for a React SPA without Next.js, and without giving up the 3D homepage\" | Hashnode"
description: "Discussion on \"SEO for a React SPA without Next.js, and without giving up the 3D homepage\". Making a Vite + React SPA indexable without Next.js: build-time renderToString, a Vercel function for blog SSR, JSON-LD and a sitemap."
url: "https://hashnode.com/posts/seo-for-a-react-spa-without-next-js-and-without-giving-up-the-3d-homepage/6aed656b2bd71b0c43af1e1e"
---

[Feed](https://hashnode.com/feed) /

Discussion

# [SEO for a React SPA without Next.js, and without giving up the 3D homepage](https://mahmadmanzoor.hashnode.dev/seo-for-a-react-spa-without-next-js-and-without-giving-up-the-3d-homepage?utm_source=hashnode&utm_medium=feed)

Making a Vite + React SPA indexable without Next.js: build-time renderToString, a Vercel function for blog SSR, JSON-LD and a sitemap.

5d ago · 8 min read · mahmadmanzoor.hashnode.dev  
Read the article

-   [#seo](https://hashnode.com/tag/seo)
-   [#reactjs](https://hashnode.com/tag/reactjs)
-   [#vite](https://hashnode.com/tag/vite)
-   [#vercel](https://hashnode.com/tag/vercel)

## Written by

[Muhammad Ahmad](https://hashnode.com/@mahmadmanzoor)

@mahmadmanzoor · Lahore, Pakistan

  
[View profile](https://hashnode.com/@mahmadmanzoor)

AI Product Engineer @ RipeSeed. Shipping LLM features, agents and evals in production.

## Responses 1

Markdown supported · ⌘↵ to post

[Tarun Sharma](https://hashnode.com/@101beardo)

[4h ago](https://hashnode.com/posts/seo-for-a-react-spa-without-next-js-and-without-giving-up-the-3d-homepage/6aed656b2bd71b0c43af1e1e/comment/6af47b97852156dd7695a854)

The third argument of useSyncExternalStore as the server snapshot is a neat way to avoid pulling in a router for the prerender. One thing to double check is hydration: since that snapshot is also used while hydrating, the client should only hydrate the prerendered /classic markup, and mount the 3D route with a plain createRoot because its root is empty. Otherwise a hard load on another path can briefly render the Classic view first.
