Svelte Framework

SvelteKit

SvelteKit ist das offizielle Application Framework von Svelte. Es ergänzt dateibasiertes Routing, serverseitige Load-Funktionen, Form Actions und Adapter für das Deployment auf beliebigen Plattformen.

intermediate14 min readUpdated 15. Sept. 2026
+page.server.js
js
// src/routes/blog/[slug]/+page.server.js
import { error } from "@sveltejs/kit";

export async function load({ params, fetch }) {
  const res = await fetch(`/api/posts/${params.slug}`);
  if (!res.ok) throw error(404, "Post not found");

  return { post: await res.json() };
}
Basiert auf
Svelte
Router
Dateibasiert (src/routes)
Daten
load functions
Mutationen
Form actions
Server
Node, serverless, edge
Deploy
Adapter für jedes Ziel

Warum es wichtig ist

Warum SvelteKit das Standard-Setup für Svelte ist

Routing ohne Konfiguration

Ordner und spezielle Dateien definieren Routen, Layouts, Ladezustände und Fehlerseiten, ohne dass eine Routing-Tabelle gepflegt werden muss.

Datenladen auf dem Server

Load-Funktionen laufen auf dem Server oder an der Edge, sodass Seiten bereits mit aufgelösten Daten beim Client ankommen.

Adapter für jeden Host

Ein einziger Build kann durch den Austausch eines Adapters Node, statisches Hosting, Vercel, Netlify, Cloudflare und mehr ansteuern.

Das Gesamtbild

Die drei Grundideen hinter SvelteKit

Dateien definieren Routen, Load-Funktionen holen Daten auf dem Server ab und Adapter verwandeln dieselbe App in jedes beliebige Deployment-Ziel.

Der Router

Navigation

+page, +layout und +server Dateien definieren Seiten, gemeinsame UI-Elemente und API-Endpunkte.

Load-Funktionen

Daten

Server- oder universelle Funktionen, die Daten abrufen, bevor eine Seite gerendert wird.

Adapter

Deployment

Der Build-Output wird an die Plattform angepasst, auf der du deployst.

SvelteKit auf einen Blick

Was SvelteKit zu Svelte hinzufügt

Dateibasierte Routen

src/routes bildet Ordner und Dateien auf URLs ab, einschließlich dynamischer Parameter.

Layouts

+layout Dateien umschließen Child-Routen und können für gemeinsame Shells verschachtelt werden.

Load-Funktionen

Daten vor dem Rendering abrufen, entweder auf dem Server oder im Browser.

Form Actions

Formularübermittlungen auf dem Server mit Progressive Enhancement verarbeiten.

API-Endpunkte

+server.js Dateien exportieren GET, POST und andere HTTP-Handler.

Hooks

Logik bei jeder Anfrage für Auth, Logging und Locals ausführen.

Eine kurze Geschichte

Von Sapper zum offiziellen Framework

  1. 2017

    Sapper

    Das erste Svelte Application Framework führt dateibasiertes Routing und SSR ein.

    17
  2. 2020

    SvelteKit angekündigt

    Der Nachfolger von Sapper wird rund um Adapter und Web-Standards konzipiert.

    20
  3. 2021

    Public Beta

    SvelteKit stabilisiert seine Routing-, Load- und Form-APIs.

    21
  4. 2022

    SvelteKit 1.0

    Ein stabiler Release wird zum empfohlenen Weg, Svelte-Apps zu bauen.

    22
  5. Heute

    Zusammen mit Svelte 5

    SvelteKit integriert Runes und bleibt das offizielle Application Framework.

    Heute

Der vollständige Leitfaden

SvelteKit: Alles was Sie wissen müssen

Was ist SvelteKit?

SvelteKit ist das offizielle Application Framework für Svelte. Während Svelte dir Komponenten und Reaktivität bietet, ergänzt SvelteKit dies um Routing, serverseitiges Datenladen, Formularverarbeitung, API-Endpunkte und Deployment-Adapter. Es ist der empfohlene Weg, um alles zu bauen, was über ein einfaches Widget hinausgeht, und harmoniert perfekt mit Svelte 5.

