Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Nuxt 3.x reference covering SSR, file-based routing, auto-imports, server routes, and Nitro deployment.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/rendering-modes.md
1---2name: rendering-modes3description: Universal rendering, client-side rendering, and hybrid rendering in Nuxt4---56# Rendering Modes78Nuxt supports multiple rendering modes: universal (SSR), client-side (CSR), and hybrid rendering.910## Universal Rendering (Default)1112Server renders HTML, then hydrates on client:1314```ts15// nuxt.config.ts - this is the default16export default defineNuxtConfig({17ssr: true,18})19```2021**Benefits:**22- Fast initial page load (HTML is ready)23- SEO-friendly (content is in HTML)24- Works without JavaScript initially2526**How it works:**271. Server executes Vue code, generates HTML282. Browser displays HTML immediately293. JavaScript loads and hydrates the page304. Page becomes fully interactive3132## Client-Side Rendering3334Render entirely in the browser:3536```ts37// nuxt.config.ts38export default defineNuxtConfig({39ssr: false,40})41```4243**Benefits:**44- Simpler development (no SSR constraints)45- Cheaper hosting (static files only)46- Works offline4748**Use cases:**49- Admin dashboards50- SaaS applications51- Apps behind authentication5253### SPA Loading Template5455Provide loading UI while app hydrates:5657```html58<!-- app/spa-loading-template.html -->59<div class="loading">60<div class="spinner"></div>61<p>Loading...</p>62</div>6364<style>65.loading {66display: flex;67flex-direction: column;68align-items: center;69justify-content: center;70height: 100vh;71}72.spinner {73width: 40px;74height: 40px;75border: 4px solid #f3f3f3;76border-top: 4px solid #00dc82;77border-radius: 50%;78animation: spin 1s linear infinite;79}80@keyframes spin {81to { transform: rotate(360deg); }82}83</style>84```8586## Hybrid Rendering8788Mix rendering modes per route using route rules:8990```ts91// nuxt.config.ts92export default defineNuxtConfig({93routeRules: {94// Static pages - prerendered at build95'/': { prerender: true },96'/about': { prerender: true },9798// ISR - regenerate in background99'/blog/**': { isr: 3600 }, // Cache for 1 hour100'/products/**': { swr: true }, // Stale-while-revalidate101102// Client-only rendering103'/admin/**': { ssr: false },104'/dashboard/**': { ssr: false },105106// Server-rendered (default)107'/api/**': { cors: true },108},109})110```111112### Route Rules Reference113114| Rule | Description |115|------|-------------|116| `prerender: true` | Pre-render at build time |117| `ssr: false` | Client-side only |118| `swr: number \| true` | Stale-while-revalidate caching |119| `isr: number \| true` | Incremental static regeneration |120| `cache: { maxAge: number }` | Cache with TTL |121| `redirect: string` | Redirect to another path |122| `cors: true` | Add CORS headers |123| `headers: object` | Custom response headers |124125### Inline Route Rules126127Define per-page:128129```vue130<script setup lang="ts">131defineRouteRules({132prerender: true,133})134</script>135```136137## Prerendering138139Generate static HTML at build time:140141```ts142// nuxt.config.ts143export default defineNuxtConfig({144// Prerender specific routes145routeRules: {146'/': { prerender: true },147'/about': { prerender: true },148'/posts/*': { prerender: true },149},150})151```152153Or use `nuxt generate`:154155```bash156nuxt generate157```158159### Programmatic Prerendering160161```ts162// nuxt.config.ts163export default defineNuxtConfig({164hooks: {165'prerender:routes'({ routes }) {166// Add dynamic routes167const posts = await fetchPostSlugs()168for (const slug of posts) {169routes.add(`/posts/${slug}`)170}171},172},173})174```175176Or in pages:177178```ts179// server/api/posts.ts or a plugin180prerenderRoutes(['/posts/1', '/posts/2', '/posts/3'])181```182183## Edge-Side Rendering184185Render at CDN edge servers:186187```ts188// nuxt.config.ts189export default defineNuxtConfig({190nitro: {191preset: 'cloudflare-pages', // or 'vercel-edge', 'netlify-edge'192},193})194```195196Supported platforms:197- Cloudflare Pages/Workers198- Vercel Edge Functions199- Netlify Edge Functions200201## Conditional Rendering202203Use `import.meta.server` and `import.meta.client`:204205```vue206<script setup>207if (import.meta.server) {208// Server-only code209console.log('Running on server')210}211212if (import.meta.client) {213// Client-only code214console.log('Running in browser')215}216</script>217```218219For components:220221```vue222<template>223<ClientOnly>224<BrowserOnlyComponent />225<template #fallback>226<p>Loading...</p>227</template>228</ClientOnly>229</template>230```231232<!--233Source references:234- https://nuxt.com/docs/guide/concepts/rendering235- https://nuxt.com/docs/getting-started/prerendering236- https://nuxt.com/docs/api/nuxt-config#routerules237-->238