Visão Geral do Svelte 5
O Svelte 5 é um lançamento major que representa uma evolução fundamental do framework. Com o novo sistema de reatividade chamado “Runes”, agora é possível escrever código mais explícito e previsível.
flowchart TB
subgraph Svelte5["Svelte 5 Principais Mudanças"]
subgraph Runes["Runes (Nova Reatividade)"]
R1["$state() - Declaração de estado reativo"]
R2["$derived() - Cálculo de valores derivados"]
R3["$effect() - Execução de efeitos colaterais"]
R4["$props() - Propriedades do componente"]
R5["$bindable() - Props com binding bidirecional"]
end
subgraph Perf["Melhorias de Desempenho"]
P1["Até 2x mais rápido"]
P2["Redução do tamanho do bundle"]
P3["Melhoria no uso de memória"]
P4["Detecção de diferenças mais eficiente"]
end
subgraph DX["Experiência do Desenvolvedor"]
D1["Suporte aprimorado a TypeScript"]
D2["Reatividade mais explícita"]
D3["Facilidade de debug"]
D4["Caminho de migração gradual"]
end
end
Fundamentos dos Runes
$state - Estado Reativo
Name: {user.name}
{#each items as item}
- {item}
{/each}
$derived - Estado Derivado
Count: {count}
Doubled: {doubled}
Stats: Sum={stats.sum}, Avg={stats.avg}
$effect - Efeitos Colaterais
Propriedades de Componentes
$props
$bindable - Binding Bidirecional
value = e.currentTarget.value}
/>
Hello, {name}!
Snippets
{#snippet row(item)}
{item.name}
R${item.price}
{/snippet}
{#snippet header()}
Name
Price
{/snippet}
{@render header()}
{#each items as item (item.id)}
{@render row(item)}
{/each}
Comparação Svelte 4 vs Svelte 5
| Funcionalidade | Svelte 4 | Svelte 5 |
|---|---|---|
| Variável reativa | let count = 0; | let count = $state(0); |
| Valor derivado | $: doubled = c * 2; | let doubled = $derived(c*2); |
| Efeito colateral | $: console.log(c); | $effect(() => log(count)); |
| Propriedade | export let name; | let { name } = $props(); |
Manipulação de Eventos
console.log(e.detail)} />
Componentes de Classe
Migração
Migração Automática
# Usando svelte-migrate
npx sv migrate svelte-5
# Ou arquivo específico
npx sv migrate svelte-5 src/components/Button.svelte
Migração Gradual
// svelte.config.js
export default {
compilerOptions: {
// Desabilitar Runes para operar em modo legado
runes: false
}
};
Integração com 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}
Melhorias de Desempenho
Comparação de Desempenho Svelte 5 (js-framework-benchmark)
| Item | Svelte 4 | Svelte 5 |
|---|---|---|
| Velocidade de operação DOM | 1.0x | 0.5x (2x mais rápido) |
| Tamanho do bundle (Hello World) | 3.2KB | 2.8KB (-12.5%) |
| Uso de memória | 100% | 70% (-30%) |
Resumo
| Funcionalidade | Svelte 4 | Svelte 5 |
|---|---|---|
| Variável reativa | let x = 0 | let x = $state(0) |
| Valor derivado | $: y = x * 2 | let y = $derived(x * 2) |
| Efeito colateral | $: { ... } | $effect(() => { ... }) |
| Propriedade | export let prop | let { prop } = $props() |
| Slot | <slot /> | {@render children()} |
| Evento | on:click | onclick |