Was ist Svelte?
Svelte nimmt unter den JavaScript-Frameworks eine besondere Position ein. Während React und Vue als Laufzeitbibliotheken arbeiten, wirkt Svelte als Compiler. Beim Build werden Komponenten in reines JavaScript umgewandelt, sodass keine zusätzliche Framework-Runtime an den Browser gesendet werden muss. Das prägnanteste Merkmal von Svelte ist der Verzicht auf einen Virtual DOM. Bei Zustandsänderungen aktualisiert der von Svelte zur Compile-Zeit erzeugte Code das DOM direkt. Dadurch entstehen sehr leichte, schnelle Oberflächen.Diese Seite behandelt die Kombination Svelte 5 mit Inertia v3. Die Starterkits von Laravel 13 verwenden diese Konstellation standardmäßig.
Runen in Svelte 5
Mit Svelte 5 (Release 2024) wurde ein neues Reaktivitätssystem eingeführt: die Runen (Runes). Reaktiver State wird mit besonderen Funktionen (Runen) wie$state, $derived und $effect deklariert. Anders als die implizite Reaktivität in Svelte 4 ist das Design explizit und leichter vorhersagbar.
Rolle in Laravel
Historie
Die Beziehung zwischen Svelte und Laravel ist gegenüber Vue und React sehr jung – der erste offizielle Support ist die Aufnahme in das offizielle Starterkit. Mit Laravel 13 (2026) wurde Svelte offiziell den Starterkits hinzugefügt und ist damit eine offizielle Frontend-Option im Laravel-Ökosystem. Es steht gleichrangig neben Vue und React und lässt sich im interaktiven Prompt vonlaravel new auswählen.
Für viele Laravel-Nutzer ist Svelte noch weniger bekannt; kennzeichnend sind der kleine Bundle-Footprint durch den Compiler und die schlanke Syntax. Wer von Vue oder React umsteigt, ist häufig überrascht, wie wenig Code nötig ist.
Aktueller Standard: Inertia × Svelte
Der Standardansatz für Svelte in Laravel ist Inertia × Svelte. Inertia realisiert die „moderne Monolith”-Architektur, bei der Daten aus dem Laravel-Controller direkt an Svelte-Komponenten gehen, ohne API-Design.Setup
Via Starterkit (empfohlen)
Für neue Projekte ist das Starterkit am komfortabelsten.inertiajs/inertia-laravel(serverseitiger Adapter)@inertiajs/svelte(Client-Adapter)svelte+@sveltejs/vite-plugin-svelte(Svelte 5 selbst und Vite-Plugin)- TypeScript +
svelte-check - Tailwind CSS + Komponentenbibliothek shadcn-svelte
- Middleware
HandleInertiaRequests - Auth-Seiten für Login, Registrierung u. a. (bereits mit Inertia + Svelte + TypeScript umgesetzt)
Manuelle Installation
Für die Ergänzung in einem bestehenden Projekt installieren Sie Server- und Client-Seite separat.vite.config.ts das Svelte-Plugin und das Inertia-Vite-Plugin:
resources/js/app.ts. Da das Plugin @inertiajs/vite die automatische Auflösung und das Mounting übernimmt, genügt ein minimaler Entry-Point.
Details zur manuellen Installation (Root-Template, Middleware-Registrierung usw.) finden Sie in der offiziellen Inertia-Dokumentation.
Verzeichnisstruktur
Im Starterkit werden Svelte-Page-Komponenten unterresources/js/pages/ abgelegt.
Inertia::render('posts/Index', [...]) verweist auf resources/js/pages/posts/Index.svelte.
Grundaufbau einer Svelte-Datei
Eine.svelte-Datei besteht aus drei Blöcken: <script>, Template und <style>.
<style> ist standardmäßig gescoped, sodass Sie sich um Klassennamen-Kollisionen nicht sorgen müssen.
Template-Syntax
Variablen und Ausdrücke
Innerhalb des Templates betten Sie JavaScript-Werte mit{} ein.
{#if} – Bedingte Anzeige
v-if / v-else in Vue und dem ternären Operator in React.
{#each} – Listen darstellen
(post.id) ist die Key-Angabe und wird für effizientes Diffing genutzt. Entspricht v-for in Vue und Array.map() in React.
bind: – Zwei-Wege-Binding
Mit bind:value synchronisieren Sie den Wert eines Formularelements bidirektional mit einer reaktiven Variablen.
v-model in Vue. Anders als bei React, wo onChange-Handler nötig sind, drücken Sie es in Svelte deklarativ mit bind: aus.
Grundlagen der Page-Komponente
Eine Inertia-Page-Komponente ist eine gewöhnliche Svelte-Komponente. Die aus dem Laravel-Controller übergebenen Daten stehen als Props zur Verfügung.Controller
Svelte-Page-Komponente
In Svelte 5 empfangen Sie Props mit der Rune$props().
$props() verwenden Sie die vom Controller übergebenen Daten direkt im Template. Eine REST-API ist nicht nötig.
Die Link-Komponente
Die von @inertiajs/svelte bereitgestellte <Link>-Komponente sorgt für Seitenwechsel per XHR und vermeidet ein Full-Page-Reload.
<a>-Tag; im Hintergrund tauscht Inertia nur die Page-Komponente aus.
Die Form-Komponente
Die <Form>-Komponente von @inertiajs/svelte ist der empfohlene Stil aus den Starterkit-Auth-Screens. Sie geben action und method als Props an und beschreiben das Innere mit {#snippet}.
Grundlegende Verwendung
{#snippet children({ errors, processing })} ist die Snippet-Syntax von Svelte – ein Content-Block, der an die Komponente übergeben wird (analog zu Vue-Slots oder React-Render-Props). errors und processing werden von Form automatisch berechnet und übergeben. Statt bind:value verwenden Sie das native HTML-name-Attribut, sodass die Formulardatenerfassung des Browsers zum Zug kommt.
Muster aus dem Starterkit
Die Starterkits verwalten Routen mit Wayfinder als Objekte.store.form() liefert ein Objekt mit action und method, das per Spread an <Form> übergeben wird.
resetOnSuccess angegebenen Felder werden bei erfolgreichem Absenden automatisch zurückgesetzt. Nutzen Sie das etwa für Passwortfelder, die nach dem Absenden geleert werden sollen.
Ohne Wayfinder verhalten sich
action="/login" und Co. identisch, sobald Sie die URL direkt übergeben.Der useForm-Hook
Für die Formularverarbeitung nutzen Sie den useForm-Hook aus @inertiajs/svelte. State-Handling, Absenden und Fehleranzeige lassen sich damit schlank umsetzen.
Auf der Controller-Seite
Svelte-Formular-Komponente
useForm:
| Eigenschaft / Methode | Beschreibung |
|---|---|
form.data | Datenobjekt des Formulars |
form.errors | Validierungsfehler (Zugriff per Feldname) |
form.processing | true, solange gesendet wird (für Button-Deaktivierung) |
form.isDirty | true, wenn sich der Wert vom Ursprung unterscheidet |
form.post(url) | Per POST senden |
form.put(url) | Per PUT senden (Update) |
form.delete(url) | Per DELETE senden |
form.reset() | Formular auf Initialwerte zurücksetzen |
useForm die Eingaben und zeigt die Fehler an. In Verbindung mit bind:value entsteht ein nahtloses Formularerlebnis.
Shared Data
Daten, die auf allen Seiten gemeinsam gebraucht werden (angemeldeter Nutzer, Flash-Messages u. a.), definieren Sie in der Methodeshare() der Middleware HandleInertiaRequests.
usePage() auf Shared Data zu.
Da Shared Data in jeder Anfrage enthalten sind, empfiehlt sich die Beschränkung auf das Nötigste. Eine Lazy-Evaluation per
fn() wird nur ausgewertet, wenn tatsächlich zugegriffen wird.Reaktivität in Svelte 5 (Runen)
Wichtige Runen-Konzepte für die Arbeit mit Inertia × Svelte:$state – reaktiver State
$state deklarierte Variablen sind automatisch reaktiv. Bei Wertänderung wird das DOM aktualisiert. Entspricht Vues ref bzw. Reacts useState, jedoch ohne .value-Zugriff – die Zuweisung reicht.
$derived – abgeleitete Werte
$derived berechnet sich neu, sobald sich abhängige Werte ändern. Entspricht computed in Vue und useMemo in React.
$effect – Seiteneffekte
$effect wird bei jeder Änderung eines abhängigen $state-Werts ausgeführt. Entspricht useEffect in React, aber ohne explizites Dependency-Array – verwendete $state-Variablen werden automatisch getrackt.
shadcn-svelte-Komponenten
Das Starterkit enthält shadcn-svelte. shadcn-svelte folgt dem gleichen Designprinzip wie shadcn/ui für React: Sie kopieren den Code in Ihr Projekt und passen ihn frei an.Komponente hinzufügen
resources/js/components/ui/.
Verwendung
npx shadcn-svelte@latest add.
Fazit
Svelte entfaltet in Kombination mit Laravel – insbesondere über Inertia im Sinne eines „modernen Monolithen” – seine Stärken. Dank der Compiler-Basis ist die Bundle-Größe klein; die Runen-Syntax macht Reaktivität explizit und verständlich.| Baustein | Rolle |
|---|---|
| Laravel-Controller | Routing, Datenerfassung, Validierung |
Inertia::render() | Daten vom Controller an die Svelte-Komponente reichen |
| Svelte-Page-Komponente | Props per $props() empfangen und UI rendern |
useForm | Formular-State, Absenden und Fehleranzeige |
Link-Komponente | Seitenwechsel ohne Full-Reload |
usePage().props | Zugriff auf Shared Data |
| shadcn-svelte | Standard-Komponentenbibliothek |
Offizielle Inertia.js-Dokumentation
Alle Funktionen von Inertia v3 finden Sie in der offiziellen Dokumentation.