Back to Journal
Software Development 18 November 2024 11 min read Sheece Gardezi

Svelte 5 Runes: 2-3x Faster Startup, 60-80% Smaller Bundles

Svelte 5 compiles reactivity away at build time. Runes replace the magic $: label with explicit $state, $derived, and $effect primitives that outperform React on every benchmark.

SvelteJavaScriptReactivityFrontendWeb Development
Code on a computer screen showing syntax highlighting
Florian Olivo on Unsplash

Svelte 5 shipped on October 19, 2024. The headline numbers: 2-3x faster startup than React, 60-80% smaller bundles, and a full SvelteKit application that ships under 50KB gzipped. The mechanism behind those numbers is runes — a compiled reactivity system that replaces virtual DOM diffing with direct DOM instructions generated at build time.

No Virtual DOM, No Runtime, 3KB Bundles

Unlike React's runtime diffing or Vue's reactivity proxy system, Svelte compiles components directly to DOM manipulations. No virtual DOM, no reconciliation, no runtime overhead. Basic applications bundle at 3KB — 60-80% smaller than equivalent React applications.

Benchmarks confirm the compiled approach at scale: Svelte 5 applications start 2-3x faster than React equivalents and update 15-30% faster under load. For real-time dashboards displaying sensor data or live geospatial feeds, this difference is perceptible.

Runes: Explicit Reactivity in Five Primitives

Runes replace Svelte's previous "magic" — where any top-level let statement was implicitly reactive — with explicit, intentional reactivity:

runes-comparison.js
// Svelte 4 (implicit reactivity)
let count = 0;
$: doubled = count * 2;

// Svelte 5 (explicit runes)
let count = $state(0);
let doubled = $derived(count * 2);

$effect(() => {
  console.log('Count changed:', count);
});

Core Runes

$state()

Declares reactive state, replacing let for reactive variables

$derived()

Computed values that update when dependencies change

$effect()

Side effects that run when reactive values change

$props()

Component props with optional destructuring

$bindable()

Two-way binding for component props

Implicit Magic Breaks at Scale

Svelte's previous implicit reactivity worked beautifully for small components but created confusion at scale. "Why didn't that update?" became a common debugging question. The magic was delightful until it wasn't predictable.

With Runes, Svelte made a hard choice—it sacrificed a tiny bit of its 'magic' for predictability. As apps got larger, the magic became confusing. Runes explicitly opt-in to reactivity, which makes the code clearer for both humans and the AI assistants helping us write it.
JavaScript Doctor, 2025

The explicit approach also enables better tooling. IDEs can now understand reactivity statically; refactoring tools work correctly; and TypeScript integration is significantly improved.

Benchmark Results: Faster Than Solid, Vue, and Angular Signals

The Svelte team benchmarked runes against every major reactivity system. Svelte 5 outperformed all alternatives on most tests — including the signals implementations in Solid, Vue, and Angular.

Performance Numbers

Startup

2-3x faster than React equivalents

Updates

15-30% faster due to compiled approach

Bundle size

60-80% smaller than React

Memory

Lower overhead without virtual DOM tree

Full SvelteKit app

Often under 50KB gzipped

React: Three Hooks. Svelte: Three Lines.

In React, you constantly ask: "Should this be memoized? Do I need useCallback? Should I wrap this in React.memo?" With Svelte, you write code. No virtual DOM diffing means updates compile to direct DOM instructions.

react-vs-svelte.js
// React: hooks and memoization decisions
const [items, setItems] = useState([]);
const filteredItems = useMemo(() =>
  items.filter(i => i.active), [items]);
const handleClick = useCallback(() =>
  setItems([...items, newItem]), [items]);

// Svelte 5: just write code
let items = $state([]);
let filteredItems = $derived(items.filter(i => i.active));
function handleClick() {
  items.push(newItem);
}

40% Market Share vs. Highest Satisfaction

React holds roughly 40% developer adoption, double Vue's usage. Svelte leads in developer satisfaction. Stack Overflow used Svelte for their 2024 survey results site — a strong signal of trust in the framework's production readiness.

The hiring landscape reflects this divide: developers get paid to write React but enjoy writing Svelte. For teams prioritizing developer experience and performance over ecosystem size, Svelte 5 is increasingly compelling.

TC39 Signals: Runes as a JavaScript Primitive?

The TC39 Signals Proposal aims to add reactive state as a JavaScript language-level primitive. If signals become part of JavaScript itself, Svelte's compiled approach is positioned to leverage native reactivity with zero-overhead wrappers.

Smaller Ecosystem, Faster Development

After migrating dashboard and visualization work from React to SvelteKit, the productivity gains are measurable — less boilerplate, faster development cycles, better runtime performance. For data-intensive applications like geospatial portals, the compiled approach means smoother animations and more responsive interactions.

The ecosystem is smaller than React's, which matters for some use cases. But for teams willing to occasionally build their own components rather than reaching for npm packages, Svelte 5 delivers a development experience that's hard to go back from.

Have a project in mind?

Location

  • Canberra
    ACT, Australia