Wenn du bereits Next.js oder Nuxt verwendet hast, wird dir der Aufbau bekannt vorkommen. Der Unterschied liegt in einer starken Ausrichtung auf Webstandards: Formulare, Requests und Responses sind Plattform-Primitive, die SvelteKit erweitert, anstatt sie zu ersetzen.

Dateibasiertes Routing

Alles befindet sich in src/routes. Ordner werden zu URL-Segmenten und speziell benannte Dateien definieren das Verhalten.

src/routes/
├── +layout.svelte          # shared shell for all routes
├── +page.svelte            # /
├── about/+page.svelte      # /about
├── blog/
│   ├── +page.svelte        # /blog
│   └── [slug]/
│       ├── +page.svelte    # /blog/:slug
│       └── +page.server.js # data for that page
└── api/
    └── posts/+server.js    # GET/POST /api/posts

Das Präfix + kennzeichnet die speziellen Dateien von SvelteKit. +page.svelte rendert eine Seite, +layout.svelte umschließt Child-Routes, +page.server.js stellt server-only Daten bereit und +server.js definiert einen API-Endpunkt.

Load-Funktionen

Load-Funktionen rufen Daten ab, bevor eine Seite gerendert wird. Sie können auf dem Server, im Browser oder an beiden Orten ausgeführt werden.

// src/routes/posts/+page.server.js
export async function load({ fetch }) {
  const res = await fetch("/api/posts");
  if (!res.ok) throw error(500, "Failed to load posts");
  return { posts: await res.json() };
}
<!-- src/routes/posts/+page.svelte -->
<script>
  let { data } = $props();
</script>

