Cos’è Svelte
Svelte occupa una posizione originale tra i framework JavaScript. Mentre React e Vue funzionano come librerie a runtime, Svelte funziona come compilatore. In fase di build converte i componenti in JavaScript puro, quindi non serve inviare al browser codice framework aggiuntivo. La caratteristica principale di Svelte è che non usa un Virtual DOM. Quando lo stato cambia, il codice generato in compilazione da Svelte aggiorna direttamente il DOM. Il risultato è una UI molto leggera e veloce.In questa pagina spieghiamo la combinazione di Svelte 5 e Inertia v3. Lo starter kit di Laravel 13 usa questa configurazione per impostazione predefinita.
Le rune di Svelte 5
Con Svelte 5 (rilasciato nel 2024) è stato introdotto un nuovo sistema di reattività chiamato Runes. Si dichiarano stati reattivi con funzioni speciali (rune) come$state, $derived ed $effect. A differenza della reattività implicita di Svelte 4 e precedenti, il design è esplicito e più prevedibile.
Posizione in Laravel
Storia
Il rapporto tra Svelte e Laravel è molto più recente rispetto a Vue e React: la sua prima adozione ufficiale è l’inclusione negli starter kit ufficiali. Con Laravel 13 (2026) Svelte è stato aggiunto ufficialmente agli starter kit e, di fatto, è diventato una delle scelte frontend ufficiali nell’ecosistema Laravel. È trattato allo stesso livello di Vue e React ed è selezionabile dal prompt interattivo dilaravel new.
È ancora un framework poco conosciuto tra gli utenti Laravel, ma è caratterizzato da bundle leggeri grazie al compilatore e sintassi semplice: chi arriva da Vue o React potrebbe sorprendersi della minore quantità di codice necessaria.
Stile principale attuale: Inertia × Svelte
Il modo principale di usare Svelte in Laravel è Inertia × Svelte. Inertia realizza l’architettura “monolite moderno” che permette di passare dati dai controller Laravel direttamente ai componenti Svelte senza progettare un’API.Setup
Tramite starter kit (consigliato)
Per iniziare un nuovo progetto il modo più semplice è usare lo starter kit.inertiajs/inertia-laravel(adapter lato server)@inertiajs/svelte(adapter lato client)svelte+@sveltejs/vite-plugin-svelte(Svelte 5 e plugin Vite)- TypeScript +
svelte-check - Tailwind CSS + libreria di componenti shadcn-svelte
- Middleware
HandleInertiaRequests - Schermate di autenticazione (login, registrazione, ecc.) già implementate con Inertia + Svelte + TypeScript
Installazione manuale
Per aggiungerlo a un progetto esistente, installa separatamente lato server e lato client.vite.config.ts il plugin Svelte e il plugin Vite di Inertia.
resources/js/app.ts. Il plugin @inertiajs/vite esegue la risoluzione automatica delle pagine e il mount, quindi bastano poche righe nell’entry point.
Per i dettagli dell’installazione manuale (configurazione del template root, registrazione dei middleware, ecc.) consulta la documentazione ufficiale di Inertia.
Struttura delle directory
Negli starter kit i componenti pagina Svelte vanno nella directoryresources/js/pages/.
Inertia::render('posts/Index', [...]), il componente corrispondente è resources/js/pages/posts/Index.svelte.
Struttura di base di un file Svelte
Un file.svelte è composto da tre blocchi: <script>, template e <style>.
<style> è per default con scope limitato, quindi non devi preoccuparti dei conflitti di nomi di classe.
Sintassi del template
Espansione di variabili ed espressioni
Nel template si usa{} per incorporare valori o espressioni JavaScript.
{#if} — condizionali
v-if / v-else di Vue e all’operatore ternario di React.
{#each} — rendering di liste
(post.id) è la specifica della chiave, usata per un aggiornamento differenziale efficiente. Corrisponde a v-for di Vue e a Array.map() di React.
bind: — binding bidirezionale
Con bind:value puoi sincronizzare bidirezionalmente il valore di un elemento form e una variabile reattiva.
v-model di Vue. In React dovevi scrivere manualmente handler onChange; in Svelte, con bind:, si scrive in modo dichiarativo.
Le basi del componente pagina
I componenti pagina di Inertia sono normali componenti Svelte. I dati passati dal controller Laravel arrivano come props.Controller
Componente pagina Svelte
In Svelte 5 le props si ricevono con la runa$props().
$props() per usare nel template i dati passati dal controller. Non è necessario definire un’API REST.
Componente Link
Usando il componente <Link> di @inertiajs/svelte, le transizioni avvengono via XHR ed eviti il full reload del browser.
<a>, ma dietro le quinte Inertia sostituisce solo il componente di pagina, dando una sensazione da SPA.
Componente Form
Il componente <Form> fornito da @inertiajs/svelte è lo stile consigliato usato negli starter kit per l’invio dei form. Specifichi action e method come props e descrivi l’interno con {#snippet}.
Uso di base
{#snippet children({ errors, processing })} è la sintassi degli snippet di Svelte, un blocco di contenuto da passare al componente (equivalente agli slot di Vue o alle render props di React). errors e processing sono calcolati e passati automaticamente dal componente Form. Ai campi si assegna l’attributo HTML nativo name invece di bind:value, così funziona la raccolta standard dei dati del browser.
Pattern degli starter kit
Gli starter kit gestiscono le rotte come oggetti tramite Wayfinder.store.form() restituisce un oggetto contenente action e method dell’oggetto rotta e lo passi a <Form> con lo spread.
resetOnSuccess vengono ripristinati automaticamente al successo dell’invio. Utile per campi come la password che vuoi svuotare dopo l’invio.
Se non usi Wayfinder puoi passare direttamente l’URL come
action="/login" e funziona allo stesso modo.Hook useForm
Per la gestione dei form usa l’hook useForm di @inertiajs/svelte. Puoi implementare in modo semplice gestione stato, invio ed errori di validazione.
Lato controller
Componente form Svelte
useForm.
| Proprietà / Metodo | Descrizione |
|---|---|
form.data | Oggetto dati del form |
form.errors | Errori di validazione (accesso per nome campo) |
form.processing | true durante l’invio (per disabilitare il pulsante) |
form.isDirty | true se ci sono modifiche rispetto ai valori iniziali |
form.post(url) | Invia con richiesta POST |
form.put(url) | Invia con richiesta PUT (update) |
form.delete(url) | Invia con richiesta DELETE |
form.reset() | Ripristina il form ai valori iniziali |
useForm mantiene i contenuti inseriti mostrando gli errori. Combinato con bind:value offre un’esperienza di form senza interruzioni.
Dati condivisi (Shared Data)
I dati necessari a tutte le pagine (utente loggato, messaggi flash, ecc.) si definiscono nel metodoshare() del middleware HandleInertiaRequests.
usePage().
Poiché i dati condivisi sono inclusi in ogni richiesta, si consiglia di limitarli allo stretto necessario. Con valutazioni lazy tramite
fn(), vengono valutati solo quando ci si accede davvero.Reattività di Svelte 5 (Runes)
Ecco le rune di Svelte 5 essenziali per sviluppare con Inertia × Svelte.$state — stato reattivo
$state sono automaticamente reattive. Al cambio di valore il DOM si aggiorna in automatico. Corrisponde a ref di Vue o useState di React, ma non serve accedere alla proprietà .value: aggiornare lo stato equivale a fare l’assegnazione.
$derived — valori derivati
$derived viene ricalcolato automaticamente quando cambia una delle dipendenze. Corrisponde a computed di Vue o useMemo di React.
$effect — effetti collaterali
$effect si esegue ogni volta che cambia un valore $state da cui dipende. Corrisponde a useEffect di React, ma non devi indicare esplicitamente un array di dipendenze: le variabili $state usate vengono tracciate automaticamente.
Componenti shadcn-svelte
Gli starter kit includono shadcn-svelte. shadcn-svelte è una libreria di componenti con la stessa filosofia di design di shadcn/ui per React: il codice viene copiato nel progetto e puoi personalizzarlo liberamente.Aggiungere componenti
resources/js/components/ui/.
Utilizzo
npx shadcn-svelte@latest add.
Conclusioni
Svelte, in combinazione con Laravel, dà il meglio nell’architettura “monolite moderno” tramite Inertia. Grazie al design basato su compilatore, il bundle è piccolo e, con la sintassi delle rune, la reattività è esplicita e facile da comprendere.| Elemento | Ruolo |
|---|---|
| Controller Laravel | Routing, recupero dati e validazione |
Inertia::render() | Passa i dati dal controller al componente Svelte |
| Componente pagina Svelte | Riceve le props con $props() e renderizza la UI |
useForm | Gestione stato, invio ed errori del form |
Componente Link | Transizioni di pagina senza full reload |
usePage().props | Accesso ai dati condivisi |
| shadcn-svelte | Libreria di componenti standard |
Documentazione ufficiale di Inertia.js
Per tutte le funzionalità di Inertia v3 consulta la documentazione ufficiale.