# Svelte 5 Runes Complete Guide ## Overview Runes are Svelte 5's new reactivity system. They replace the old `$:` reactive statements and `export let` declarations with explicit, predictable primitives. --- ## 📦 `$state` - Reactive State ### Basic Usage ```svelte ``` ### Deep Reactivity ```svelte ``` ### `$state.raw` - Shallow Reactivity ```svelte ``` ### `$state.snapshot` - Get Plain Object ```svelte ``` --- ## 🔗 `$derived` - Computed Values ### Basic Derived ```svelte
{count} × 2 = {doubled}
{doubled} × 2 = {quadrupled}
``` ### Complex Derived with `$derived.by` ```svelte ``` ### Derived from Multiple Sources ```svelte ``` --- ## ⚡ `$effect` - Side Effects ### Basic Effect ```svelte ``` ### Effect with Cleanup ```svelte ``` ### `$effect.pre` - Before DOM Update ```svelte ``` ### `$effect.tracking` - Check if Reactive ```svelte ``` ### `$effect.root` - Untracked Effect Scope ```svelte ``` --- ## 🎯 `$props` - Component Props ### Basic Props ```svelte{name} is {age} years old
``` ### Optional Props with Defaults ```svelte{greeting}, {name}! You are {age}.
``` ### Rest Props ```svelte ``` ### Children as Props (Snippets) ```svelteName: {name}
``` ### Bindable with Fallback ```svelte ``` --- ## 🎨 `$inspect` - Development Debugging ### Basic Inspect ```svelte ``` ### Custom Inspect Handler ```svelte ``` ### Breakpoint on Change ```svelte ``` --- ## 🏪 Class-Based State with `$state` ```svelte {counter.count} (doubled: {counter.doubled}) ``` --- ## ⚠️ Common Mistakes ### ❌ Wrong: Destructuring Loses Reactivity ```svelte ``` ### ❌ Wrong: Effect Without Dependencies ```svelte ``` ### ❌ Wrong: Mutating Derived Values ```svelte ``` --- ## 📊 Runes Comparison Table | Svelte 4 | Svelte 5 | Purpose | |----------|----------|---------| | `export let x` | `let { x } = $props()` | Props | | `let x = 0` | `let x = $state(0)` | Reactive state | | `$: y = x * 2` | `let y = $derived(x * 2)` | Computed | | `$: { ... }` | `$effect(() => { ... })` | Side effects | | `$$props` | `$props()` with rest | All props | | `bind:value` | `$bindable()` | Two-way binding |