svelte について
Svelte と SvelteKit の開発向けスキルです。Svelte 5 のリアクティビティ、サーバーサイドレンダリング、ルーティング、性能、アクセシビリティを扱います。
主な機能
- 01Svelte 5 runes によるリアクティビティ
- 02Svelte 4 と 5 の移行時の違い
- 03SvelteKit のルーティングとデータ読み込み
- 04状態管理とコンポーネントのスタイル
- 05性能、テスト、アクセシビリティ
活用シーン
- 01Svelte 5 のリアクティブコンポーネント作成
- 02Svelte 4 プロジェクトの保守や移行
- 03SvelteKit のページとフォーム構築
- 04性能とアクセシビリティの確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill svelteインストール後、Claude Code で/svelteを入力して読み込まれたか確認します。
詳細
Svelte / SvelteKit
このスキルでは、SSR、SSG、モダンなウェブ開発パターンに関する深い知識を活かして、Svelte と SvelteKit の開発を扱います。Svelte 5 の runes システムや、従来の Svelte 4 のリアクティビティとの違いも含みます。
基本原則
- 正確な SvelteKit の例を使い、簡潔で技術的なコンポーネントを記述します
- SSR/SSG の機能とパフォーマンス最適化を重視します
- 適切な命名規則に従い、TypeScript を使用します
- サーバーサイドレンダリングによって、クライアントサイドの JavaScript を最小限に抑えます
- 関数型および宣言型のプログラミングパターンに従います
Svelte 5 の Runes
Svelte 5 では runes が導入されています。これはリアクティビティを明示化し、Svelte 4 の暗黙的な let / $: によるリアクティビティに取って代わる、コンパイラレベルのプリミティブです。
- リアクティブな状態には
$stateを使用します(リアクティビティが必要だった通常のletバインディングに取って代わります) - 計算値には
$derivedを使用します($: computed = ...に取って代わります) - 副作用には
$effectを使用します($: { ... }ブロックに取って代わります) - コンポーネントのプロパティには
$propsを使用します(export let propに取って代わります) - 双方向バインド可能なプロパティには
$bindableを使用します(エクスポートされたプロパティに対する暗黙的なbind:のサポートに取って代わります) - 開発中は
$inspectを使用して、リアクティブな値の変化をログに記録します - Runes はインポートするものではなく、コンパイラ構文です。
import { $state } from 'svelte'は決して記述しないでください。tick、untrack、mount、unmountなど、引き続きインポートが必要な本物のユーティリティのみをインポートします。
Svelte 4 と Svelte 5 の比較
Svelte 4(従来のリアクティビティ):
<script>
let count = 0;
$: double = count * 2;
$: {
if (count > 10) alert('Too high!');
}
</script>
<button on:click={() => count++}>{count} / {double}</button>
Svelte 5(runes):
<script>
let count = $state(0);
let double = $derived(count * 2);
$effect(() => {
if (count > 10) alert('Too high!');
});
</script>
<button onclick={() => count++}>{count} / {double}</button>
コンポーネントを記述またはレビューする際に適用する主な違い:
- リアクティビティは明示的です —
$state()はリアクティブ変数を示し、$derived()は計算値に対する$:に取って代わり、$effect()は副作用に対する$: {}ブロックに取って代わります。 - イベント処理が標準化されています — Svelte 5 では、Svelte 固有のディレクティブ(
on:click={handler})ではなく、通常の HTML プロパティ(onclick={handler})としてイベントハンドラーを扱います。|preventDefaultのようなイベント修飾子はなくなりました。代わりにe.preventDefault()をインラインで呼び出します:onclick={e => { e.preventDefault(); handler(e); }}。 - コンポーネントのプロパティには、複数の
export let propName宣言の代わりにlet { propName } = $props()を使用します。親からバインド可能なプロパティとして指定するには、$bindable()を使用します。 - ほとんどの再利用可能なマークアップでは、スロットの代わりにスニペットを使用します —
{#snippet name(params)}...{/snippet}と{@render name(args)}を使うと、名前付きスロットより重複を減らし、組み合わせやすくなります。既存の<slot>の使用も引き続き機能しますが、新しい Svelte 5 のコードではスニペットを優先してください。
既存の Svelte 4 のコードベースを保守する場合は、パラダイムを混在させず、そのコードベース内では一貫して export let、on:event、$: によるリアクティブ文を使い続けてください。ファイル全体を runes に移行する場合は、意図的に行い、場当たり的な変更は避けてください。
スタイリング
- Svelte の
<style>タグを使ったスコープ付きスタイリングを使用します @applyディレクティブを使わずに Tailwind CSS を組み込みます- スタイルをコンポーネントと同じ場所にまとめます
状態管理
- 共有状態には Svelte ストア(または Svelte 5 の
.svelte.js/.svelte.tsモジュール内でエクスポートした$state)を使用します - 複雑なケースではクラスを使って状態を管理し、リアクティブなクラスプロパティには
$stateフィールドを使用します - デフォルトで外部の状態管理ライブラリに頼るのではなく、Svelte のリアクティビティシステムを効果的に活用します
SvelteKit の機能
- ファイルベースのルーティングを使用します
- 適切な load 関数を実装します
- エラーを適切に処理します
- 変更にはフォームアクションを使用します
- サーバーサイドのデータ読み込みを活用します
パフォーマンス
- Web Vitals の最適化に注力します
- クライアントサイドの JavaScript を最小限に抑えます
- ナビゲーションを高速化するためにプリロードを使用します
- 適切な箇所で遅延読み込みを実装します
国際化
- i18n サポートには Paraglide.js を使用します
- 適切なロケール処理を実装します
テスト
- 単体テストには Vitest を使用します
- パフォーマンス監査には Lighthouse を使用します
- 包括的なコンポーネントテストを作成します
アクセシビリティ
- アクセシビリティ要件への準拠を確保します
- セマンティック HTML を使用します
- 適切な ARIA 属性を実装します
コメント
Markdown 対応