svelte-core-bestpractices

Guidance on writing fast, robust, modern Svelte code. Load this skill whenever in a Svelte project and asked to write/edit or analyze a Svelte component or…

INSTALLATION
npx skills add https://github.com/sveltejs/ai-tools --skill svelte-core-bestpractices
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

$27

$effect(() => {

square = num * num;

});

> [!NOTE] `$derived` is given an expression, _not_ a function. If you need to use a function (because the expression is complex, for example) use `$derived.by`.

Deriveds are writable — you can assign to them, just like `$state`, except that they will re-evaluate when their expression changes.

If the derived expression is an object or array, it will be returned as-is — it is _not_ made deeply reactive. You can, however, use `$state` inside `$derived.by` in the rare cases that you need this.

## `$effect`

Effects are an escape hatch and should mostly be avoided. In particular, avoid updating state inside effects.

- If you need to sync state to an external library such as D3, it is often neater to use [`{@attach ...}`](references/@attach.md)

- If you need to run some code in response to user interaction, put the code directly in an event handler or use a [function binding](references/bind.md) as appropriate

- If you need to log values for debugging purposes, use [`$inspect`](references/$inspect.md)

- If you need to observe something external to Svelte, use [`createSubscriber`](references/svelte-reactivity.md)

Never wrap the contents of an effect in `if (browser) {...}` or similar — effects do not run on the server.

## `$props`

Treat props as though they will change. For example, values that depend on props should usually use `$derived`:

// @errors: 2451

let { type } = $props();

// do this

let color = $derived(type === 'danger' ? 'red' : 'green');

// don't do this — color will not update if type changes

let color = type === 'danger' ? 'red' : 'green';


## $inspect.trace

`$inspect.trace` is a debugging tool for reactivity. If something is not updating properly or running more than it should you can add `$inspect.trace(label)` as the first line of an `$effect` or `$derived.by` (or any function they call) to trace their dependencies and discover which one triggered an update.

## Events

Any element attribute starting with `on` is treated as an event listener:

<button onclick={() => {...}}>click me</button>

<!-- attribute shorthand also works -->

<button {onclick}>...</button>

<!-- so do spread attributes -->

<button {...props}>...</button>


If you need to attach listeners to `window` or `document` you can use `<svelte:window>` and `<svelte:document>`:

<svelte:window onkeydown={...} />

<svelte:document onvisibilitychange={...} />


Avoid using `onMount` or `$effect` for this.

## Snippets

[Snippets](https://github.com/sveltejs/ai-tools/blob/HEAD/plugins/claude/svelte/skills/svelte-core-bestpractices/references/snippet.md) are a way to define reusable chunks of markup that can be instantiated with the [{@render ...}](https://github.com/sveltejs/ai-tools/blob/HEAD/plugins/claude/svelte/skills/svelte-core-bestpractices/references/@render.md) tag, or passed to components as props. They must be declared within the template.

{#snippet greeting(name)}

<p>hello {name}!</p>

{/snippet}

{@render greeting('world')}


[!NOTE] Snippets declared at the top level of a component (i.e. not inside elements or blocks) can be referenced inside `<script>`. A snippet that doesn't reference component state is also available in a `<script module>`, in which case it can be exported for use by other components.

## Each blocks

Prefer to use [keyed each blocks](https://github.com/sveltejs/ai-tools/blob/HEAD/plugins/claude/svelte/skills/svelte-core-bestpractices/references/each.md) — this improves performance by allowing Svelte to surgically insert or remove items rather than updating the DOM belonging to existing items.

[!NOTE] The key must uniquely identify the object. Do not use the index as a key.

Avoid destructuring if you need to mutate the item (with something like `bind:value={item.count}`, for example).

## Using JavaScript variables in CSS

If you have a JS variable that you want to use inside CSS you can set a CSS custom property with the `style:` directive.

<div style:--columns={columns}>...</div>


You can then reference `var(--columns)` inside the component's `<style>`.

## Styling child components

The CSS in a component's `<style>` is scoped to that component. If a parent component needs to control the child's styles, the preferred way is to use CSS custom properties:

<!-- Parent.svelte -->

<Child --color="red" />

<!-- Child.svelte -->

<h1>Hello</h1>

<style>

h1 {

color: var(--color);

}

</style>


If this is impossible (for example, the child component comes from a library) you can use `:global` to override styles:

<div>

<Child />

</div>

<style>

div :global {

h1 {

color: red;

}

}

</style>

BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card