¿Qué es Svelte?
Svelte ocupa una posición única entre los frameworks JavaScript. Mientras React o Vue funcionan como bibliotecas de runtime, Svelte actúa como compilador. Como convierte los componentes en JavaScript puro en tiempo de build, no hace falta enviar al navegador código extra del framework. La mayor característica de Svelte es que no usa Virtual DOM. Cuando cambia el estado, el código generado por Svelte en tiempo de compilación actualiza directamente el DOM. Con ello se consigue una UI muy ligera y rápida.En esta página se explica la combinación de Svelte 5 e Inertia v3. Los starter kits de Laravel 13 usan esta configuración por defecto.
Runes de Svelte 5
En Svelte 5 (lanzado en 2024) se introdujo un nuevo sistema de reactividad llamado runes. Se declaran estados reactivos usando funciones especiales (runes) como$state, $derived o $effect. A diferencia de la reactividad implícita anterior a Svelte 4, el diseño es explícito y más predecible.
Posición dentro de Laravel
Historia
La relación entre Svelte y Laravel es muy reciente en comparación con Vue y React; el primer soporte oficial es su adopción en los starter kits oficiales. Con la adición oficial de Svelte a los starter kits en Laravel 13 (2026), Svelte pasó a ser una de las opciones oficiales de frontend en el ecosistema Laravel. Se trata en igualdad de condiciones que Vue y React, y se puede seleccionar en el prompt interactivo delaravel new.
Es un framework aún poco conocido entre los usuarios Laravel, pero sus características son bundles ligeros gracias al compilador y sintaxis sencilla; al pasar desde Vue o React, puede sorprender la poca cantidad de código a escribir.
Estilo dominante actual: Inertia × Svelte
El uso central de Svelte en Laravel actualmente es Inertia × Svelte. Inertia permite realizar una arquitectura de “monolito moderno” en la que se pasan datos directamente desde los controladores de Laravel a componentes Svelte sin diseñar una API.Configuración
Vía starter kit (recomendado)
Al iniciar un proyecto nuevo, usar el starter kit es lo más sencillo.inertiajs/inertia-laravel(adaptador del lado servidor)@inertiajs/svelte(adaptador del lado cliente)svelte+@sveltejs/vite-plugin-svelte(Svelte 5 y plugin de Vite)- TypeScript +
svelte-check - Tailwind CSS + biblioteca de componentes shadcn-svelte
- Middleware
HandleInertiaRequests - Pantallas de autenticación como login y registro (ya implementadas con Inertia + Svelte + TypeScript)
Instalación manual
Si vas a añadirlo a un proyecto existente, instala por separado el lado servidor y el lado cliente.vite.config.ts.
resources/js/app.ts. Como el plugin @inertiajs/vite resuelve y monta automáticamente las páginas, basta con un entry point mínimo.
Para los detalles de la instalación manual (configuración de la plantilla raíz, registro del middleware, etc.), consulta la documentación oficial de Inertia.
Estructura de directorios
En los starter kits, los componentes de página de Svelte se colocan en el directorioresources/js/pages/.
Inertia::render('posts/Index', [...]), el componente correspondiente es resources/js/pages/posts/Index.svelte.
Estructura básica de un archivo Svelte
Un archivo.svelte se compone de tres bloques: <script>, plantilla y <style>.
<style> está limitado a un scope por defecto, no hay que preocuparse por colisiones de nombres de clase.
Sintaxis de plantilla
Interpolación de variables y expresiones
Dentro de la plantilla se usa{} para incrustar valores o expresiones de JavaScript.
{#if} — Condicionales
v-if / v-else de Vue o al operador ternario de React.
{#each} — Renderizado de listas
(post.id) indica la key y se usa para diff eficiente. Equivale a v-for de Vue o a Array.map() de React.
bind: — Binding bidireccional
Con bind:value puedes sincronizar bidireccionalmente el valor de un elemento de formulario con una variable reactiva.
v-model de Vue. En React había que escribir a mano los handlers onChange, pero en Svelte se hace de forma declarativa con bind:.
Fundamentos del componente de página
Los componentes de página de Inertia son componentes Svelte normales. Los datos pasados desde el controlador de Laravel se reciben como props.Controlador
Componente de página Svelte
En Svelte 5 se reciben las props con la rune$props().
$props() puedes usar en la plantilla los datos pasados desde el controlador. No hace falta definir una API REST.
Componente Link
Al usar el componente <Link> que ofrece @inertiajs/svelte, la navegación entre páginas se hace por XHR y se evita la recarga completa del navegador.
<a> normal, pero por debajo Inertia solo cambia el componente de página, con lo que se logra una sensación de operación como en una SPA.
Componente Form
El componente <Form> que ofrece @inertiajs/svelte es el estilo recomendado de envío de formularios que se usa en las pantallas de autenticación del starter kit. Se indican action y method como props, y el contenido interno se describe con {#snippet}.
Uso básico
{#snippet children({ errors, processing })} es la sintaxis de snippet de Svelte: un bloque de contenido que se pasa al componente (equivale a los slots de Vue o los render props de React). errors y processing los calcula automáticamente el componente Form. En los campos del formulario, en lugar de bind:value, se usa el atributo nativo name de HTML, y funciona la recolección estándar de datos de formulario del navegador.
Patrón del starter kit
El starter kit gestiona las rutas como objetos usando Wayfinder.store.form() devuelve un objeto que incluye action y method del objeto de ruta, y se aplica al <Form> con spread.
resetOnSuccess se resetean automáticamente al enviar con éxito. Se indican en campos que se quieren dejar vacíos tras el envío, como la contraseña.
Si no usas Wayfinder, pasando directamente la URL con
action="/login" funciona igual.Hook useForm
Para el procesamiento de formularios se usa el hook useForm de @inertiajs/svelte. La gestión del estado del formulario, el envío y la visualización de errores de validación se implementan de forma sencilla.
Lado del controlador
Componente de formulario Svelte
useForm.
| Propiedad / Método | Descripción |
|---|---|
form.data | Objeto de datos del formulario |
form.errors | Errores de validación (acceso por nombre de campo) |
form.processing | true durante el envío (útil para desactivar el botón) |
form.isDirty | true si se ha cambiado respecto al valor inicial |
form.post(url) | Enviar con petición POST |
form.put(url) | Enviar con petición PUT (actualización) |
form.delete(url) | Enviar con petición DELETE |
form.reset() | Resetear el formulario a los valores iniciales |
useForm mantiene el contenido introducido y muestra el error. Combinado con bind:value se logra una experiencia de formulario sin fisuras.
Datos compartidos (Shared Data)
Los datos comunes a todas las páginas (información del usuario autenticado, mensajes flash, etc.) se definen en el métodoshare() del middleware HandleInertiaRequests.
usePage().
Como los datos compartidos se incluyen en todas las peticiones, se recomienda limitarlos al mínimo necesario. Si los pasas mediante una evaluación diferida con
fn(), solo se evalúan cuando realmente se acceden.Reactividad de Svelte 5 (runes)
Presentamos la sintaxis de runes de Svelte 5 que conviene conocer para desarrollar con Inertia × Svelte.$state — Estado reactivo
$state son reactivas automáticamente. Cuando cambia el valor, el DOM se actualiza automáticamente. Equivale a ref de Vue o useState de React, pero no hace falta acceder a la propiedad .value; basta con asignar para actualizar el estado.
$derived — Valores derivados
$derived se recalcula automáticamente cuando cambian los valores de los que depende. Equivale a computed de Vue o useMemo de React.
$effect — Procesamiento de efectos secundarios
$effect se ejecuta cada vez que cambia un valor $state del que depende. Equivale a useEffect de React, pero no hay que declarar explícitamente el array de dependencias; las variables $state usadas se rastrean automáticamente.
Componentes shadcn-svelte
El starter kit incluye shadcn-svelte. shadcn-svelte es una biblioteca de componentes con la misma filosofía de diseño que shadcn/ui para React: copias el código en tu proyecto y lo puedes personalizar libremente.Añadir componentes
resources/js/components/ui/.
Cómo usar
npx shadcn-svelte@latest add.
Conclusión
Svelte saca su potencial al combinarse con Laravel, especialmente en la configuración de “monolito moderno” a través de Inertia. Por su diseño basado en compilador, el tamaño del bundle es pequeño, y gracias a la sintaxis de runes la reactividad es explícita y fácil de entender.| Elemento | Rol |
|---|---|
| Controlador de Laravel | Enrutamiento, obtención de datos y validación |
Inertia::render() | Pasa datos del controlador al componente Svelte |
| Componente de página Svelte | Recibe props con $props() y renderiza la UI |
useForm | Gestión del estado del formulario, envío y visualización de errores |
Componente Link | Navegación entre páginas sin recarga completa |
usePage().props | Acceso a los datos compartidos |
| shadcn-svelte | Biblioteca de componentes estándar |
Documentación oficial de Inertia.js
Para todas las funcionalidades de Inertia v3, consulta la documentación oficial.