Este repositorio es una demostración práctica que explora cinco arquitecturas diferentes para manejar el estado y los datos en una aplicación de lista de tareas (To-Do list) construida con SvelteKit y Svelte 5, utilizando las nuevas Runas.
Cada una de las cinco "demos" representa un enfoque distinto, desde una aplicación puramente frontend hasta una solución híbrida y optimizada que combina lo mejor del renderizado en el servidor y las interacciones dinámicas.
El objetivo es comparar y contrastar diferentes patrones de gestión de estado para entender sus ventajas, desventajas y casos de uso ideales. Este proyecto sirve como un recurso de aprendizaje para desarrolladores que están transicionando a Svelte 5 o que desean profundizar en las capacidades de SvelteKit.
A continuación se detalla cada una de las pruebas realizadas:
Este es el enfoque más básico. Toda la lógica y el estado viven exclusivamente en el navegador.
- Estado: Gestionado con la runa
$state. - Valores Calculados: El filtrado de la lista y el conteo de tareas restantes se realizan con la runa
$derived. - Persistencia: Se utiliza la runa
$effectpara guardar y cargar las tareas desde ellocalStoragedel navegador. - Ideal para: Prototipos rápidos, aplicaciones sin conexión o componentes que no necesitan un backend.
Este ejemplo ilustra el manejo manual y directo del estado utilizando las runas $state, get y set.
- Estado ($state): Se utiliza para declarar una variable reactiva.
- Lectura (get): Permite obtener el valor actual de un estado sin crear una suscripción.
- Escritura (set): Permite asignar un nuevo valor al estado.
- Ideal para: Implementar patrones como un historial de cambios (deshacer/rehacer) donde se necesita un control explícito sobre cuándo leer o escribir un valor.
Este enfoque extrae la lógica de estado fuera del componente, creando una "signal" o "store" reutilizable, un patrón común para compartir estado entre múltiples componentes.
- Estado Centralizado: La lógica (
$state,$derived,$effect) vive en un archivo.svelte.ts, demostrando cómo la reactividad de las runas ya no está limitada a los componentes. - Comunicación: El componente importa y consume el estado reactivo, manteniendo la UI sincronizada.
- Ideal para: Gestionar estado global o compartido en el frontend de una manera organizada y escalable.
Introduce la arquitectura clásica y robusta de SvelteKit, donde el servidor es la fuente de verdad.
- Carga de Datos: La función
loaden+page.server.tsobtiene los datos iniciales, permitiendo un renderizado en el servidor (SSR) rápido y amigable con el SEO. - Mutaciones de Datos: Los
actionsdel formulario manejan la creación, edición y eliminación de tareas. La UI se actualiza automáticamente gracias a la mejora progresiva (use:enhance). - Ideal para: La mayoría de las aplicaciones web tradicionales. Es un patrón fiable, seguro y optimizado para el rendimiento.
Explora la nueva característica experimental de SvelteKit, las Remote Functions, para una comunicación cliente-servidor con seguridad de tipos de extremo a extremo.
- Carga de Datos: Se usa una
remote functionde tipoquerypara obtener los datos. - Manejo de Carga: Requiere
<svelte:boundary>para gestionar los estados de carga y error mientras se esperan los datos asíncronos en el cliente. - Mutaciones: Las funciones
formycommandmanejan las actualizaciones, permitiendo UI Optimista para una experiencia de usuario instantánea. - Ideal para: Componentes altamente reutilizables y encapsulados, o cuando se necesita un control muy granular sobre las actualizaciones de datos.
Combina la velocidad de load para la carga inicial con la flexibilidad de las remote functions para las interacciones dinámicas.
- Carga Inicial:
loaden+page.server.tsproporciona los datos esenciales para un renderizado SSR inmediato. - Interacciones Dinámicas: Las
remote functions(form,command) se utilizan para añadir, editar y eliminar tareas. - Sincronización: Se utiliza
dependsenloadyinvalidate()en el cliente para volver a cargar los datos de forma precisa solo cuando es necesario, después de una mutación. - Ideal para: Aplicaciones complejas y de alto rendimiento que buscan la mejor experiencia de usuario posible.
-
Clona el repositorio:
git clone https://github.com/RbnMach/todoapp-remote-functions.git cd todoapp-remote-functions -
Instala las dependencias:
npm i
-
Inicia el servidor de desarrollo:
npm run dev
-
Abre http://localhost:5173 en tu navegador y explora las diferentes demos.
- Framework: SvelteKit
- Lenguaje: Svelte 5 (con Runas), TypeScript
- Estilos: Tailwind CSS





