SvelteKit Server-Side Rendering: Complete Guide to SSR, CSR, and Prerendering
SvelteKit Server-Side Rendering: Complete Guide to SSR, CSR, and Prerendering
// src/routes/products/+page.server.ts
export async function load({ fetch }) {
const response = await fetch('/api/products');
const products = await response.json();
return { products };
}<!-- src/routes/products/+page.svelte -->
<script>
export let data;
</script>
{#each data.products as product}
<div class="card">
<h2>{product.name}</h2>
<p>{product.price}</p>
</div>
{/each}// src/routes/about/+page.ts
export const prerender = true;// svelte.config.js
const config = {
kit: {
prerender: {
entries: ['*']
}
}
};// src/routes/dashboard/+page.ts
export const ssr = false;// src/routes/feed/+page.server.ts
export async function load({ fetch }) {
return {
quickData: await fetch('/api/quick').then(r => r.json()),
slowData: fetch('/api/slow').then(r => r.json()) // not awaited = streamed
};
}<!-- +page.svelte -->
<script>
export let data;
</script>
<h1>Feed</h1>
<p>{data.quickData.title}</p>
{#await data.slowData}
<p>Loading more content...</p>
{:then slowContent}
<p>{slowContent.body}</p>
{/await}SvelteKit offers flexible rendering strategies that let you choose between SSR, CSR, and prerendering on a per-page basis. This thread breaks down each approach with practical examples.
Understanding Rendering Modes in SvelteKit
SvelteKit supports three rendering modes:
1. Server-Side Rendering (SSR) - HTML generated on the server for each request
2. Client-Side Rendering (CSR) - HTML generated in the browser using JavaScript
3. Prerendering - HTML generated at build time as static files
Server-Side Rendering (SSR)
SSR is the default in SvelteKit. When a user requests a page, the server runs your Svelte component and sends back fully rendered HTML.
// src/routes/products/+page.server.ts
export async function load({ fetch }) {
const response = await fetch('/api/products');
const products = await response.json();
return { products };
}<!-- src/routes/products/+page.svelte -->
<script>
export let data;
</script>
{#each data.products as product}
<div class="card">
<h2>{product.name}</h2>
<p>{product.price}</p>
</div>
{/each}// src/routes/about/+page.ts
export const prerender = true;// svelte.config.js
const config = {
kit: {
prerender: {
entries: ['*']
}
}
};// src/routes/dashboard/+page.ts
export const ssr = false;// src/routes/feed/+page.server.ts
export async function load({ fetch }) {
return {
quickData: await fetch('/api/quick').then(r => r.json()),
slowData: fetch('/api/slow').then(r => r.json()) // not awaited = streamed
};
}<!-- +page.svelte -->
<script>
export let data;
</script>
<h1>Feed</h1>
<p>{data.quickData.title}</p>
{#await data.slowData}
<p>Loading more content...</p>
{:then slowContent}
<p>{slowContent.body}</p>
{/await}