Skip to main content

Qu’est-ce que Svelte ?

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.

Les runes de Svelte 5

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.
Le starter kit Svelte de Laravel utilise Svelte 5 + TypeScript par défaut. Tous les exemples de cette page sont en TypeScript (lang="ts").

Place de Svelte dans Laravel

Historique

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.

Style dominant actuel : Inertia × Svelte

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.

Mise en place

Via un starter kit (recommandé)

Le plus simple pour un nouveau projet.
En choisissant Svelte dans le prompt, tout est configuré automatiquement :
  • inertiajs/inertia-laravel (adaptateur serveur)
  • @inertiajs/svelte (adaptateur client)
  • svelte + @sveltejs/vite-plugin-svelte (Svelte 5 et plugin Vite)
  • TypeScript + svelte-check
  • Tailwind CSS + shadcn-svelte
  • Middleware HandleInertiaRequests
  • Écrans d’authentification (déjà implémentés en Inertia + Svelte + TypeScript)

Installation manuelle

Pour un projet existant, installez séparément côté serveur et côté client.
Ajoutez le plugin Svelte et le plugin Vite d’Inertia à vite.config.ts.
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.
Pour les détails (template racine, enregistrement du middleware, etc.), consultez la documentation officielle Inertia.

Structure des répertoires

Dans le starter kit, les composants de page Svelte sont placés dans resources/js/pages/.
Inertia::render('posts/Index', [...]) correspond au composant resources/js/pages/posts/Index.svelte.

Structure d’un fichier Svelte

Un fichier .svelte se compose de trois blocs : <script>, template et <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.

Syntaxe du template

Interpolation et expressions

Dans le template, {} intègre une valeur ou une expression JavaScript.

{#if} — branchement

Équivalent au v-if / v-else de Vue et au ternaire de React.

{#each} — rendu de liste

(post.id) sert de clé et permet un diff efficace. Équivalent au v-for de Vue et au Array.map() de React.

bind: — binding bidirectionnel

bind:value synchronise la valeur d’un élément de formulaire avec une variable réactive dans les deux sens.
Équivalent au v-model de Vue. En React, il fallait écrire un onChange ; Svelte l’exprime de manière déclarative avec bind:.

Composant de page — bases

Un composant de page Inertia est un composant Svelte classique. Les données passées par le contrôleur arrivent en props.

Contrôleur

Composant de page Svelte

En Svelte 5, on reçoit les props avec la rune $props().
Il suffit de récupérer les props via $props() pour utiliser les données transmises par le contrôleur. Aucune API REST à définir.
Le composant <Link> de @inertiajs/svelte déclenche la navigation en XHR sans rechargement complet.
L’écriture est identique à celle d’une balise <a>, mais seul le composant de page est remplacé en coulisses, offrant une expérience SPA.

Composant Form

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}.

Utilisation de base

{#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.

Patron du starter kit

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>.
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.

Hook useForm

Pour la gestion de formulaires, utilisez le hook useForm de @inertiajs/svelte.

Côté contrôleur

Composant de formulaire Svelte

Principales propriétés de l’objet retourné par useForm. En cas d’erreur de validation, useForm conserve les valeurs saisies. Combiné à bind:value, l’expérience de formulaire est fluide.

Données partagées (Shared Data)

Les données communes à toutes les pages (utilisateur connecté, messages flash) sont déclarées dans la méthode share() du middleware HandleInertiaRequests.
Depuis un composant Svelte, on accède à ces données partagées via usePage().
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.

Réactivité de Svelte 5 (runes)

Les runes essentielles pour développer avec Inertia × Svelte.

$state — état réactif

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.

$derived — valeur dérivée

$derived recalcule automatiquement lorsque ses dépendances changent. Équivalent à computed en Vue ou useMemo en React.

$effect — effets de bord

$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.

Composants shadcn-svelte

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.

Ajouter des composants

Ces commandes déposent le code du composant dans resources/js/components/ui/.

Utilisation

Le starter kit inclut déjà Button, Input, Card, Dialog, Dropdown, etc. Ajoutez d’autres composants au besoin avec npx shadcn-svelte@latest add.

Conclusion

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. 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.
Dernière modification le 13 juillet 2026