Skip to main content

Wat is Svelte

Svelte neemt een unieke positie in onder de JavaScript-frameworks. Waar React en Vue als runtimelibrary’s werken, werkt Svelte als compiler. Componenten worden tijdens de build omgezet naar pure JavaScript, waardoor er geen overbodige frameworkcode naar de browser hoeft te worden gestuurd. Het grootste kenmerk van Svelte is dat het geen virtual DOM gebruikt. Wanneer de state verandert, werkt de code die Svelte tijdens het compileren heeft gegenereerd de DOM direct bij. Dit maakt een extreem lichte en snelle UI mogelijk.
Deze pagina behandelt de combinatie van Svelte 5 en Inertia v3. De starter kits van Laravel 13 gebruiken deze opzet standaard.

De runes van Svelte 5

Svelte 5 (uitgebracht in 2024) introduceerde een nieuw reactiviteitssysteem genaamd runes. Je declareert reactieve state met speciale functies (runes) zoals $state, $derived en $effect. Anders dan de impliciete reactiviteit van Svelte 4 en eerder is dit ontwerp expliciet en voorspelbaar.
De Svelte starter kit van Laravel gebruikt standaard Svelte 5 + TypeScript. Alle voorbeelden op deze pagina zijn daarom in TypeScript (lang="ts") geschreven.

De positie binnen Laravel

Geschiedenis

De relatie tussen Svelte en Laravel is vergeleken met Vue en React nog erg jong: de opname in de officiële starter kits is de eerste officiële ondersteuning. Met de officiële toevoeging van Svelte aan de starter kits in Laravel 13 (2026) werd Svelte een van de officiële frontendkeuzes binnen het Laravel-ecosysteem. Het wordt op gelijke voet met Vue en React behandeld en is te selecteren in de interactieve prompt van laravel new. Het framework is bij Laravel-gebruikers nog niet zo bekend, maar het kenmerkt zich door een lichte bundel dankzij de compiler en een eenvoudige syntaxis — stap je over van Vue of React, dan zul je misschien verbaasd zijn hoe weinig je hoeft te schrijven.

De huidige mainstream: Inertia × Svelte

De belangrijkste manier om Svelte in Laravel te gebruiken is tegenwoordig Inertia × Svelte. Inertia realiseert een “moderne monoliet”-architectuur waarbij je zonder een API te ontwerpen data rechtstreeks vanuit Laravel-controllers aan Svelte-componenten doorgeeft.

Setup

Via een starter kit (aanbevolen)

Voor een nieuw project is een starter kit de makkelijkste route.
Kies je in de interactieve prompt voor Svelte, dan wordt dit allemaal automatisch opgezet:
  • inertiajs/inertia-laravel (server-side adapter)
  • @inertiajs/svelte (clientadapter)
  • svelte + @sveltejs/vite-plugin-svelte (Svelte 5 zelf en de Vite-plugin)
  • TypeScript + svelte-check
  • Tailwind CSS + de shadcn-svelte-componentlibrary
  • De middleware HandleInertiaRequests
  • Authenticatieschermen zoals inloggen en registreren (al geïmplementeerd met Inertia + Svelte + TypeScript)

Handmatige installatie

Voeg je Inertia toe aan een bestaand project, dan installeer je de server- en clientzijde afzonderlijk.
Voeg vervolgens de Svelte-plugin en de Inertia Vite-plugin toe aan vite.config.ts.
Start de Inertia-app in resources/js/app.ts. Omdat de @inertiajs/vite-plugin het automatisch oplossen en mounten van pagina’s verzorgt, volstaat een minimaal entrypoint.
Zie de officiële Inertia-documentatie voor de details van een handmatige installatie (zoals het instellen van de roottemplate en het registreren van de middleware).

Directorystructuur

In de starter kits plaats je Svelte-paginacomponenten in de directory resources/js/pages/.
Schrijf je Inertia::render('posts/Index', [...]), dan is resources/js/pages/posts/Index.svelte de bijbehorende component.

De basisstructuur van een Svelte-bestand

Een .svelte-bestand bestaat uit drie blokken: <script>, template en <style>.
De structuur lijkt op een Single File Component (SFC) van Vue, maar kenmerkend is dat je in de template en het script minder hoeft te schrijven. Omdat <style> standaard scoped is, hoef je je geen zorgen te maken over botsende klassenamen.

Templatesyntaxis

Variabelen en expressies invoegen

Binnen de template gebruik je {} om JavaScript-waarden of -expressies in te voegen.

