Svelte

Framework UI compile-time - sin Virtual DOM, actualizaciones quirurgicas, bundles mas pequenos

TL;DR

En resumen: Svelte es un compilador, no un framework - tu código se convierte en JS vanilla sin overhead de runtime.

Fortalezas principales:

  • Sin DOM virtual - compila a actualizaciones DOM quirúrgicas
  • Verdaderamente reactivo - solo asigna para disparar actualizaciones
  • Bundles más pequeños - no se envía código del framework
  • Svelte 5 runes - primitivas de reactividad de grano fino

Core Concepts

Concept 1: Compiler, Not Runtime

Svelte mueve el trabajo del navegador al tiempo de build. Tus componentes compilan a JavaScript eficiente que manipula el DOM directamente.

<!-- This compiles away completely -->
<script>
  let count = $state(0);
</script>

<button onclick={() => count++}>{count}</button>

Concept 2: Runes (Svelte 5)

Los runes son el nuevo sistema de reactividad. Son macros similares a funciones que el compilador entiende.

<script>
  let count = $state(0);           // Reactive state
  let doubled = $derived(count * 2); // Computed value

  $effect(() => {
    console.log(count);  // Runs when count changes
  });
</script>

Concept 3: Single-File Components

Todo en un archivo .svelte - script, markup, estilos (con scope por defecto).

<script>
  let name = $state('world');
</script>

<h1>Hello {name}!</h1>

<style>
  h1 { color: purple; }  /* Only affects this component */
</style>

Quick Start

Create Project

npx sv create my-app
cd my-app
npm install
npm run dev

Project Structure

my-app/
├── src/
│   ├── routes/        # SvelteKit pages
│   │   └── +page.svelte
│   ├── lib/           # Shared components
│   └── app.html
├── svelte.config.js
└── package.json

Minimal Example

<!-- src/routes/+page.svelte -->
<script>
  let count = $state(0);
</script>

<h1>Hello Svelte!</h1>
<button onclick={() => count++}>
  Count: {count}
</button>

Run

npm run dev
# Open http://localhost:5173

Gotchas

Reactivity requires $state (Svelte 5)

<script>
  // ❌ Not reactive
  let count = 0;

  // ✅ Reactive with runes
  let count = $state(0);
</script>

Arrays/objects need reassignment or $state

<script>
  let items = $state([1, 2, 3]);

  // ✅ Direct mutation works with $state in Svelte 5
  items.push(4);

  // Or reassign
  items = [...items, 4];
</script>

Props use $props()

<script>
  // Svelte 5 way
  let { name, count = 0 } = $props();
</script>

<h1>Hello {name}! Count: {count}</h1>

Two-way binding

<script>
  let value = $state('');
</script>

<!-- bind: creates two-way binding -->
<input bind:value>
<p>You typed: {value}</p>

When to Use

Ideal para:

  • Aplicaciones críticas en rendimiento
  • Proyectos pequeños a medianos
  • Desarrolladores que no les gusta el overhead de frameworks
  • Aprender conceptos de reactividad modernos

No ideal para:

  • Equipos que necesitan máximo ecosistema/pool de contratación (React lidera)
  • Proyectos que requieren integraciones extensivas de terceros
  • Apps enterprise muy grandes (menos probado a escala)

Comparación:

CaracterísticaSvelteReactVue
Tamaño bundleDiminuto40KB30KB
RuntimeNinguno
Curva de aprendizajeFácilMediaFácil
ReactividadCompile-timeHooksProxy-based

Next Steps

Cheatsheet

PatrónSintaxis Svelte 5
Estadolet x = $state(0)
Derivadolet y = $derived(x * 2)
Efecto$effect(() => { ... })
Propslet { prop } = $props()
Bind<input bind:value>
Eventoonclick={handler}
Condición{#if x}...{/if}
Bucle{#each items as item}...{/each}
Await{#await promise}...{/await}