SvelteKit supports SSR out of the box. Pages render on the server first — better SEO, faster initial paint, and data available before JavaScript loads.
SSR (Server-Side Rendering): HTML generated on each request. Fresh data every time. Good for personalized or frequently updated content.
SSG (Static Site Generation): HTML generated at build time. Blazing fast. Good for content that rarely changes — docs, blogs, marketing pages.
CSR (Client-Side Rendering): HTML built in the browser after JavaScript loads. Slower initial paint, no SEO. Good for dashboards behind login.
// Default: SSR (runs on server per request)
export async function load({ fetch }) { ... }
// Static: SSG (pre-rendered at build time)
export const prerender = true;
// Client-only: CSR (skip server entirely)
export const ssr = false;SvelteKit form actions let you handle form submissions on the server — no JavaScript required. They work even with JS disabled.
import { fail, redirect } from '@sveltejs/kit';
export const actions = {
default: async ({ request }) => {
const data = await request.formData();
const name = data.get('name');
const email = data.get('email');
if (!name || !email) {
return fail(400, { name, email, missing: true });
}
// Save to DB, send email, etc.
await saveContact({ name, email });
throw redirect(303, '/contact/thanks');
}
};
export const prerender = true on your blog listing page. Run npm run build and confirm it generates static HTML./contact route with a form action that validates name and email server-side.form prop./contact/thanks page.$app/environment store to show different content in dev vs prod.prerender = true generates static HTML at build time — zero server needed at runtime.ssr = false skips server rendering — use for dashboards with user-specific data.+page.server.js handle submissions on the server, working without JavaScript.fail(status, data) returns validation errors back to the form. redirect() sends the user elsewhere.