Svelte
07 / 07

Performance Optimization

Svelte Performance Optimization

Svelte is already highly optimized by default since it compiles components to efficient vanilla JavaScript. However, there are techniques to optimize further:

Keyed Each Blocks

<script>
  let items = [
    { id: 1, name: 'Item 1' },
    { id: 2, name: 'Item 2' },
    { id: 3, name: 'Item 3' }
  ];
</script>

<!-- ❌ Without key - recreates all nodes -->
{#each items as item}
  <div>{item.name}</div>
{/each}

<!-- ✅ With key - only updates changed items -->
{#each items as item (item.id)}
  <div>{item.name}</div>
{/each}

<!-- With index and key -->
{#each items as item, index (item.id)}
  <div>{index + 1}. {item.name}</div>
{/each}

Immutable Data

<svelte:options immutable={true} />

<script>
  // With immutable option, Svelte uses reference equality
  // More efficient for components with many props
  export let items;
  
  // Parent must create new reference
  // items = [...items, newItem];  ✅
  // items.push(newItem);           ❌ Won't detect change
</script>

Virtual Lists

// Use svelte-virtual-list for large lists
<script>
  import VirtualList from 'svelte-virtual-list';
  
  let items = Array.from({ length: 10000 }, (_, i) => ({
    id: i,
    name: `Item ${i}`
  }));
</script>

<VirtualList {items} let:item>
  <div class="item">
    {item.name}
  </div>
</VirtualList>

Code Splitting

<script>
  import { onMount } from 'svelte';
  
  let HeavyComponent;
  let showHeavy = false;
  
  async function loadHeavyComponent() {
    const module = await import('./HeavyComponent.svelte');
    HeavyComponent = module.default;
    showHeavy = true;
  }
</script>

<button on:click={loadHeavyComponent}>Load Heavy Component</button>

{#if showHeavy && HeavyComponent}
  <svelte:component this={HeavyComponent} />
{/if}

Keep your own version of these notes — editable, searchable, and organised by your stack.

Start free