SvelteKit Fundamentals Tutorial 📚
Modulsmål 🎯
Efter denna modul har du:
- ✅ Gått igenom hela Part 3: Basic SvelteKit från den officiella tutorialen
- ✅ Befäst dina kunskaper om API endpoints, load functions och form actions
- ✅ Lärt dig layouts, routing och error handling
- ✅ Fått en solid grund för resten av kursen
Varför den officiella tutorialen nu? 🤔
Du har redan lärt dig grunderna praktiskt - API endpoints, load functions och form actions. Nu går vi igenom den officiella tutorialen för att:
- Befästa koncepten du lärt dig
- Fylla i luckor du kanske missade
- Se best practices från SvelteKit-teamet
- Lära dig nya features som vi inte hunnit täcka
Din uppgift 📝
Gå till SvelteKit Interactive Tutorial och genomför hela Part 3: Basic SvelteKit.
Checklista - Vad du ska klara av: ✅
Introduktion & Setup
- Introducing SvelteKit - Förstå vad SvelteKit är
- Your first route - Skapa din första route
- Routing - File-based routing system
Loading Data
- Loading data - Load functions (du kan detta redan!)
- Universal vs server - Skillnaden mellan universal och server-only load
- Using both - Kombinera server och universal load
Headers and cookies
- Setting headers - Sätta HTTP headers
- Reading and writing cookies - Cookies (du kan detta redan!)
Shared modules
- The $lib alias - Importera från
$lib
(du kan detta redan!)
Forms and data
- The
<form>
element - HTML forms - Named form actions - Form actions (du kan detta redan!)
- Validation - Validera form data
- Progressive enhancement -
use:enhance
(du kan detta redan!)
API routes
- GET handlers - Skapa API endpoints
- POST handlers - Hantera POST requests
- Other HTTP methods - PUT, DELETE, etc.
- Receiving data - Ta emot data i API routes
$app
- $app/environment - Runtime environment info
- $app/navigation - Programmatisk navigation
- $app/stores - SvelteKit stores
Errors and redirects
- Basics - Error handling grunderna
- Error pages - Custom error pages
- Redirects - Hantera redirects
Reflektion efter tutorialen 🤔
När du är klar, svara på dessa frågor för dig själv:
1. Vad var nytt för dig?
- Vilka koncept hade du inte sett innan?
- Vilka features verkar mest användbara?
2. Vad kändes bekant?
- Vilka delar kände du igen från tidigare moduler?
- Känner du dig mer säker på load functions och actions nu?
3. Vad vill du utforska mer?
- Vilka delar av tutorialen var mest intressanta?
- Vilka features vill du använda i kommande projekt?
Praktisk uppgift: Förbättra din Clicker 🔧
Efter tutorialen, gå tillbaka till din clicker-app från modul 3 och lägg till:
Error Handling
<!-- Lägg till i din +page.svelte -->
{#if formData?.error}
<div class="error">
❌ {formData.error}
</div>
{/if}
Loading States
<script>
import { enhance } from '$app/forms';
let isSubmitting = false;
</script>
<form
method="POST"
action="?/increment"
use:enhance={() => {
isSubmitting = true;
return async ({ result, update }) => {
await update();
isSubmitting = false;
};
}}
>
<button type="submit" disabled={isSubmitting}>
{isSubmitting ? '⏳ Klickar...' : '🚀 Klicka!'}
</button>
</form>
API Endpoint
Skapa src/routes/api/stats/+server.ts
:
import { json } from '@sveltejs/kit';
import { getAllUserCounts } from '$lib/store';
import type { RequestHandler } from './$types';
export const GET: RequestHandler = async () => {
const stats = getAllUserCounts();
return json({
totalUsers: stats.length,
totalClicks: stats.reduce((sum, user) => sum + user.count, 0),
topUser: stats[0] || null,
timestamp: new Date().toISOString()
});
};
Använd API:et i din app:
<script>
import { onMount } from 'svelte';
let stats = null;
onMount(async () => {
const response = await fetch('/api/stats');
stats = await response.json();
});
</script>
{#if stats}
<div class="global-stats">
<h3>📊 Global Statistik</h3>
<p>Totalt {stats.totalUsers} användare har klickat {stats.totalClicks} gånger!</p>
{#if stats.topUser}
<p>👑 Ledare: {stats.topUser.userId.slice(0,8)}... med {stats.topUser.count} klick</p>
{/if}
</div>
{/if}
Vanliga "Aha!"-moment från tutorialen 💡
Universal vs Server Load
// +page.server.ts - Körs ENDAST på servern
export const load = (async () => {
// Kan läsa databaser, filer, etc.
// Körs aldrig i browsern
}) satisfies PageServerLoad;
// +page.ts - Körs på både server OCH klient
export const load = (async () => {
// Kan köras i browsern efter navigation
// Ingen access till server-only APIs
}) satisfies PageLoad;
File-based Routing Magic
src/routes/
├── +layout.svelte # Layout för alla sidor
├── +page.svelte # Hemsida (/)
├── about/+page.svelte # Om-sida (/about)
├── blog/
│ ├── +page.svelte # Blogg-lista (/blog)
│ └── [slug]/+page.svelte # Blogg-post (/blog/mitt-inlagg)
└── api/
└── posts/+server.ts # API endpoint (/api/posts)
$app Stores Power
<script>
import { page } from '$app/stores';
import { goto } from '$app/navigation';
// Aktuell URL och params
$: currentPath = $page.url.pathname;
$: params = $page.params;
// Programmatisk navigation
function goHome() {
goto('/');
}
</script>
Nästa steg 🚀
Du är nu redo för Modul 4: Dynamisk Routing! Där bygger vi en forum-app med:
- Dynamiska routes med
[param]
- Nested routing
- Praktisk användning av allt du lärt dig
Pro-tips från tutorialen 🎓
- Layouts är kraftfulla - använd dem för gemensam UI
- API routes är perfekta för data som ska delas mellan appar
- Progressive enhancement gör dina appar robusta
- Error boundaries förhindrar att hela appen kraschar
- File-based routing är intuitivt när du väl förstår det
Resurser 📚
- SvelteKit Tutorial: learn.svelte.dev/tutorial/introducing-sveltekit
- SvelteKit Docs: kit.svelte.dev
- Svelte Discord: För frågor och community support