Svelteとは
Svelte は JavaScript フレームワークの中でも独自の位置を占めています。React や Vue がランタイムライブラリとして動作するのに対し、Svelte はコンパイラとして動作します。ビルド時にコンポーネントを純粋な JavaScript に変換するため、ブラウザに余分なフレームワークコードを送る必要がありません。 Svelte の最大の特徴は Virtual DOM を使わない点です。状態が変化すると、Svelte がコンパイル時に生成したコードが直接 DOM を更新します。これにより、非常に軽量で高速な UI が実現できます。このページで解説するのは Svelte 5 と Inertia v3 の組み合わせです。Laravel 13 のスターターキットはこの構成をデフォルトで使用します。
Svelte 5 のルーン
Svelte 5(2024年リリース)では ルーン(Runes) と呼ばれる新しいリアクティビティシステムが導入されました。$state・$derived・$effect などの特別な関数(ルーン)を使ってリアクティブな状態を宣言します。Svelte 4 以前の暗黙的なリアクティビティとは異なり、明示的で予測しやすい設計になっています。
Laravel でのポジション
歴史
Svelte と Laravel の関係は Vue・React と比べて非常に新しく、公式スターターキットへの採用が最初の公式サポートです。 2026年の Laravel 13 でスターターキットに Svelte が正式追加されたことで、Svelte は Laravel エコシステムにおける公式フロントエンド選択肢の一つになりました。Vue・React と同列に扱われており、laravel new の対話プロンプトで選択できます。
Laravelユーザーにはまだあまり知られていないフレームワークですが、コンパイラによる軽量バンドルとシンプルな構文が特徴で、Vue や React から乗り換えると書く量が少ないことに驚くかもしれません。
現在の主流スタイル:Inertia × Svelte
現在の Laravel における Svelte の使い方の中心は Inertia × Svelte です。Inertia は API を設計せずに Laravel のコントローラーから直接 Svelte コンポーネントにデータを渡せる「モダンモノリス」アーキテクチャを実現します。セットアップ
スターターキット経由(推奨)
新規プロジェクトで始める場合はスターターキットを使うのが最も手軽です。inertiajs/inertia-laravel(サーバーサイドアダプター)@inertiajs/svelte(クライアントアダプター)svelte+@sveltejs/vite-plugin-svelte(Svelte 5 本体と Vite プラグイン)- TypeScript +
svelte-check - Tailwind CSS + shadcn-svelte コンポーネントライブラリ
HandleInertiaRequestsミドルウェア- ログイン・登録などの認証画面(Inertia + Svelte + TypeScript で実装済み)
手動インストール
既存プロジェクトに追加する場合は、サーバーサイドとクライアントサイドを別々にインストールします。vite.config.ts に Svelte プラグインと Inertia Vite プラグインを追加します。
resources/js/app.ts で Inertia アプリを起動します。@inertiajs/vite プラグインがページの自動解決とマウントを行うため、最小限のエントリーポイントだけで済みます。
手動インストールの詳細(ルートテンプレートの設定やミドルウェアの登録など)は Inertia 公式ドキュメント を参照してください。
ディレクトリ構造
スターターキットでは Svelte のページコンポーネントをresources/js/pages/ ディレクトリに配置します。
Inertia::render('posts/Index', [...]) と書くと resources/js/pages/posts/Index.svelte が対応するコンポーネントになります。
Svelte ファイルの基本構造
.svelte ファイルは <script>・テンプレート・<style> の3つのブロックで構成されます。
<style> はデフォルトでスコープが限定されているため、クラス名の衝突を気にする必要がありません。
テンプレート構文
変数展開と式
テンプレート内では{} を使って JavaScript の値や式を埋め込みます。
{#if} — 条件分岐
v-if / v-else、React の三項演算子に相当します。
{#each} — リスト描画
(post.id) はキー指定で、効率的な差分更新に使われます。Vue の v-for / React の Array.map() に相当します。
bind: — 双方向バインディング
bind:value を使うと、フォーム要素の値とリアクティブ変数を双方向に同期できます。
v-model に相当します。React では onChange ハンドラを手書きする必要がありましたが、Svelte では bind: で宣言的に書けます。
ページコンポーネントの基本
Inertia のページコンポーネントは通常の Svelte コンポーネントです。Laravel のコントローラーから渡したデータが props として受け取れます。コントローラー
Svelte ページコンポーネント
Svelte 5 では$props() ルーンを使って props を受け取ります。
$props() で props を受け取るだけで、コントローラーから渡したデータをテンプレートで使えます。REST API を定義する必要はありません。
Link コンポーネント
@inertiajs/svelte が提供する <Link> コンポーネントを使うと、ページ遷移が XHR で行われ、ブラウザのフルリロードを回避できます。
<a> タグと同じように書けますが、裏側で Inertia がページコンポーネントだけを差し替えるため SPA のような操作感になります。
Form コンポーネント
@inertiajs/svelte が提供する <Form> コンポーネントは、スターターキットの認証画面で使われているフォーム送信の推奨スタイルです。action と method を props で指定し、内部を {#snippet} で記述します。
基本的な使い方
{#snippet children({ errors, processing })} は Svelte のスニペット構文で、コンポーネントに渡すコンテンツブロックです(Vue のスロットや React の render props に相当)。errors と processing は Form コンポーネントが自動で算出して渡してくれます。フォームフィールドには bind:value ではなく HTML ネイティブの name 属性を使い、ブラウザの標準フォームデータ収集が機能します。
スターターキットのパターン
スターターキットは Wayfinder を使ってルートをオブジェクトとして管理しています。store.form() はルートオブジェクトの action と method を含むオブジェクトを返し、<Form> に spread します。
resetOnSuccess に指定したフィールドは、送信成功時に自動でリセットされます。パスワードフィールドなど送信後に空にしたいフィールドに指定します。
Wayfinder を使わない場合は
action="/login" のように直接 URL を渡せば同じように動作します。useForm フック
フォーム処理には @inertiajs/svelte の useForm フックを使います。フォームの状態管理・送信・バリデーションエラー表示がシンプルに実装できます。
コントローラー側
Svelte フォームコンポーネント
useForm が返すオブジェクトの主なプロパティをまとめます。
バリデーションエラーが返ったとき、
useForm は入力内容を保持したままエラーを表示します。bind:value との組み合わせでシームレスなフォーム体験を実現できます。
共有データ(Shared Data)
すべてのページで共通して必要なデータ(ログイン中のユーザー情報・フラッシュメッセージなど)はHandleInertiaRequests ミドルウェアの share() メソッドで定義します。
usePage() を使います。
共有データはすべてのリクエストに含まれるため、必要最低限のデータに絞ることを推奨します。
fn() を使ったレイジー評価にすると、実際にアクセスされたときだけ評価されます。Svelte 5 のリアクティビティ(ルーン)
Inertia × Svelte で開発するうえで知っておくべき Svelte 5 のルーン構文を紹介します。$state — リアクティブな状態
$state で宣言した変数は自動的にリアクティブになります。値が変わると DOM が自動更新されます。Vue の ref や React の useState に相当しますが、.value プロパティへのアクセスが不要で、代入するだけで状態を更新できます。
$derived — 派生した値
$derived は依存する値が変わると自動的に再計算されます。Vue の computed や React の useMemo に相当します。
$effect — 副作用の処理
$effect は依存する $state 値が変化するたびに実行されます。React の useEffect に相当しますが、依存配列を明示する必要がなく、使用した $state 変数が自動的に追跡されます。
shadcn-svelte コンポーネント
スターターキットには shadcn-svelte が組み込まれています。shadcn-svelte は React 向けの shadcn/ui と同じ設計思想を持つコンポーネントライブラリで、コードをプロジェクトにコピーして自由にカスタマイズできます。コンポーネントの追加
resources/js/components/ui/ にコンポーネントのソースコードが配置されます。
使い方
npx shadcn-svelte@latest add コマンドで随時追加できます。
まとめ
Svelte は Laravel との組み合わせで、特に Inertia を経由した「モダンモノリス」構成で力を発揮します。コンパイラベースの設計によりバンドルサイズが小さく、ルーン構文によりリアクティビティが明示的で理解しやすいのが特徴です。
Inertia × Svelte を使うと、Laravel バックエンドのシンプルさと Svelte のコンパクトな記述スタイルを組み合わせた開発体験が得られます。スターターキットでプロジェクトを作成すれば、認証画面も含めてすぐに開発を始められます。
Inertia.js 公式ドキュメント
Inertia v3 の全機能については公式ドキュメントを参照してください。