Skip to main content
Server-side rendering (SSR) enables rendering your application on the server, sending fully-rendered HTML to the client for faster initial page loads and better SEO.

SSR setup

1

Install SSR packages

For React Router with SSR:
2

Configure for SSR

Create separate client and server entry points:
src/entry-client.tsx
src/entry-server.tsx
3

Create HTML template

Using TanStack Start

For the easiest SSR setup, use TanStack Start:
app.config.ts
src/routes/__root.tsx

Server-side data loading

Loaders run on the server during SSR:
src/routes/posts/$postId.tsx

Hydration

Dehydrate server state and rehydrate on client:
src/entry-server.tsx
src/entry-client.tsx

Client-only components

Render components only on the client:

Detecting SSR

Check if code is running on server:

Streaming SSR

Stream HTML as it’s generated:
src/entry-server.tsx

SEO and meta tags

Set meta tags from routes:

Environment variables

Access env vars safely:

Error handling in SSR

Handle errors during server rendering:

Deferred data in SSR

Stream deferred data after initial render:

Static generation

Pre-render routes at build time:
build.ts

Best practices

Use loaders for data needed for initial render to ensure it’s available during SSR.
Wrap code that uses window, document, or other browser APIs in ClientOnly.
Keep server-only code separate and use tree-shaking to reduce bundle size.
Implement caching strategies for frequently-accessed pages.
Stream HTML as it’s generated for faster time-to-first-byte.

Performance tips

Preload critical routes: Preload routes users are likely to visit next.
Use deferred data: Defer non-critical data to improve initial page load.
Avoid heavy computations in loaders - cache results or move to background jobs.

Next steps

TanStack Start

Full-stack framework with SSR

Data loading

Optimize server data fetching