Compiler Framework

Svelte

Svelte es un compilador, no un runtime. Convierte tus componentes en código DOM eficiente en tiempo de compilación, para que el navegador envíe menos JavaScript y realice menos trabajo.

intermediate14 min readUpdated 15 sept 2026
Counter.svelte
svelte
<!-- Counter.svelte -->
<script>
  let count = $state(0);
</script>

<button onclick={() => count++}>
  Clicked {count} times
</button>
Primera versión
2016, por Rich Harris
Modelo
Compilador, sin virtual DOM
Versión mayor actual
Svelte 5
Reactividad
Runes ($state, $derived)
Componentes
.svelte de archivo único
Framework de apps
SvelteKit

Por que importa

Por qué Svelte se siente diferente

Compilado, no interpretado

El framework desaparece en tiempo de compilación, dejando actualizaciones del DOM pequeñas y directas en lugar de una capa de diffing en el runtime.

Menos código que escribir

La reactividad, los estilos con scope y las transiciones están integrados en el lenguaje, por lo que los componentes se mantienen cortos y legibles.

Pequeño y rápido

La ausencia de un virtual DOM y un runtime diminuto se traducen en un rendimiento de inicio excelente, incluso en dispositivos de baja potencia.

La imagen completa

Las tres ideas detrás de Svelte

Un compilador, actualizaciones de grano fino y un formato de componente que mantiene el marcado, la lógica y los estilos juntos.

El compilador

Tiempo de compilación

Svelte analiza tus componentes y emite JavaScript optimizado que actualiza el DOM directamente.

Reactividad

Datos

Runes como $state, $derived y $effect hacen que los valores sean reactivos y que los valores derivados sean automáticos.

El formato de componente

Autoría

Un archivo .svelte contiene el marcado, la lógica y los estilos con scope, con transiciones y animaciones integradas.

Svelte de un vistazo

El núcleo de Svelte

Componentes de archivo único

Marcado, script y estilos con scope en un solo archivo .svelte.

$state

La rune que declara el estado local reactivo.

$derived y $effect

Calcula valores automáticamente o ejecuta efectos secundarios cuando el estado cambia.

Props y snippets

Pasa datos hacia abajo con $props y reutiliza marcado con snippets.

Stores

Comparte estado reactivo entre componentes con stores escribibles y legibles.

Transiciones

Los ayudantes de transición y animación integrados aportan movimiento sin librerías adicionales.

Una breve historia

De proyecto paralelo a framework basado en compilador

  1. 2016

    Svelte 1

    Rich Harris presenta un compilador que traslada el trabajo del framework del runtime al tiempo de compilación.

    16
  2. 2019

    Svelte 3

    Una reescritura centrada en la reactividad y la sintaxis de etiquetas de dólar hace que los componentes sean drásticamente más simples.

    19
  3. 2020

    SvelteKit

    Un framework de aplicaciones oficial añade enrutamiento, renderizado en servidor y adaptadores.

    20
  4. 2024

    Svelte 5

    Las runes reemplazan la reactividad implícita por primitivas explícitas y componibles.

    24
  5. Hoy

    Una alternativa madura

    Svelte es una opción consolidada para sitios sensibles al rendimiento y con mucho contenido.

    Hoy

La guia completa

Svelte: Todo lo que necesitas saber

¿Qué es Svelte?

Svelte es un framework de componentes con un giro particular: es un compilador. En lugar de enviar un runtime que interprete tus componentes en el navegador, Svelte los analiza en tiempo de compilación y genera JavaScript puro que actualiza el DOM directamente. No existe un virtual DOM y casi no hay código del framework en el bundle final.

Este diseño cambia la experiencia del desarrollador. La reactividad es parte del lenguaje, los estilos están encapsulados (scoped) por defecto y las transiciones vienen integradas, por lo que los componentes resultan ser muy breves. La contrapartida es que necesitas un paso de compilación, pero con el tooling moderno, esto ya se da por sentado.

Componentes de archivo único

Un componente de Svelte es un archivo .svelte con un bloque de script, marcado y estilos opcionales con alcance limitado (scoped).

<!-- Card.svelte -->
<script>
  let { title, children } = $props();
</script>

<article class="card">
  <h3>{title}</h3>
  {@render children?.()}
</article>

<style>
  .card {
    border-radius: 1rem;
    padding: 1.5rem;
  }
</style>

Los estilos en un componente tienen un alcance limitado a este por defecto, por lo que la regla .card no puede filtrarse. $props() lee las props pasadas por el padre, y los snippets (children) permiten que un padre pase marcado a un hijo.

Reactividad con runes

Svelte 5 introdujo los runes, primitivas explícitas que hacen que la reactividad sea predecible. $state declara el estado reactivo, $derived computa valores y $effect ejecuta efectos secundarios.

<!-- Search.svelte -->
<script>
  let query = $state("");
  let results = $state([]);

  let hasResults = $derived(results.length > 0);

  $effect(() => {
    if (!query) return;
    const controller = new AbortController();
    fetch(`/api/search?q=${query}`, { signal: controller.signal })
      .then((r) => r.json())
      .then((data) => (results = data))
      .catch(() => {});
    return () => controller.abort();
  });
</script>

<input bind:value={query} placeholder="Search" />

