Lanzamiento oficial de Svelte 5 - Nuevo sistema de reactividad con Runes

2025.12.02

Descripción general de Svelte 5

Svelte 5 es un lanzamiento mayor que representa una evolución fundamental del framework. Con el nuevo sistema de reactividad llamado “Runes”, ahora es posible escribir código más explícito y predecible.

flowchart TB
    subgraph Svelte5["Svelte 5 Cambios principales"]
        subgraph Runes["Runes (Nueva reactividad)"]
            R1["$state() - Declaración de estado reactivo"]
            R2["$derived() - Cálculo de valores derivados"]
            R3["$effect() - Ejecución de efectos secundarios"]
            R4["$props() - Propiedades de componentes"]
            R5["$bindable() - Props con enlace bidireccional"]
        end

        subgraph Perf["Mejora de rendimiento"]
            P1["Hasta 2 veces más rápido"]
            P2["Reducción del tamaño del bundle"]
            P3["Mejora en el uso de memoria"]
            P4["Detección de diferencias más eficiente"]
        end

        subgraph DX["Experiencia del desarrollador"]
            D1["Soporte mejorado de TypeScript"]
            D2["Reactividad más explícita"]
            D3["Facilidad de depuración"]
            D4["Ruta de migración gradual"]
        end
    end

Fundamentos de Runes

$state - Estado reactivo





Name: {user.name}

    {#each items as item}
  • {item}
  • {/each}

$derived - Estado derivado



Count: {count}

Doubled: {doubled}

Stats: Sum={stats.sum}, Avg={stats.avg}

$effect - Efectos secundarios


Propiedades de componentes

$props








$bindable - Enlace bidireccional




 value = e.currentTarget.value}
/>





Hello, {name}!

Snippets




{#snippet row(item)}
  
    {item.name}
    ${item.price}
  
{/snippet}

{#snippet header()}
  
    Name
    Price
  
{/snippet}



    {@render header()}
  
    {#each items as item (item.id)}
      {@render row(item)}
    {/each}
  
  
  

Comparación Svelte 4 vs Svelte 5

FunciónSvelte 4Svelte 5
Variable reactivalet count = 0;let count = $state(0);
Valor derivado$: doubled = c * 2;let doubled = $derived(c*2);
Efecto secundario$: console.log(c);$effect(() => log(count));
Propiedadexport let name;let { name } = $props();

Manejo de eventos














...
console.log(e.detail)} />

Componentes de clase













Migración

Migración automática

# Usar svelte-migrate
npx sv migrate svelte-5

# O archivos específicos
npx sv migrate svelte-5 src/components/Button.svelte

Migración gradual







// svelte.config.js
export default {
  compilerOptions: {
    // Desactivar Runes para operar en modo legacy
    runes: false
  }
};

Integración con SvelteKit

// +page.svelte
<script>
  let { data } = $props();

  let posts = $state(data.posts);
  let search = $state('');

  let filtered = $derived(
    posts.filter(p => p.title.toLowerCase().includes(search.toLowerCase()))
  );
</script>

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

{#each filtered as post (post.id)}
  <article>
    <h2>{post.title}</h2>
    <p>{post.excerpt}</p>
  </article>
{/each}

Mejora de rendimiento

Comparación de rendimiento de Svelte 5 (js-framework-benchmark)

ElementoSvelte 4Svelte 5
Velocidad de operaciones DOM1.0x0.5x (2 veces más rápido)
Tamaño del bundle (Hello World)3.2KB2.8KB (-12.5%)
Uso de memoria100%70% (-30%)

Resumen

FunciónSvelte 4Svelte 5
Variable reactivalet x = 0let x = $state(0)
Valor derivado$: y = x * 2let y = $derived(x * 2)
Efecto secundario$: { ... }$effect(() => { ... })
Propiedadexport let proplet { prop } = $props()
Slot<slot />{@render children()}
Eventoon:clickonclick

Enlaces de referencia

← Volver a la lista