본문으로 건너뛰기
cccskills
무료GitHub에 공개

web-framework-svelte

Svelte 5 runes — $state, $derived, $effect, $props, $bindable, snippets, callback props, context. Load when writing Svelte 5 components or reactive modules.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(7)

  • SKILL.md9.4 KB
  • examples/advanced.md12.1 KB
  • examples/core.md10.8 KB
  • examples/events.md7.9 KB
  • examples/snippets.md6.6 KB
  • metadata.yaml384 B
  • reference.md6.4 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Svelte 5 Patterns

Quick Guide: Runes make reactivity explicit and portable out of .svelte files. $state for values that change, $derived for everything computed from them, $effect only for reaching outside the component. Snippets replace slots, callback props replace createEventDispatcher, and onclick replaces on:click. The Svelte 4 forms still compile, so nothing flags them.

Detailed Resources:

  • examples/core.md — $state, $state.raw, $derived, $props, $bindable, $effect, $effect.pre
  • examples/snippets.md — children, named snippets as props, parameters, optional and recursive snippets
  • examples/events.md — element events, callback props, forwarding, window events, composing handlers
  • examples/advanced.md — $inspect, context, shared state modules, class-based state, $state.snapshot, $state.eager
  • reference.md — rune cheat sheet, Svelte 4 → 5 migration table, decision trees, component template

Which path applies

  • Inside a .svelte component — every rune is available, props arrive through $props(), and teardown belongs in the function an $effect returns.
  • Inside a .svelte.ts or .svelte.js module — $state and $derived work, but a reassigned export does not propagate to importers, because the binding is copied at import. Export an object or a class holding $state fields instead: examples/advanced.md.

<critical_requirements>

Before writing Svelte code

Declare changing values with $state and compute from them with $derived. A $derived recomputes lazily and cannot fall out of step; the same value maintained by an $effect updates after the DOM has already painted the old one.

