---
name: rendering-modes
description: Universal rendering, client-side rendering, and hybrid rendering in Nuxt
---
# Rendering Modes
Nuxt supports multiple rendering modes: universal (SSR), client-side (CSR), and hybrid rendering.
## Universal Rendering (Default)
Server renders HTML, then hydrates on client:
```ts
// nuxt.config.ts - this is the default
export default defineNuxtConfig({
ssr: true,
})
```
**Benefits:**
- Fast initial page load (HTML is ready)
- SEO-friendly (content is in HTML)
- Works without JavaScript initially
**How it works:**
1. Server executes Vue code, generates HTML
2. Browser displays HTML immediately
3. JavaScript loads and hydrates the page
4. Page becomes fully interactive
## Client-Side Rendering
Render entirely in the browser:
```ts
// nuxt.config.ts
export default defineNuxtConfig({
ssr: false,
})
```
**Benefits:**
- Simpler development (no SSR constraints)
- Cheaper hosting (static files only)
- Works offline
**Use cases:**
- Admin dashboards
- SaaS applications
- Apps behind authentication
### SPA Loading Template
Provide loading UI while app hydrates:
```html
```
## Hybrid Rendering
Mix rendering modes per route using route rules:
```ts
// nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
// Static pages - prerendered at build
'/': { prerender: true },
'/about': { prerender: true },
// ISR - regenerate in background
'/blog/**': { isr: 3600 }, // Cache for 1 hour
'/products/**': { swr: true }, // Stale-while-revalidate
// Client-only rendering
'/admin/**': { ssr: false },
'/dashboard/**': { ssr: false },
// Server-rendered (default)
'/api/**': { cors: true },
},
})
```
### Route Rules Reference
| Rule | Description |
|------|-------------|
| `prerender: true` | Pre-render at build time |
| `ssr: false` | Client-side only |
| `swr: number \| true` | Stale-while-revalidate caching |
| `isr: number \| true` | Incremental static regeneration |
| `cache: { maxAge: number }` | Cache with TTL |
| `redirect: string` | Redirect to another path |
| `cors: true` | Add CORS headers |
| `headers: object` | Custom response headers |
### Inline Route Rules
Define per-page:
```vue
```
## Prerendering
Generate static HTML at build time:
```ts
// nuxt.config.ts
export default defineNuxtConfig({
// Prerender specific routes
routeRules: {
'/': { prerender: true },
'/about': { prerender: true },
'/posts/*': { prerender: true },
},
})
```
Or use `nuxt generate`:
```bash
nuxt generate
```
### Programmatic Prerendering
```ts
// nuxt.config.ts
export default defineNuxtConfig({
hooks: {
'prerender:routes'({ routes }) {
// Add dynamic routes
const posts = await fetchPostSlugs()
for (const slug of posts) {
routes.add(`/posts/${slug}`)
}
},
},
})
```
Or in pages:
```ts
// server/api/posts.ts or a plugin
prerenderRoutes(['/posts/1', '/posts/2', '/posts/3'])
```
## Edge-Side Rendering
Render at CDN edge servers:
```ts
// nuxt.config.ts
export default defineNuxtConfig({
nitro: {
preset: 'cloudflare-pages', // or 'vercel-edge', 'netlify-edge'
},
})
```
Supported platforms:
- Cloudflare Pages/Workers
- Vercel Edge Functions
- Netlify Edge Functions
## Conditional Rendering
Use `import.meta.server` and `import.meta.client`:
```vue
```
For components:
```vue
Loading...
```