Bird
Raised Fist0
Svelteframework~8 mins

Writable stores in Svelte - Performance & Optimization

Choose your learning style10 modes available
Performance: Writable stores
MEDIUM IMPACT
Writable stores affect how state changes propagate to the UI, impacting rendering speed and responsiveness.
Updating a writable store frequently inside a tight loop
Svelte
import { writable } from 'svelte/store';
const count = writable(0);

function updateCount() {
  let lastValue;
  for (let i = 0; i < 1000; i++) {
    lastValue = i;
  }
  count.set(lastValue);
}
Only one store update triggers a single re-render after the loop completes.
📈 Performance GainSingle re-render instead of 1000, greatly improving interaction responsiveness.
Updating a writable store frequently inside a tight loop
Svelte
import { writable } from 'svelte/store';
const count = writable(0);

function updateCount() {
  for (let i = 0; i < 1000; i++) {
    count.set(i);
  }
}
Each .set triggers a store update causing multiple re-renders and layout recalculations.
📉 Performance CostTriggers 1000 re-renders and layout recalculations, blocking UI responsiveness.
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Frequent writable store.set callsMultiple updatesMany reflowsHigh paint cost[X] Bad
Single writable store.set after batch updateSingle updateSingle reflowLow paint cost[OK] Good
Rendering Pipeline
Writable store updates notify subscribed components, triggering reactive updates that flow through style calculation, layout, paint, and composite stages.
→Style Calculation
→Layout
→Paint
→Composite
⚠️ BottleneckLayout and Paint stages become expensive when many store updates cause frequent re-renders.
Core Web Vital Affected
INP
Writable stores affect how state changes propagate to the UI, impacting rendering speed and responsiveness.
Optimization Tips
1Avoid calling writable store.set repeatedly in quick succession.
2Batch multiple state changes into a single writable store update.
3Use writable stores only for state that truly needs to trigger UI updates.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance risk of calling writable store.set many times in a short period?
AIt causes many re-renders and layout recalculations, slowing down the UI.
BIt increases the bundle size significantly.
CIt causes the browser to block network requests.
DIt disables CSS animations.
DevTools: Performance
How to check: Record a performance profile while interacting with the app. Look for frequent scripting and rendering tasks triggered by store updates.
What to look for: Multiple repeated layout and paint events indicate excessive store updates causing performance issues.

Practice

(1/5)
1. What is the main purpose of a writable store in Svelte?
easy
A. To style components dynamically
B. To hold data that can be changed and shared across components
C. To create static, unchangeable data
D. To handle routing between pages

Solution

  1. Step 1: Understand writable store role

    Writable stores in Svelte are designed to hold data that can be changed and shared reactively.
  2. Step 2: Compare options

    Only To hold data that can be changed and shared across components correctly describes writable stores as changeable and shareable data holders.
  3. Final Answer:

    To hold data that can be changed and shared across components -> Option B
  4. Quick Check:

    Writable store = changeable shared data [OK]
Hint: Writable stores hold changeable shared data [OK]
Common Mistakes:
  • Confusing writable stores with static data
  • Thinking writable stores handle styling or routing
  • Assuming writable stores cannot be updated
2. Which of the following is the correct way to create a writable store in Svelte?
easy
A. import { writable } from 'svelte/store'; const count = writable(0);
B. import { readable } from 'svelte/store'; const count = readable(0);
C. const count = writable(0); without import
D. import { store } from 'svelte'; const count = store(0);

Solution

  1. Step 1: Check import statement

    The writable store must be imported from 'svelte/store' using { writable }.
  2. Step 2: Verify store creation syntax

    Creating a writable store uses writable(initialValue), so import { writable } from 'svelte/store'; const count = writable(0); is correct.
  3. Final Answer:

    import { writable } from 'svelte/store'; const count = writable(0); -> Option A
  4. Quick Check:

    Writable store import and creation = import { writable } from 'svelte/store'; const count = writable(0); [OK]
Hint: Writable stores need import { writable } from 'svelte/store' [OK]
Common Mistakes:
  • Using readable instead of writable
  • Forgetting to import writable
  • Wrong import path or syntax
3. Given this code:
import { writable } from 'svelte/store';
const count = writable(5);
count.update(n => n + 3);
console.log($count);

What will be logged to the console?
medium
A. Error: $count is undefined
B. 8
C. 3
D. 5

Solution

  1. Step 1: Understand store update

    The update method changes the store value from 5 to 8 by adding 3.
  2. Step 2: Check usage of $count outside component

    The $ prefix to access store value works only inside Svelte components, not in plain JS code like console.log.
  3. Final Answer:

    Error: $count is undefined -> Option A
  4. Quick Check:

    $ prefix only works inside components [OK]
Hint: Use $ only inside components, not in plain JS [OK]
Common Mistakes:
  • Assuming $count works outside components
  • Ignoring that update changes value
  • Expecting console.log to show store value directly
4. What is wrong with this code snippet?
import { writable } from 'svelte/store';
const count = writable(0);
count.set(count + 1);
medium
A. The initial value must be a string
B. You cannot use set on writable stores
C. Missing import for set function
D. count + 1 is invalid because count is a store, not a number

Solution

  1. Step 1: Identify what count represents

    count is a writable store object, not a number, so count + 1 is invalid.
  2. Step 2: Correct way to update store

    You must use count.update(n => n + 1) or count.set(value) with a number, not count + 1.
  3. Final Answer:

    count + 1 is invalid because count is a store, not a number -> Option D
  4. Quick Check:

    Store object + number is invalid [OK]
Hint: Use update or get value before set, not store + number [OK]
Common Mistakes:
  • Trying to add number directly to store object
  • Forgetting to use update for changes
  • Assuming set needs import separately
5. You want to create a writable store that holds a number starting at 10. Then you want to double its value only if it is less than 50. Which code correctly does this?
hard
A. const num = writable(10); num.set(20);
B. const num = writable(10); num.set(n => n < 50 ? n * 2 : n);
C. const num = writable(10); num.update(n => n < 50 ? n * 2 : n);
D. const num = writable(10); num.update(n => n * 2);

Solution

  1. Step 1: Create writable store with initial value 10

    Using writable(10) correctly sets the initial number.
  2. Step 2: Use update with condition to double if less than 50

    update receives current value n and returns n*2 if n < 50, else n unchanged, matching requirement.
  3. Step 3: Check other options

    const num = writable(10); num.set(n => n < 50 ? n * 2 : n); wrongly uses set with a function, which is invalid. const num = writable(10); num.update(n => n * 2); doubles unconditionally. const num = writable(10); num.set(20); sets fixed 20 ignoring condition.
  4. Final Answer:

    const num = writable(10); num.update(n => n < 50 ? n * 2 : n); -> Option C
  5. Quick Check:

    Use update with condition to change value [OK]
Hint: Use update(fn) with condition to change store value [OK]
Common Mistakes:
  • Using set with a function instead of a value
  • Not applying condition inside update
  • Setting fixed value ignoring condition
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard