name: svelte-best-practices description: Svelte 5 runes, component patterns, stores, transitions, and SvelteKit routing. Use when writing or reviewing Svelte code.
Svelte 5 Best Practices
Runes Only
Svelte 5 uses runes. No legacy patterns.
Use: $state, $derived, $effect, $props, $bindable
Don't use: export let, $:, on:click, writable, readable, derived
<!-- Correct -->
<script lang="ts">
let count = $state(0);
let doubled = $derived(count * 2);
function increment() {
count++;
}
</script>
<button onclick={increment}>{doubled}</button>
Component Architecture
- One component per file
- Props via
$props()with TypeScript types - Events via callback props (not
createEventDispatcher) - Slots via
{@render children()} - Reactive declarations via
$derived, not$:
Composable Pattern (createX())
All stateful logic lives in .svelte.ts files using the createX() pattern:
export function createCounter(initial = 0) {
let count = $state(initial);
let doubled = $derived(count * 2);
return {
get count() { return count; },
get doubled() { return doubled; },
increment() { count++; },
reset() { count = initial; },
};
}
Key rules:
- Return readonly getters for state
- Keep state private inside the closure
- Export types alongside the function
- Use
.svelte.tsextension for files containing runes
Context Pattern
Shared state uses Symbol keys with centralized factories:
// sidebar-context.svelte.ts
const SidebarContext = Symbol('sidebar');
export function setSidebar(state: SidebarState) {
setContext(SidebarContext, state);
}
export function getSidebar(): SidebarState {
return getContext(SidebarContext);
}
Reactivity Rules
$statefor mutable reactive state$derivedfor computed values (never assign)$effectfor side effects (return cleanup function)$effect.prefor effects that need to run before DOM update$props()for component inputs$bindable()for two-way binding props
SvelteKit Conventions
+page.sveltefor routes+layout.sveltefor shared layout+page.server.tsfor server-side data loading+error.sveltefor error boundaries- Use
goto()for programmatic navigation - Use
invalidateAll()to refresh data
Testing
@testing-library/sveltefor component testsvitestfor unit tests- Test user interactions, not implementation details
- Mock external dependencies (API calls, stores)
Skills similaires
Expert Next.js App Router
Developpement
Un skill qui transforme Claude en expert Next.js App Router.
Claude CodeCursoradvanced
890
234
3,180
Générateur de README
Developpement
Crée des README.md professionnels et complets pour vos projets.
claudeCursorWindsurfbeginner
259
72
1,081
Rédacteur de Documentation API
Developpement
Génère de la documentation API complète au format OpenAPI/Swagger.
claudeCursorWindsurfintermediate
156
44
941