Pass composable markup as snippets — {#snippet} declares it, {@render} renders it. Snippets are typed, take parameters, and can be passed as props; <slot> did none of that.

Let a child notify its parent through a callback prop — onsave, onselect. The signature is checked at the call site, where a dispatched event's payload was not.

Reach for $state.raw() when a value is replaced wholesale rather than mutated. It skips the deep proxy, which is the whole cost on a large array that only ever gets reassigned.

Reach for createContext<T>() over setContext/getContext. It hands back a typed [get, set] pair with the key minted for you, so no consumer casts and no two libraries collide on a string key — examples/advanced.md has it.

</critical_requirements>


Auto-detection: Svelte 5, runes, $state, $derived, $effect, $props, $bindable, $inspect, .svelte, .svelte.ts, {#snippet}, {@render}, Snippet, createContext, setContext, getContext, $state.raw, $state.snapshot, $state.eager, $derived.by, $effect.pre, ClassValue

Applies to:

  • Component state, derived values and side effects with runes
  • Props, defaults, rest props and two-way binding with $bindable
  • Composition with snippets, including snippets passed as props
  • Event handling and parent-child communication
  • Context, shared state modules and class-based reactive state

Handled elsewhere:

  • Styling — a <style> block is scoped by the compiler, and which CSS approach fills it is not settled here
  • Routing, server-side loading and form submission — a meta-framework's concern, whichever one is in use
  • Server-state caching and invalidation
  • Test doubles for the network

<philosophy>

Philosophy

Svelte 4 inferred reactivity from position: a let at the top level of a component was reactive, $: re-ran on assignment, and neither meant anything in a .ts file. Runes replace that with a marker on the value itself, so the same declaration behaves identically in a component, a module and a class field.

The ordering that follows is: $derived for anything computable, an event handler for anything a user triggers, and $effect only for what is genuinely outside the component — a canvas, a third-party widget, a subscription. An $effect that assigns to $state is a $derived written the long way round, and it runs after the DOM update rather than before it.

</philosophy>
<patterns>

Core patterns

Pattern 1: $state

$state makes a value reactive and, for objects and arrays, deeply so — push and property assignment are both tracked, with no immutable update dance.

<script lang="ts">
  let count = $state(0);
  let todos = $state<Todo[]>([]);

  function addTodo(text: string) {
    todos.push({ done: false, text });
  }
</script>

Full code: examples/core.md


Pattern 2: $derived

$derived takes an expression, $derived.by a function for anything longer. Both recompute only when a dependency actually changed.

<script lang="ts">
  let doubled = $derived(count * 2);

  let stats = $derived.by(() => ({
    isEven: count % 2 === 0,
    isPositive: count > 0,
  }));
</script>

Full code: examples/core.md


Pattern 3: $props

Props are destructured out of $props() with defaults and rest, and typed by an interface.

<script lang="ts">
  interface Props {
    name: string;
    role?: string;
    class?: string;
  }

  let { name, role = 'member', ...rest }: Props = $props();
  let initials = $derived(name.split(' ').map((n) => n[0]).join(''));
</script>

Destructuring $props() is the one place it is safe — the compiler keeps the bindings live. Destructuring a $state object does not.

Full code: examples/core.md


Pattern 4: $bindable

$bindable marks a prop the child may write back through bind:. Worth it for form primitives; for everything else a callback prop keeps the data flowing one way.

<!-- text-input.svelte -->
<script lang="ts">
  let { value = $bindable(''), placeholder = '' }: Props = $props();
</script>

<input bind:value {placeholder} />

<!-- parent.svelte -->
<TextInput bind:value={searchQuery} placeholder="Search..." />

Full code: examples/core.md


Pattern 5: $effect

An effect reaches outside the component; the function it returns is the teardown, run before the next execution and on unmount.

<script lang="ts">
  $effect(() => {
    const timer = setTimeout(() => search(query), DEBOUNCE_MS);
    return () => clearTimeout(timer);
  });
</script>

Anything of the form $effect(() => { x = f(y) }) is a $derived. Anything triggered by a click is an event handler. Anything you wanted to log is $inspect.

Full code: examples/core.md


Pattern 6: Snippets

{#snippet} declares a block of markup and {@render} renders it. Content between a component's tags becomes its children snippet automatically; anything else is a prop typed Snippet.

<script lang="ts">
  import type { Snippet } from 'svelte';
  let { title, children, footer }: { title: string; children: Snippet; footer?: Snippet } = $props();
</script>

<h2>{title}</h2>
{@render children()}
{#if footer}{@render footer()}{/if}

Full code: examples/snippets.md


Pattern 7: Events

Element events are plain attributes. Component events are callback props, optional ones called with ?.().

<script lang="ts">
  let { color, onchange, onreset }: Props = $props();
</script>

<button onclick={() => onchange?.('red')}>Red</button>
{#if onreset}<button onclick={onreset}>Reset</button>{/if}

Full code: examples/events.md

</patterns>

<red_flags>

Red flags

Breaks at runtime:

  • Destructuring a $state object — the values are read once at destructure time and never again
  • Mutating a $state.raw value — only reassignment is tracked, which is the trade it exists to make
  • setContext called from an event handler or an $effect — context is only settable during component initialisation
  • $effect created outside component or module initialisation — calling it from an event handler is a runtime error rather than a silent no-op; $effect.root() is how an effect scope gets opened by hand, and it hands back its own cleanup
  • State read after an await inside an $effect — those reads are not tracked, so the effect never re-runs for them
  • A cleanup function returned from $derived — only $effect runs one
  • $effect relied on during server rendering — it runs in the browser only

Surprising behaviour:

  • Every Svelte 4 form still compiles: export let, $:, <slot>, createEventDispatcher, on:click, <svelte:component this={X}>. Nothing warns, so a file can be half-migrated and look fine
  • A $state value is a proxy, not the object you passed — $state.snapshot() before serialising or handing it to a library that compares identity
  • A $derived result is not deeply reactive; only $state creates the proxy
  • Fallback values in $props() are not proxied either
  • $effect runs after the DOM update — $effect.pre is the hook for measuring before it
  • $inspect compiles to nothing in production, so it is a debugging tool rather than logging
  • Svelte 5 delegates some events at the root, which changes what stopPropagation() reaches

</red_flags>

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Hugging Face Inference SDK patterns for TypeScript/Node.js — InferenceClient setup, chat completion, text generation, streaming, embeddings, image generation, audio transcription, translation, summarization, and Inference Endpoints

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

agents-inc/skills252026년 10월 17일 업데이트

LiteLLM proxy server setup, TypeScript client patterns via OpenAI SDK, model routing, fallbacks, load balancing, spend tracking, virtual keys, and production deployment

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

agents-inc/skills252026년 10월 17일 업데이트

Serverless GPU compute platform for AI model deployment — web endpoints, GPU functions, model serving, and TypeScript client patterns

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

agents-inc/skills252026년 10월 17일 업데이트

Local LLM inference with the Ollama JavaScript client -- chat, streaming, tool calling, vision, embeddings, structured output, model management, and OpenAI-compatible endpoint

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

agents-inc/skills252026년 10월 17일 업데이트

Replicate SDK patterns for TypeScript/Node.js -- client setup, predictions, streaming, webhooks, file handling, model versioning, deployments, and training

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

agents-inc/skills252026년 10월 17일 업데이트

Together AI SDK patterns for TypeScript — client setup, chat completions, streaming, structured output, function calling, embeddings, image generation, fine-tuning, and OpenAI-compatible endpoints

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

agents-inc/skills252026년 10월 17일 업데이트

agents-inc의 스킬 모두 보기

이 스킬의 문제 신고