{#if hasResults}
  <ul>
    {#each results as item (item.id)}
      <li>{item.name}</li>
    {/each}
  </ul>
{/if}

Los runes también funcionan en archivos .svelte.js y .svelte.ts, por lo que puedes extraer la lógica reactiva en módulos reutilizables de la misma manera que React utiliza los custom hooks.

Props, eventos y snippets

Las props fluyen hacia abajo y se declaran con $props(). En lugar de un sistema de eventos especial, Svelte 5 utiliza callback props para la comunicación de hijo a padre.

<!-- Child.svelte -->
<script>
  let { label, onselect } = $props();
</script>

<button onclick={() => onselect(label)}>{label}</button>
<!-- Parent.svelte -->
<Child label="Save" onselect={(value) => save(value)} />

Los snippets reemplazan a los slots para regiones de marcado reutilizables, y {@render} los inserta donde desees.

Flujo de control

Svelte tiene bloques de plantilla dedicados para condicionales y bucles, y el bloque #each admite una expresión con clave (keyed expression) para actualizaciones eficientes.

<!-- list.svelte -->
{#if users.length > 0}
  <ul>
    {#each users as user (user.id)}
      <li>{user.name}</li>
    {/each}
  </ul>
{:else}
  <p>No users yet.</p>
{/if}

Debido a que el compilador conoce la estructura, estos bloques generan operaciones de DOM específicas en lugar de un proceso de reconciliación genérico.

Stores y estado compartido

Para el estado compartido entre muchos componentes, Svelte proporciona stores: un store writable mantiene un valor y notifica a los suscriptores, mientras que readable y derived cubren otros casos.

// counter.js
import { writable, derived } from "svelte/store";

export const count = writable(0);
export const double = derived(count, ($count) => $count * 2);
<!-- Display.svelte -->
<script>
  import { count, double } from "./counter.js";
</script>

<p>{$count} doubled is {$double}</p>

El prefijo $ se encarga de suscribirse y cancelar la suscripción automáticamente por ti. Con runes, un módulo .svelte.js que exporte $state puede lograr lo mismo sin la API de stores, algo que muchos proyectos nuevos prefieren para valores globales de la aplicación.

Transiciones y animaciones

El movimiento ya viene integrado. Las directivas transition, animate y in/out añaden movimiento sin necesidad de una librería externa.

<!-- toast.svelte -->
<script>
  import { fade, fly } from "svelte/transition";
  let visible = $state(false);
</script>

<button onclick={() => (visible = !visible)}>Toggle</button>

{#if visible}
  <div transition:fly={{ y: 20, duration: 200 }}>
    Saved!
  </div>
{/if}

Debido a que las transiciones se compilan, son eficientes y compatibles con tree-shaking, además de respetar la preferencia de movimiento reducido del usuario cuando utilizas los helpers integrados.

SvelteKit

SvelteKit es el framework oficial para aplicaciones. Añade enrutamiento basado en archivos, renderizado en el servidor, carga de datos y acciones de formulario sobre Svelte.

src/routes/
├── +page.svelte        # a page
├── +layout.svelte      # shared layout
├── about/+page.svelte  # /about
└── blog/[slug]/+page.js # load data for /blog/:slug

Si estás construyendo algo más que un widget, SvelteKit es el punto de partida recomendado. Se encarga de las convenciones que toda aplicación real necesita para que puedas centrarte en las funcionalidades.

Mejores prácticas

  • Usa runes ($state, $derived, $effect) en el código nuevo.
  • Prefiere $derived para valores computados y reserva $effect para efectos secundarios.
  • Mantén los componentes pequeños y extrae la lógica reutilizable en módulos .svelte.js.
  • Usa bloques {#each} con claves cuando los elementos puedan cambiar de orden.
  • Mantén los estilos con scope por defecto y evita :global a menos que sea necesario.
  • Comparte el estado entre componentes mediante stores o un módulo reactivo.
  • Inicia aplicaciones nuevas con SvelteKit en lugar de configurar el build por tu cuenta.

Errores comunes

  • Usar $effect para calcular un valor que $derived debería gestionar.
  • Olvidar la key en {#each} y romper las actualizaciones de las listas.
  • Mutar una propiedad anidada de un objeto $state de manera que se evite la reactividad en patrones antiguos.
  • Recurrir a un store global cuando el estado local sería suficiente.
  • Asumir que Svelte no tiene runtime en absoluto; tiene uno pequeño.
  • Ignorar la accesibilidad porque el compilador facilita la escritura rápida del markup.

Próximos pasos

Svelte es una forma rápida y elegante de construir interfaces, y SvelteKit lo convierte en un framework de aplicaciones completo. Compara el enfoque basado en compilador con React y Vue, y mantén tus conocimientos de JavaScript al día. Después, construye una aplicación pequeña con un store y una transición para notar la diferencia.

Declarando la reactividad

Svelte 5 hace que la reactividad sea explícita con runes, lo cual funciona en cualquier archivo .js o .ts, no solo dentro de los componentes.

Svelte 5
<script>
  let count = $state(0);
  let double = $derived(count * 2);
</script>
Legacy
<script>
  let count = 0;
  $: double = count * 2;
</script>

Valores derivados

Usa $derived para valores calculados a partir del estado, y $effect solo para efectos secundarios reales.

Preferido
let items = $state([1, 2, 3]);
let total = $derived(
  items.reduce((a, b) => a + b, 0),
);
Evitar
let total = $state(0);
$effect(() => {
  total = items.reduce(
    (a, b) => a + b, 0,
  );
});

Preguntas frecuentes

Preguntas frecuentes

Keep learning

Related topics from the roadmap.

$ comienza a aprender

Listo para aprender Svelte?

Nuestro tutorial interactivo te guia a traves de Svelte paso a paso — con quizzes y codigo real que puedes ejecutar en el navegador.