返回 Skill 列表
extension
分类: 开发与工程无需 API Key

svelte5-best-practices

Svelte 5 的符文、代码片段、SvelteKit 模式以及 TypeScript 和组件开发的现代最佳实践。在编写、审查或重构 Svelte 5 组件和 SvelteKit 应用程序时使用。触发条件包括:Svelte 组件、符文($state, $derived, $effect, $props, $bindable, $inspect)、代码片段({#snippet}, {@render})、事件处理、SvelteKit 数据加载、表单操作、从 Svelte 4 到 Svelte 5 的迁移、store 到符文的迁移、插槽到代码片段的迁移、TypeScript 属性类型定义、泛型组件、SSR 状态隔离、性能优化,或组件测试。

person作者: jakexiaohubgithub

Svelte 5 Best Practices

Quick Reference

| Topic | When to Use | Reference | |-------|-------------|-----------| | Runes | $state, $derived, $effect, $props, $bindable, $inspect | runes.md | | Snippets | Replacing slots, {#snippet}, {@render} | snippets.md | | Events | onclick handlers, callback props, context API | events.md | | TypeScript | Props typing, generic components | typescript.md | | Migration | Svelte 4 to 5, stores to runes | migration.md | | SvelteKit | Load functions, form actions, SSR, page typing | sveltekit.md | | Performance | Universal reactivity, avoiding over-reactivity, streaming | performance.md |

Essential Patterns

Reactive State

<script>
  let count = $state(0);           // Reactive state
  let doubled = $derived(count * 2); // Computed value
</script>

Component Props

<script>
  let { name, count = 0 } = $props();
  let { value = $bindable() } = $props(); // Two-way binding
</script>

Snippets (replacing slots)

<script>
  let { children, header } = $props();
</script>

{@render header?.()}
{@render children()}

Event Handlers

<!-- Svelte 5: use onclick, not on:click -->
<button onclick={() => count++}>Click</button>

Callback Props (replacing createEventDispatcher)

<script>
  let { onclick } = $props();
</script>

<button onclick={() => onclick?.({ data })}>Click</button>

Common Mistakes

  1. Using let without $state - Variables are not reactive without $state()
  2. Using $effect for derived values - Use $derived instead
  3. Using on:click syntax - Use onclick in Svelte 5
  4. Using createEventDispatcher - Use callback props instead
  5. Using <slot> - Use snippets with {@render}
  6. Forgetting $bindable() - Required for bind: to work
  7. Setting module-level state in SSR - Causes cross-request leaks
  8. Sequential awaits in load functions - Use Promise.all for parallel requests