Introduction à Svelte — bases pour l'utiliser avec Inertia × Laravel
Guide d’introduction à Svelte avec Laravel + Inertia.js. De l’approche « compilateur » et de la syntaxe runes de Svelte 5 aux hooks Inertia (useForm, usePage, etc.).
Svelte occupe une place à part parmi les frameworks JavaScript. Alors que React et Vue fonctionnent comme des bibliothèques d’exécution, Svelte est un compilateur : au moment du build, les composants sont transformés en pur JavaScript, ce qui évite d’envoyer un runtime de framework au navigateur.Le point le plus caractéristique est l’absence de Virtual DOM. Quand l’état change, le code généré à la compilation met à jour directement le DOM. Il en résulte une UI très légère et rapide.
Cette page présente la combinaison Svelte 5 + Inertia v3, qui est la configuration par défaut du starter kit Laravel 13.
Svelte 5 (sorti en 2024) introduit un nouveau système de réactivité appelé runes. On déclare l’état réactif via des fonctions spéciales ($state, $derived, $effect, etc.). Contrairement à la réactivité implicite des versions antérieures, cette approche est explicite et plus prévisible.
<script lang="ts"> let count = $state(0) function increment() { count++ }</script><button onclick={increment}>{count}</button>
Le starter kit Svelte de Laravel utilise Svelte 5 + TypeScript par défaut. Tous les exemples de cette page sont en TypeScript (lang="ts").
La relation entre Svelte et Laravel est très récente comparée à Vue et React : l’intégration officielle passe par les starter kits.En 2026, avec Laravel 13, Svelte devient officiellement l’une des options frontend de l’écosystème Laravel. Il figure au même titre que Vue et React dans le prompt interactif de laravel new.Ce framework reste peu connu des utilisateurs Laravel, mais il se distingue par une taille de bundle réduite grâce au compilateur et une syntaxe simple : en venant de Vue ou React, la quantité de code à écrire surprend souvent par sa concision.
L’usage principal de Svelte avec Laravel est Inertia × Svelte. Inertia offre une architecture « monolithe moderne » où les données du contrôleur Laravel sont directement passées au composant Svelte, sans avoir à concevoir une API.
Pour un projet existant, installez séparément côté serveur et côté client.
# Côté serveur (PHP)composer require inertiajs/inertia-laravel# Côté client (JavaScript)npm install @inertiajs/svelte @inertiajs/vite sveltenpm install --save-dev @sveltejs/vite-plugin-svelte svelte-check typescript
Ajoutez le plugin Svelte et le plugin Vite d’Inertia à vite.config.ts.
import { defineConfig } from 'vite'import laravel from 'laravel-vite-plugin'import { svelte } from '@sveltejs/vite-plugin-svelte'import inertia from '@inertiajs/vite'export default defineConfig({ plugins: [ laravel({ input: ['resources/css/app.css', 'resources/js/app.ts'], refresh: true, }), svelte(), inertia(), ],})
Démarrez l’application Inertia dans resources/js/app.ts. Le plugin @inertiajs/vite prenant en charge la résolution automatique des pages et le montage, l’entrée peut se limiter au strict minimum.
import { createInertiaApp } from '@inertiajs/svelte'createInertiaApp()
Un fichier .svelte se compose de trois blocs : <script>, template et <style>.
<script lang="ts"> // Logique (TypeScript) let name = $state('Laravel')</script><!-- Template (syntaxe HTML) --><h1>Bonjour, {name} !</h1><style> /* CSS scopé (limité au composant) */ h1 { color: #ff2d20; }</style>
C’est proche des SFC de Vue, mais avec encore moins de code à écrire. Le <style> étant scopé par défaut, on ne se soucie plus des collisions de noms de classes.
<script lang="ts"> let isLoggedIn = $state(false) let role = $state('editor')</script>{#if isLoggedIn} <p>Bienvenue !</p>{:else if role === 'admin'} <p>Connecté en tant qu'administrateur</p>{:else} <a href="/login">Connexion</a>{/if}
Équivalent au v-if / v-else de Vue et au ternaire de React.
Le composant <Link> de @inertiajs/svelte déclenche la navigation en XHR sans rechargement complet.
<script lang="ts"> import { Link } from '@inertiajs/svelte'</script><!-- Lien de base --><Link href="/posts">Liste des articles</Link><!-- Lien POST (suppression, etc.) --><Link href="/posts/1" method="delete" as="button"> Supprimer</Link><!-- Préchargement au survol --><Link href="/posts/1" preload>Voir l'article</Link>
L’écriture est identique à celle d’une balise <a>, mais seul le composant de page est remplacé en coulisses, offrant une expérience SPA.
Le composant <Form> de @inertiajs/svelte est l’écriture recommandée dans les écrans d’authentification du starter kit. On passe action et method en props, et le contenu se décrit avec {#snippet}.
{#snippet children({ errors, processing })} est la syntaxe de snippet Svelte — un bloc de contenu passé au composant (équivalent des slots de Vue ou des render props de React). Les valeurs errors et processing sont calculées et fournies par le composant Form. Les champs utilisent l’attribut natif name plutôt que bind:value, ce qui active la collecte standard des données de formulaire par le navigateur.
Le starter kit utilise Wayfinder pour gérer les routes en tant qu’objets. store.form() renvoie un objet contenant action et method que l’on spread dans <Form>.
<script lang="ts"> import { Form } from '@inertiajs/svelte' import { store } from '@/routes/login'</script><Form {...store.form()} resetOnSuccess={['password']} class="flex flex-col gap-6"> {#snippet children({ errors, processing })} <!-- Contenu du formulaire --> {/snippet}</Form>
Les champs listés dans resetOnSuccess sont réinitialisés automatiquement après un envoi réussi. Utile pour les champs de mot de passe à vider.
Sans Wayfinder, action="/login" fonctionne de la même façon.
Les données communes à toutes les pages (utilisateur connecté, messages flash) sont déclarées dans la méthode share() du middleware HandleInertiaRequests.
Ces données étant présentes à chaque requête, limitez-les au strict nécessaire. Utilisez une évaluation paresseuse avec fn() pour qu’elles ne soient évaluées qu’en cas d’accès.
<script lang="ts"> let count = $state(0) let isOpen = $state(false) let items = $state<string[]>([])</script><p>{count}</p><button onclick={() => count++}>+1</button><button onclick={() => isOpen = !isOpen}>Basculer</button>
Une variable déclarée avec $state est automatiquement réactive : lorsque sa valeur change, le DOM est mis à jour. C’est l’équivalent de ref en Vue ou useState en React, mais sans .value : il suffit d’une affectation pour mettre à jour.
<script lang="ts"> let posts = $state<{ title: string; published: boolean }[]>([]) // On extrait uniquement les articles publiés let publishedPosts = $derived(posts.filter(post => post.published)) // Plusieurs dépendances let summary = $derived.by(() => { const total = posts.length const published = publishedPosts.length return `${published} publié(s) sur ${total} au total` })</script><p>{summary}</p>
$derived recalcule automatiquement lorsque ses dépendances changent. Équivalent à computed en Vue ou useMemo en React.
<script lang="ts"> let query = $state('') // Exécuté à chaque changement de query $effect(() => { console.log('Nouvelle requête :', query) // Une fonction de nettoyage peut être retournée return () => { console.log('Nettoyage') } })</script><input bind:value={query} placeholder="Recherche..." />
$effect se déclenche à chaque variation d’un $state utilisé. Équivalent à useEffect en React, mais sans tableau de dépendances : les variables $state utilisées sont détectées automatiquement.
Le starter kit intègre shadcn-svelte. Cette bibliothèque a le même esprit que shadcn/ui pour React : vous copiez le code dans le projet et le personnalisez librement.
Svelte s’exprime particulièrement bien avec Laravel dans un « monolithe moderne » via Inertia. Son bundle réduit grâce au compilateur et la clarté des runes en font un choix pertinent.
Élément
Rôle
Contrôleur Laravel
Routage, récupération de données, validation
Inertia::render()
Transmet les données du contrôleur au composant Svelte
Composant de page Svelte
Reçoit les props via $props() et rend l’UI
useForm
Gestion d’état, envoi et erreurs de formulaire
Composant Link
Navigation sans rechargement
usePage().props
Accès aux données partagées
shadcn-svelte
Bibliothèque de composants standard
Inertia × Svelte combine la simplicité du backend Laravel à l’écriture compacte de Svelte. Le starter kit permet de démarrer immédiatement, écrans d’authentification inclus.
Documentation officielle Inertia.js
Consultez la documentation officielle pour toutes les fonctionnalités d’Inertia v3.