svelte5-best-practices
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSvelte 5 Best Practices
Svelte 5 最佳实践
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 |
| 主题 | 适用场景 | 参考文档 |
|---|---|---|
| Runes | $state、$derived、$effect、$props、$bindable、$inspect | runes.md |
| 代码片段 | 替代Slots、{#snippet}、{@render} | snippets.md |
| 事件 | onclick 处理器、回调属性、Context API | events.md |
| TypeScript | 属性类型定义、通用组件 | typescript.md |
| 迁移 | Svelte 4 转 5、Stores 转 Runes | migration.md |
| SvelteKit | 加载函数、表单操作、SSR、页面类型定义 | sveltekit.md |
| 性能优化 | 通用响应式、避免过度响应式、流式处理 | performance.md |
Essential Patterns
核心模式
Reactive State
响应式状态
svelte
<script>
let count = $state(0); // Reactive state
let doubled = $derived(count * 2); // Computed value
</script>svelte
<script>
let count = $state(0); // 响应式状态
let doubled = $derived(count * 2); // 计算值
</script>Component Props
组件属性
svelte
<script>
let { name, count = 0 } = $props();
let { value = $bindable() } = $props(); // Two-way binding
</script>svelte
<script>
let { name, count = 0 } = $props();
let { value = $bindable() } = $props(); // 双向绑定
</script>Snippets (replacing slots)
代码片段(替代Slots)
svelte
<script>
let { children, header } = $props();
</script>
{@render header?.()}
{@render children()}svelte
<script>
let { children, header } = $props();
</script>
{@render header?.()}
{@render children()}Event Handlers
事件处理器
svelte
<!-- Svelte 5: use onclick, not on:click -->
<button onclick={() => count++}>Click</button>svelte
<!-- Svelte 5:使用 onclick,而非 on:click -->
<button onclick={() => count++}>点击</button>Callback Props (replacing createEventDispatcher)
回调属性(替代createEventDispatcher)
svelte
<script>
let { onclick } = $props();
</script>
<button onclick={() => onclick?.({ data })}>Click</button>svelte
<script>
let { onclick } = $props();
</script>
<button onclick={() => onclick?.({ data })}>点击</button>Common Mistakes
常见错误
- Using without
let- Variables are not reactive without$state$state() - Using for derived values - Use
$effectinstead$derived - Using syntax - Use
on:clickin Svelte 5onclick - Using - Use callback props instead
createEventDispatcher - Using - Use snippets with
<slot>{@render} - Forgetting - Required for
$bindable()to workbind: - Setting module-level state in SSR - Causes cross-request leaks
- Sequential awaits in load functions - Use for parallel requests
Promise.all
- 使用但未加
let- 变量如果不使用$state则不具备响应式$state() - 使用处理派生值 - 应改用
$effect$derived - 使用语法 - Svelte 5 中请使用
on:clickonclick - 使用- 应改用回调属性
createEventDispatcher - 使用- 应结合
<slot>使用代码片段{@render} - 忘记- 要使
$bindable()生效必须添加bind: - 在SSR中设置模块级状态 - 会导致跨请求数据泄露
- 在加载函数中使用顺序await - 应使用并行请求
Promise.all