{#if} — voorwaarden

Dit komt overeen met v-if / v-else in Vue of de ternaire operator in React.

{#each} — lijsten renderen

(post.id) is de key-aanduiding, die wordt gebruikt voor efficiënte diff-updates. Dit komt overeen met v-for in Vue of Array.map() in React.

bind: — two-way binding

Met bind:value synchroniseer je de waarde van een formulierelement in twee richtingen met een reactieve variabele.
Dit komt overeen met v-model in Vue. In React moest je zelf een onChange-handler schrijven, maar in Svelte doe je dit declaratief met bind:.

De basis van paginacomponenten

Een Inertia-paginacomponent is een gewone Svelte-component. De data die je vanuit de Laravel-controller doorgeeft, ontvang je als props.

Controller

Svelte-paginacomponent

In Svelte 5 ontvang je props met de rune $props().
Je ontvangt de props simpelweg met $props() en kunt de data uit de controller direct in de template gebruiken. Een REST API definiëren is niet nodig.
Met de <Link>-component van @inertiajs/svelte verlopen paginanavigaties via XHR, zodat een volledige browserreload wordt vermeden.
Je schrijft hem net als een gewone <a>-tag, maar op de achtergrond vervangt Inertia alleen de paginacomponent, waardoor het aanvoelt als een SPA.

De Form-component

De <Form>-component van @inertiajs/svelte is de aanbevolen stijl voor formulierverzending die in de authenticatieschermen van de starter kits wordt gebruikt. Je geeft action en method op als props en schrijft de inhoud met {#snippet}.

Basisgebruik

{#snippet children({ errors, processing })} is de snippet-syntaxis van Svelte: een contentblok dat je aan een component doorgeeft (vergelijkbaar met slots in Vue of render props in React). De Form-component berekent errors en processing automatisch en geeft ze door. Voor de formuliervelden gebruik je geen bind:value maar het native HTML-attribuut name, zodat de standaard formulierdataverzameling van de browser werkt.

Het patroon van de starter kits

De starter kits gebruiken Wayfinder om routes als objecten te beheren. store.form() geeft een object terug met de action en method van het routeobject, dat je in <Form> spreadt.
Velden die je opgeeft in resetOnSuccess worden bij een geslaagde verzending automatisch gereset. Gebruik dit voor velden die je na het verzenden leeg wilt maken, zoals wachtwoordvelden.
Gebruik je Wayfinder niet, dan werkt het net zo goed als je direct een URL doorgeeft, zoals action="/login".

De useForm-hook

Voor formulierverwerking gebruik je de useForm-hook van @inertiajs/svelte. Statebeheer van het formulier, verzenden en het tonen van validatiefouten implementeer je hiermee eenvoudig.

Aan de controllerkant

Svelte-formuliercomponent

De belangrijkste properties van het object dat useForm teruggeeft: Komt er een validatiefout terug, dan toont useForm de fouten terwijl de ingevoerde inhoud behouden blijft. In combinatie met bind:value krijg je een naadloze formulierervaring.

Gedeelde data (shared data)

Data die je op elke pagina nodig hebt (zoals de ingelogde gebruiker en flashberichten) definieer je in de methode share() van de middleware HandleInertiaRequests.
Om vanuit een Svelte-component bij de gedeelde data te komen, gebruik je usePage().
Gedeelde data wordt bij elke request meegestuurd; beperk deze daarom tot het strikt noodzakelijke. Gebruik je lazy evaluation met fn(), dan wordt de data alleen geëvalueerd wanneer er daadwerkelijk toegang toe is.

De reactiviteit van Svelte 5 (runes)

Hier zijn de runes van Svelte 5 die je moet kennen om met Inertia × Svelte te ontwikkelen.

$state — reactieve state

Variabelen die je declareert met $state worden automatisch reactief. Verandert de waarde, dan wordt de DOM automatisch bijgewerkt. Dit komt overeen met ref in Vue of useState in React, maar zonder dat je een .value-property nodig hebt: een gewone toewijzing werkt de state al bij.

$derived — afgeleide waarden

$derived wordt automatisch opnieuw berekend wanneer de waarden waarvan het afhangt veranderen. Dit komt overeen met computed in Vue of useMemo in React.

$effect — side effects verwerken

$effect wordt uitgevoerd telkens wanneer een $state-waarde waarvan het afhangt verandert. Het komt overeen met useEffect in React, maar je hoeft geen dependency-array op te geven: de gebruikte $state-variabelen worden automatisch gevolgd.

shadcn-svelte-componenten

De starter kit bevat shadcn-svelte. shadcn-svelte is een componentlibrary met dezelfde ontwerpfilosofie als shadcn/ui voor React: de code wordt naar je project gekopieerd en je kunt hem vrij aanpassen.

Componenten toevoegen

Na het uitvoeren van het commando wordt de broncode van de component geplaatst in resources/js/components/ui/.

Gebruik

De starter kit bevat vooraf veelgebruikte componenten zoals Button, Input, Card, Dialog en Dropdown. Extra componenten voeg je op elk moment toe met het commando npx shadcn-svelte@latest add.

Samenvatting

Svelte komt in combinatie met Laravel vooral tot zijn recht in de “moderne monoliet”-opzet via Inertia. Dankzij het compilergebaseerde ontwerp is de bundel klein, en dankzij de runes-syntaxis is de reactiviteit expliciet en makkelijk te begrijpen. Met Inertia × Svelte krijg je een ontwikkelervaring die de eenvoud van een Laravel-backend combineert met de compacte schrijfstijl van Svelte. Maak je een project aan met de starter kit, dan kun je direct beginnen met ontwikkelen, inclusief authenticatieschermen.

Officiële Inertia.js-documentatie

Raadpleeg de officiële documentatie voor alle functies van Inertia v3.
Laatst gewijzigd op 6 september 2026