Svelte

2024年版 Svelte 5 と Runes の全貌 - 入門と実践ガイド

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

1️⃣ Svelte 5 と Runes システムの全容

1-1. Runes とは何か(概要)

Runes は コンパイル時に式を「ルーン」単位へ分解し、必要最小限の更新コードだけを生成する仕組みです。従来の $: ラベルやストアに比べて、以下の点で改善されています。

項目 従来 ($:) Runes
更新対象の粒度 コンポーネント単位の再評価 変更があった式だけを個別に更新
実行時オーバーヘッド ランタイムで依存関係解析が走る 完全にコンパイル時に決定、実行時はゼロ
バンドルサイズ 必要以上のコードが混入しやすい 生成コードは式数に比例した最小限

参考:Runes の設計思想とベンチマーク結果は公式リポジトリの benchmarks/2024 ディレクトリ([GitHub – sveltejs/svelte#runebench])および Svelte 5 Benchmark Suite(https://svelte.dev/blog/svelte-5-benchmark)に掲載されています。

1-2. Runes の実装上の制約

Runes はコンパイル時最適化を前提としているため、以下のような 使用できない構文や注意点 が存在します。

制約 内容 回避策
動的スコープ外での let 再代入 ルーンはトップレベルまたはモジュールスコープに限定される 必要ならローカル関数内で普通の変数を使用し、結果だけをルーンで返す
ループ内部での直接的な $: 使用 依存関係が実行時に決まらないためコンパイルできない ループ外でデータ配列を writable にし、変更はストア経由で通知
条件分岐 (if, ?:) の中でのリアクティブ式 コンパイラが分岐ごとの依存関係を解析できない 条件分岐は通常の JavaScript ロジックに任せ、結果だけをルーンで返す
複数代入 (a = b = c) のチェーン どの変数が更新されたか不明確になる 明示的に個別代入し、必要なら run 関数でまとめる

これらは 「Runes はあくまでコンパイル時最適化」 という設計哲学に起因しています。実際のプロジェクトでは、上記制約を意識したコード構造にすることで、型安全性と高速な更新ロジックを両立できます。


2️⃣ 開発環境の構築とプロジェクト作成

2-1. 必要ツールのインストール

Svelte 5 と SvelteKit の開発には Node.js LTS(v18 以上) と好きなパッケージマネージャ(npm / pnpm / yarn)が必要です。以下は npm を例にした手順です。

ポイント:Node.js の LTS バージョンはセキュリティ更新と ESモジュールの完全サポートが保証されているため、必ず最新版を使用してください。

2-2. SvelteKit CLI でプロジェクト雛形を生成

公式 CLI は create-svelte パッケージです。対話式でテンプレートや TypeScript の有無を選択できます。

このコマンドは内部的に Vite と統合された開発環境を自動生成し、HMR(Hot Module Replacement)や高速ビルドがすぐに利用可能になります。

参考:公式ガイド「Getting Started with SvelteKit」 https://kit.svelte.dev/docs

2-3. ビルド出力ディレクトリの正しい把握

SvelteKit のデフォルトビルド先は使用する adapter に依存します。

Adapter デフォルト出力先
@sveltejs/adapter-static build/ (静的サイト)
@sveltejs/adapter-node .svelte-kit/output/server/(Node.js サーバー)
@sveltejs/adapter-vercel .vercel/output/(Vercel 用)
その他のカスタム adapter アダプタごとの設定に従う

したがって、デプロイ先サービスを選ぶ際は 使用中の adapter がどこへ出力するか を必ず確認してください。

参考:SvelteKit Adapter ドキュメント https://kit.svelte.dev/docs/adapters


3️⃣ 基本コンポーネントと TypeScript 活用

3-1. Svelte コンポーネントの構造

Svelte のファイルは次の三つのセクションで構成されます。

lang="ts" を付与すると TypeScript が有効になり、型安全と IDE 補完が強化されます。

3-2. カウントボタンの最小例(TypeScript 完全版)

ポイント$run は Svelte 5 が提供する Runes API の一部です。従来の $: と同様にリアクティブ更新が行われますが、生成コードは式単位で最適化されます。

3-3. Store と Runes の併用例

writable ストアは依然として有効です。Store の値を Runes に渡すと、ストア更新時に自動的に再評価 が走ります。

3-4. 型安全な Props 定義のベストプラクティス

手順 内容
1️⃣ lang="ts" を必ず付与 TypeScript が有効になる
2️⃣ strict モードで tsconfig.json を設定 "strict": true が推奨
3️⃣ Props はインターフェースで明示 ts interface CardProps { title: string; subtitle?: string; } export let props: CardProps;
4️⃣ デフォルト値は export let prop: Type = defaultValue; で記述 型推論が働き、IDE が補完しやすくなる
5️⃣ Store の型は Writable<Type> と明示 ts import type { Writable } from 'svelte/store'; const counter: Writable<number> = writable(0);

4️⃣ 再利用可能コンポーネント設計パターン

4-1. Slot(コンテンツ分配)の活用

スロットは子要素の挿入ポイントを提供し、レイアウトの自由度を高めます。名前付きスロットとフォールバックコンテンツを組み合わせる例です。

使用側:

4-2. Context API と setContext / getContext

コンポーネントツリーの深い階層でもデータ共有が必要な場合は、Context API が便利です。テーマや認証情報の共有例を示します。

子コンポーネントで取得:

4-3. Actions(DOM 抽象化)

use: ディレクティブで要素にロジックを付与できます。以下は ツールチップ を実装した例です。


5️⃣ SvelteKit で本格的なアプリを作る

5-1. ファイルベースルーティングとレイアウト

SvelteKit は src/routes 配下の +page.svelte, +layout.svelte などの命名規則に従って自動でルートを生成します。

パス 説明
src/routes/+layout.svelte アプリ全体の共通レイアウト(ヘッダー・フッター)
src/routes/about/+page.svelte /about ページにマップ
src/routes/blog/[slug]/+page.svelte 動的パラメータ slug を持つブログ記事ページ

5-2. データフェッチと load 関数(サーバー/クライアント)

+page.tsPageLoad は、SSR 時はサーバー側で、CSR 時はクライアント側で実行されます。以下は外部 API から記事一覧を取得する例です。

ページコンポーネントで受け取る:

5-3. フォームアクションとエンドポイント実装

SvelteKit の +server.ts は HTTP メソッドごとにハンドラを定義できます。POST フォームのサンプルです。

5-4. ビルドとデプロイの流れ

npm run build によって SvelteKit は adapter が指示する出力先へビルドします。代表的なデプロイ先別設定例をまとめました。

デプロイ先 必要コマンド ビルドディレクトリ
Vercel (Node) npm run build → 自動検出 .vercel/output/(adapter-vercel)
Netlify (Static) npm run build && netlify deploy --dir=build build/(adapter-static)
Cloudflare Pages npm run build && wrangler pages publish .svelte-kit/cloudflare .svelte-kit/cloudflare/

注意:Vercel・Netlify では「ビルドコマンドは npm run build」で統一できますが、出力ディレクトリは adapter に合わせて正確に設定してください。


6️⃣ ベンチマーク比較と出典の明示

以下は 2024 年 2 月に実施された独立系ベンチマーク(Svelte 社が提供する Svelte 5 Benchmark Suite)から抜粋したデータです。測定環境は Node.js v20、Vite 5.0、Chrome 124 (headless) です。

フレームワーク 初回ロード (gzip) 更新時の DOM 操作回数 ビルドサイズ (gzip)
React 18 1.24 s 12‑15 ~45 KB
Vue 3 1.08 s 8‑10 ~38 KB
Svelte 5 0.58 s 2‑4 ~12 KB

出典
- Svelte 5 Benchmark Suite – GitHub sveltejs/svelte#runebench (2024‑02-15) https://github.com/sveltejs/svelte/blob/main/benchmarks/runebench.md
- 「Svelte 5 Performance」記事(Svelte Blog)https://svelte.dev/blog/svelte-5-performance

上記数値は 「シンプルなカウンタアプリ」「リストフィルタリング」 の2ケースで測定した平均です。実運用時の差異は、使用するコンポーネント構造やサーバー側レンダリング有無に左右されますが、概ね Svelte 5 が 30‑50% 程度高速 であることが確認されています。


7️⃣ 学習リソースと次のステップ

カテゴリ リンク 内容
公式チュートリアル https://svelte.jp/tutorial 基礎から実践までインタラクティブに学べる
Runes 深掘り解説 https://github.com/sveltejs/svelte/blob/main/packages/svelte/src/runtime/runebench.md コンパイラ内部とベンチマークの詳細
日本語ハンズオン(SvelteKit) https://engineering.nifty.co.jp/blog/29567 Vite・adapter の設定方法を実例で解説
高度な型安全ガイド https://zenn.dev/senbei139/articles/3a8adf88daefab TypeScript と Svelte の統合ベストプラクティス
デプロイ完全マニュアル(Vercel) https://vercel.com/docs/concepts/deployments/overview CI/CD パイプラインの構築手順

これらを順に実践すれば、「ローカルで開発 → テスト → 本番デプロイ」 の一連のフローが自然に身につきます。


まとめ

  • Runes はコンパイル時最適化の核。式単位で再評価を行うため、実行時オーバーヘッドは事実上ゼロです。ただし、動的スコープ外やループ内での使用には制約がありますので、設計段階で意識してください。
  • 環境構築は Node.js LTS と npm create svelte@latest だけで完了しますが、デプロイ時は adapter に応じたビルドディレクトリを必ず確認しましょう。
  • TypeScript と Runes の併用により、型安全かつ高速なリアクティブコードを書けます。$run(または $:)を適切に使い分けることがポイントです。
  • 再利用可能コンポーネントは slot・context·actions の組み合わせで実装し、UI の一貫性と保守性を高めます。
  • SvelteKit は Vite とシームレスに連携し、load 関数やエンドポイントでサーバー機能も簡単に追加できます。
  • ベンチマークは公式の Svelte 5 Benchmark Suite を参照し、React・Vue と比較した際のサイズと速度の優位性が明確です(約1/4 のバンドルサイズ、ロード時間半分以下)。

これらを踏まえて実際に手を動かすだけで、2024 年版 Svelte 5 の開発フロー全体が把握できるはずです。ぜひ自分のプロジェクトで Runes を活用し、軽量・高速な UI を実現してください。

スポンサードリンク

-Svelte