<ul>
  {#each data.posts as post (post.id)}
    <li>{post.title}</li>
  {/each}
</ul>

Da die Daten vor dem Rendering aufgelöst werden, enthält der erste Paint bereits Inhalte. Verwenden Sie +page.server.js, wenn der Code Secrets oder eine Datenbank benötigt, und +page.js, wenn er an beiden Orten ausgeführt werden kann. Auch Layouts können Load-Funktionen haben, wobei Child-Loads die Daten des Parents erhalten.

Form actions

Formulare sind First-Class-Citizens. Eine form action wird auf dem Server ausgeführt und verarbeitet das Absenden, ohne dass ein clientseitiger fetch erforderlich ist.

// src/routes/posts/new/+page.server.js
export const actions = {
  default: async ({ request }) => {
    const data = await request.formData();
    const title = String(data.get("title") ?? "").trim();

    if (!title) {
      return { success: false, error: "Title is required" };
    }

    await db.post.create({ data: { title } });
    return { success: true };
  },
};
<!-- src/routes/posts/new/+page.svelte -->
<script>
  let { form } = $props();
</script>

<form method="POST">
  <input name="title" />
  {#if form?.error}<p class="error">{form.error}</p>{/if}
  <button>Create</button>
</form>

Das Formular funktioniert bereits, bevor JavaScript geladen wird, und SvelteKit optimiert es, sobald der Client bereit ist. Der Rückgabewert ist in der form prop der Seite verfügbar, wodurch die Implementierung von Validierungs-Feedback sehr einfach ist.

API-Endpunkte

Für JSON-APIs exportiert eine +server.js-Datei die HTTP-Handler.

// src/routes/api/posts/+server.js
import { json } from "@sveltejs/kit";

export async function GET() {
  const posts = await db.post.findMany();
  return json(posts);
}

export async function POST({ request }) {
  const body = await request.json();
  const post = await db.post.create({ data: body });
  return json(post, { status: 201 });
}

Dies sind gewöhnliche Web-Request- und Response-Objekte, sodass dasselbe Wissen auf andere Runtimes und Frameworks übertragbar ist.

Hooks

Eine hooks.server.js-Datei wird bei jeder Anfrage ausgeführt. Hier ist der richtige Ort für die Authentifizierung, das Logging und das Befüllen von event.locals.

// src/hooks.server.js
export async function handle({ event, resolve }) {
  const session = await getSession(event.cookies);
  event.locals.user = session?.user ?? null;

  return resolve(event);
}

Alles, was Sie in locals setzen, steht den Load-Funktionen und Actions zur Verfügung. So bleiben übergreifende Belange (Cross-Cutting Concerns) an einem zentralen Ort gebündelt, anstatt über die verschiedenen Routes verteilt zu sein.

Rendering und Adapter

SvelteKit unterstützt verschiedene Rendering-Strategien, die pro Route gewählt werden können:

  • SSR rendert auf dem Server und führt die Hydrierung im Browser durch.
  • Prerendering generiert statisches HTML während des Build-Prozesses.
  • CSR rendert nur im Browser für Routen, die sich gegen SSR entscheiden.
  • Hybrid kombiniert alle drei Ansätze, sodass beispielsweise eine Marketingseite statisch sein kann, während eine App-Route serverseitig gerendert wird.

Das Deployment wird über Adapter gesteuert. Installieren Sie den Adapter für Ihr Ziel – Node, static, Vercel, Netlify, Cloudflare und weitere –, konfigurieren Sie ihn, und derselbe Quellcode wird für diese Plattform gebaut. Ein Wechsel des Hosters ist in der Regel nur eine einzige Zeile Code.

Best Practices

  • Verwende +page.server.js load-Funktionen für Daten, die auf dem Server bleiben müssen.
  • Bevorzuge Form Actions gegenüber clientseitigen POST-Requests für Mutationen.
  • Halte Authentifizierung und Logging in hooks.server.js.
  • Wähle den jeweils schmalstmöglichen Rendering-Modus, der für die jeweilige Route passend ist.
  • Nutze +layout.svelte für gemeinsam verwendete UI-Elemente, damit der State über die Navigation hinweg erhalten bleibt.
  • Typisiere die Rückgabewerte deiner load-Funktionen, wenn du TypeScript verwendest.
  • Installiere von Anfang an einen Adapter, der zu deinem Deployment-Ziel passt.

Häufige Fehler

  • Fetching in onMount, wodurch das Server-Rendering verloren geht.
  • Platzieren von Secrets in einem universellen +page.js load anstatt in +page.server.js.
  • Neuerstellung von Formularen mit clientseitigem fetch, obwohl actions bereits funktionieren.
  • Fehlende Keys in {#each}-Blöcken, was zu Fehlern bei Listen-Updates führt.
  • Prerendering einer Route, die von benutzerspezifischen Daten abhängt.
  • Ignorieren von hooks und doppelte Implementierung von Auth-Checks in jeder load-Funktion.

Wie geht es weiter?

SvelteKit ist der vollständige Weg, um mit Svelte zu entwickeln. Vertiefe dein Svelte-Wissen, füge TypeScript hinzu und vergleiche die Architektur mit Next.js, Nuxt und Astro. Baue anschließend eine kleine App mit einer load-Funktion, einer Form Action und einem API-Endpunkt, um das gesamte Modell in Aktion zu erleben.

Daten laden

Eine Load-Funktion läuft vor dem Rendern der Seite auf dem Server. Das Laden in onMount passiert später und führt zu einem kurzen Aufblitzen leerer Inhalte.

Bevorzugt
// +page.js
export async function load({ fetch }) {
  const res = await fetch("/api/posts");
  return { posts: await res.json() };
}
Vermeiden
<script>
  import { onMount } from "svelte";
  let posts = [];
  onMount(async () => {
    posts = await fetch("/api/posts")
      .then((r) => r.json());
  });
</script>

Formulare verarbeiten

Eine Form Action läuft auf dem Server und funktioniert ohne JavaScript; sie wird automatisch verbessert, sobald JS verfügbar ist.

Bevorzugt
// +page.server.js
export const actions = {
  default: async ({ request }) => {
    const data = await request.formData();
    await createPost(data.get("title"));
  },
};
Vermeiden
<script>
  async function submit(e) {
    e.preventDefault();
    await fetch("/api/posts", {
      method: "POST",
      body: new FormData(e.target),
    });
  }
</script>

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, SvelteKit zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch SvelteKit — mit Quizzen und echtem Code, den Sie im Browser ausführen können.