svelte
✓Verified·Scanned 2/18/2026
Avoid common Svelte mistakes — reactivity triggers, store subscriptions, and SvelteKit SSR gotchas.
from clawhub.ai·v2b40ddd·3.3 KB·0 installs
Scanned from 1.0.0 at 2b40ddd · Transparency log ↗
$ vett add clawhub.ai/ivangdavila/svelte
Reactivity Triggers
- Assignment triggers reactivity —
arr = arrafter push, or usearr = [...arr, item] - Array methods don't trigger —
arr.push()needs reassignment:arr = arr - Object mutation same issue —
obj.key = val; obj = objor spread:obj = {...obj, key: val} $:reactive statements run on dependency change — but only top-level assignments tracked
Reactive Statements
$:runs when dependencies change — list all dependencies used$: { }block for multiple statements — all run together$:order matters — later statements can depend on earlier- Avoid side effects in
$:— prefer derived values, useonMountfor effects
Stores
$storeauto-subscribes in component — automatic unsubscribe on destroy- Manual subscribe needs unsubscribe —
const unsub = store.subscribe(v => ...); onDestroy(unsub) writablefor read/write —readablefor external data sourcesderivedfor computed values —derived(store, $s => $s * 2)
Component Lifecycle
onMountruns after first render — return cleanup function- No access to DOM before
onMount—documentetc. not available in SSR beforeUpdate/afterUpdatefor DOM sync — rarely neededtick()to wait for DOM update —await tick()after state change
Props
export let propNameto declare — required by defaultexport let propName = defaultfor optional — default value if not passed- Props are reactive — component re-renders on change
$$propsand$$restPropsfor pass-through — but explicit props preferred
Events
createEventDispatcherfor custom events —dispatch('eventName', data)on:eventNameto listen —on:click,on:customEventon:click|preventDefaultmodifiers —|stopPropagation,|once- Event forwarding:
on:clickwithout handler — forwards to parent
SvelteKit
+page.sveltefor pages —+page.server.tsfor server-only loadloadfunction for data fetching — runs on server and client navigation$app/storesfor page, navigating, etc. —$page.params,$page.urlformactions for mutations — progressive enhancement, works without JS
SSR Gotchas
browserfrom$app/environment— check before using window/documentonMountonly runs client-side — safe for browser APIs- Stores initialized on server shared between requests — use context for request-specific
fetchin load is special — relative URLs work, credentials handled
Svelte 5 Runes
$state()replacesletfor reactivity —let count = $state(0)$derivedreplaces$:for computed —let doubled = $derived(count * 2)$effectfor side effects — replaces$:with side effects- Runes are opt-in per file — can mix with Svelte 4 syntax
Common Mistakes
- Destructuring props loses reactivity —
let { prop } = $props()in Svelte 5, or don't destructure in 4 - Store value vs store —
$storefor value,storefor subscribe/set - Transition on conditional —
{#if show}<div transition:fade>not on wrapper - Key block for re-render —
{#key value}...{/key}destroys and recreates