Projekt-Struktur
Wo liegt was? Ein Rundgang durch die Ordner eines SvelteKit-Projekts — und was jeder Teil im Rails-Vokabular bedeutet.
Der Überblick
Ein frisches SvelteKit-Projekt sieht auf den ersten Blick ungewohnt aus, ist aber
erstaunlich flach. Fast dein gesamter Code lebt unter src/:
meinprojekt/
├── src/
│ ├── routes/ # dateibasiertes Routing (jede Route ein Ordner)
│ │ ├── +page.svelte # die Seite unter "/"
│ │ ├── +layout.svelte # Rahmen um alle Seiten
│ │ └── about/
│ │ └── +page.svelte # die Seite unter "/about"
│ ├── lib/ # eigener Code, per $lib importierbar
│ │ └── components/
│ ├── app.html # HTML-Grundgerüst der ganzen App
│ └── app.css # globale Styles
├── static/ # statische Dateien (unverändert ausgeliefert)
│ └── favicon.png
├── svelte.config.js # Svelte- & Adapter-Konfiguration
├── vite.config.ts # Vite-Konfiguration (Plugins, Server)
└── package.jsonDie wichtigsten Anlaufstellen sind src/routes (deine Seiten und Endpunkte) und src/lib (dein wiederverwendbarer Code). Der Rest sind Konfigurationsdateien und
ein statischer Ordner. Sehen wir uns die Teile einzeln an.
src/routes — dateibasiertes Routing
SvelteKit hat keine zentrale Routing-Datei. Stattdessen bestimmt die
Ordnerstruktur unter src/routes die URLs deiner App: Jeder Ordner ist ein
Pfad-Segment, und spezielle Dateien mit einem +-Präfix füllen ihn mit Leben.
src/routes/
├── +page.svelte → /
├── blog/
│ ├── +page.svelte → /blog
│ └── [slug]/
│ └── +page.svelte → /blog/mein-artikel (dynamisch)
└── api/
└── health/
└── +server.js → /api/health (JSON-Endpunkt)Die wichtigsten Spezialdateien (Details folgen in den späteren Modulen):
+page.svelte— die sichtbare Seite einer Route (das Markup).+page.js— lädt Daten für die Seite; läuft sowohl auf Server als auch im Browser (universal).+page.server.js— lädt Daten nur auf dem Server (z. B. direkter Datenbankzugriff, Secrets).+layout.svelte— ein Rahmen, der alle Seiten darunter umschließt (Navigation, Footer …).+server.js— ein API-Endpunkt, der reine Daten (z. B. JSON) statt einer Seite zurückgibt.
ℹ️ Nur ein Vorgeschmack
Lass dich von der Liste nicht erschlagen — für den Einstieg reicht +page.svelte.
Die anderen Dateien behandeln wir ausführlich in den Modulen zu Routing (M8) und Daten (M9).
src/lib und der $lib-Alias
Alles, was nicht direkt eine Route ist — Komponenten, Hilfsfunktionen, Typen, Datenbank-Code —
gehört nach src/lib. Der Clou: Von überall in der App erreichst du diesen Ordner
über den festen Alias $lib, ganz ohne fragile relative Pfade.
// src/lib/utils/format.ts
export function euro(betrag: number): string {
return betrag.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' });
}<script lang="ts">
// $lib zeigt immer auf src/lib — egal wie tief die Datei verschachtelt ist.
// Kein zerbrechliches "../../../lib/utils/format" mehr.
import { euro } from '$lib/utils/format';
</script>
<p>Preis: {euro(19.9)}</p>🛤️ Rails-Vergleich: das große Ganze
Wenn du die SvelteKit-Ordner ins Rails-Vokabular übersetzt:
src/routes≈app/views+config/routes.rbin einem — die Struktur ist das Routing.+page.server.js≈ die Controller-Action, die Daten für die View bereitstellt.+server.js≈ eine API-Controller-Action, dierender json:zurückgibt.src/lib≈app/allgemein (Models, Helpers, Components);$lib≈ Rails' Autoloading, das dir absolute Referenzen erspart.static/≈public/— 1:1 dieselbe Idee.src/app.css≈app/assets/stylesheets.
Das HTML-Gerüst und globale Styles
src/app.html ist die äußere HTML-Hülle, in die SvelteKit deine App einsetzt. Die %sveltekit.…%-Platzhalter füllt das Framework beim Rendern:
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
<div>%sveltekit.body%</div>
</body>
</html>Hier trägst du globale <meta>-Tags, das Favicon oder eine Sprach-Angabe ein. src/app.css daneben enthält globale Styles, die für die ganze App gelten — im
Gegensatz zu den scoped Styles einzelner Komponenten, die wir in Modul M1 kennenlernen.
Konfiguration und statische Dateien
svelte.config.js— Einstellungen für Svelte und den Adapter (siehe vorige Lektion): Preprocessing, Aliase, Build-Ziel.vite.config.ts— Vite selbst: Plugins (auch das SvelteKit-Plugin), Dev-Server-Optionen, Test-Setup.static/— Dateien, die unverändert unter dem Web-Root ausgeliefert werden: Favicon,robots.txt, Bilder. Eine Dateistatic/logo.pngist im Browser unter/logo.pngerreichbar.
⚠️ static/ ist nicht src/lib/assets
Faustregel: Kommt eine Datei über eine feste URL in den Browser (Favicon, robots.txt), gehört sie nach static/. Wird ein Asset dagegen in
Code importiert und soll von Vite optimiert werden (z. B. ein Bild in einer
Komponente), lege es unter src/lib ab und importiere es.
Zusammenfassung
💡 Das Wichtigste
src/routes: Ordnerstruktur = URLs;+-Dateien geben Rollen (Seite, Layout, Endpunkt).src/lib+$lib: wiederverwendbarer Code ohne relative Pfad-Hölle.src/app.htmlist die HTML-Hülle,src/app.cssdie globalen Styles.static/für unveränderte Dateien;svelte.config.js&vite.config.tsfür Konfiguration.
🎯 Probier es selbst
Öffne dein Projekt und lege einen neuen Ordner src/routes/about/ mit einer
Datei +page.svelte an (Inhalt: eine einfache Überschrift). Rufe dann http://localhost:5173/about auf. Lege außerdem ein Bild in static/ und prüfe, dass es unter der passenden URL erscheint.