Comprehensive usage examples for common SvelteKit patterns.
// src/hooks.server.ts
import type { Handle } from '@sveltejs/kit';
export const handle: Handle = async ({ event, resolve }) => {
const session = event.cookies.get('session');
if (session) {
event.locals.user = await validateSession(session);
}
return resolve(event);
};// src/routes/dashboard/+page.server.ts
import { error, redirect } from '@sveltejs/kit';
export async function load({ locals }) {
if (!locals.user) {
redirect(307, '/login');
}
return {
user: locals.user,
dashboard: await getDashboardData(locals.user.id)
};
}// src/routes/login/+page.server.ts
import { fail, redirect } from '@sveltejs/kit';
export const actions = {
default: async ({ request, cookies }) => {
const data = await request.formData();
const email = data.get('email');
const password = data.get('password');
const user = await authenticate(email, password);
if (!user) {
return fail(401, { email, incorrect: true });
}
cookies.set('session', user.sessionId, {
path: '/',
httpOnly: true,
secure: true,
sameSite: 'strict',
maxAge: 60 * 60 * 24 * 7 // 1 week
});
redirect(303, '/dashboard');
}
};// src/routes/blog/[slug]/+page.server.ts
export async function load({ params, fetch }) {
// Load in parallel
const [post, comments, related] = await Promise.all([
fetch(`/api/posts/${params.slug}`).then(r => r.json()),
fetch(`/api/posts/${params.slug}/comments`).then(r => r.json()),
fetch(`/api/posts/${params.slug}/related`).then(r => r.json())
]);
return { post, comments, related };
}// src/routes/user/[id]/+page.server.ts
export async function load({ params, fetch }) {
const user = await fetch(`/api/users/${params.id}`).then(r => r.json());
// Load user's posts after getting user
const posts = await fetch(`/api/users/${params.id}/posts`).then(r => r.json());
return { user, posts };
}// src/routes/+layout.server.ts
export async function load({ locals }) {
return {
user: locals.user,
theme: locals.theme
};
}
// src/routes/dashboard/+page.server.ts
export async function load({ parent, fetch }) {
const { user } = await parent();
const data = await fetch(`/api/users/${user.id}/dashboard`).then(r => r.json());
return { data };
}// src/routes/signup/+page.server.ts
export const actions = {
step1: async ({ request }) => {
const data = await request.formData();
// Validate step 1
return { step: 2, data: Object.fromEntries(data) };
},
step2: async ({ request }) => {
const data = await request.formData();
// Validate step 2
return { step: 3, data: Object.fromEntries(data) };
},
complete: async ({ request, cookies }) => {
const data = await request.formData();
const user = await createUser(data);
cookies.set('session', user.sessionId, { path: '/' });
redirect(303, '/dashboard');
}
};// src/routes/upload/+page.server.ts
import { fail } from '@sveltejs/kit';
export const actions = {
upload: async ({ request }) => {
const data = await request.formData();
const file = data.get('file') as File;
if (!file || file.size === 0) {
return fail(400, { error: 'No file provided' });
}
if (file.size > 10 * 1024 * 1024) {
return fail(400, { error: 'File too large' });
}
const url = await uploadFile(file);
return { success: true, url };
}
};// src/routes/api/posts/+server.ts
import { json, error } from '@sveltejs/kit';
export async function GET({ url }) {
const posts = await getPosts(url.searchParams);
return json(posts);
}
export async function POST({ request }) {
const data = await request.json();
const post = await createPost(data);
return json(post, { status: 201 });
}// src/routes/api/posts/[id]/+server.ts
import { json, error } from '@sveltejs/kit';
export async function GET({ params }) {
const post = await getPost(params.id);
if (!post) error(404, 'Post not found');
return json(post);
}
export async function PUT({ params, request }) {
const data = await request.json();
const post = await updatePost(params.id, data);
return json(post);
}
export async function DELETE({ params }) {
await deletePost(params.id);
return new Response(null, { status: 204 });
}<!-- src/routes/+error.svelte -->
<script>
import { page } from '$app/stores';
</script>
<h1>{$page.status}</h1>
<p>{$page.error?.message}</p>// src/hooks.server.ts
import type { HandleServerError } from '@sveltejs/kit';
export const handleError: HandleServerError = ({ error, event, status, message }) => {
console.error('Server error:', error);
return {
message: 'An error occurred',
code: status
};
};import { goto, invalidate } from '$app/navigation';
// Navigate with state
await goto('/dashboard', {
state: { from: 'login' },
replaceState: true
});
// Invalidate data after mutation
async function deletePost(id: string) {
await fetch(`/api/posts/${id}`, { method: 'DELETE' });
await invalidate('/api/posts');
await goto('/posts');
}<script>
import { preloadData } from '$app/navigation';
</script>
<a
href="/slow-page"
on:mouseenter={() => preloadData('/slow-page')}
>
Hover to preload
</a><script>
import { page } from '$app/state';
import { pushState } from '$app/navigation';
function openModal() {
pushState('/modal', { modal: true });
}
</script>
{#if $page.state.modal}
<div class="modal">
<!-- Modal content -->
</div>
{/if}