Vue.jsとは
Vue.js(以下 Vue)は、ユーザーインターフェースを構築するためのプログレッシブJavaScriptフレームワークです。「プログレッシブ」とは、小さな部分から始めて必要に応じて機能を追加していけるという意味で、既存のHTMLページへの部分的な組み込みも、大規模なSPAの構築にも対応できます。 Vueの核心はリアクティビティです。データが変わるとDOMが自動的に更新されるため、開発者は「いつ、どの要素を更新するか」を手動で管理する必要がありません。このページで解説するのは Vue 3 と Inertia v3 の組み合わせです。Laravel 13 のスターターキットはこの構成をデフォルトで使用します。
Options API と Composition API
Vue 3 はコンポーネントを書くスタイルとして Options API と Composition API の2つを提供しています。 Options API は Vue 2 から続く従来のスタイルです。data・methods・computed・mounted などのオプションオブジェクトでコンポーネントを定義します。
<script setup> 構文と組み合わせることで、より簡潔に書けます。ロジックの再利用性も高く、TypeScriptとの相性も優れています。
Laravel でのポジション
歴史
VueとLaravelの関係は古く、Laravel 5.3(2016年) に Vue がデフォルトのフロントエンドフレームワークとして採用されたことに始まります。当時のpackage.json には Vue が含まれており、resources/js/components/ExampleComponent.vue というサンプルコンポーネントも同梱されていました。
Laravel 6(2019年) で認証スキャフォールドが laravel/ui パッケージとして切り離され、Vue のスキャフォールドも同パッケージに移行しました。現在は laravel new のスターターキット経由で Inertia + Vue 構成を選ぶのが主流スタイルです。
Laravelユーザーにとって Vue は最もなじみ深いJSフレームワークであり、日本語の学習リソースも豊富です。
現在の主流スタイル:Inertia × Vue
現在の Laravel における Vue の使い方の中心は Inertia × Vue です。Inertia はAPIを設計せずにLaravelのコントローラーから直接Vueコンポーネントにデータを渡せる「モダンモノリス」アーキテクチャを実現します。セットアップ
スターターキット経由(推奨)
新規プロジェクトで始める場合はスターターキットを使うのが最も手軽です。inertiajs/inertia-laravel(サーバーサイドアダプター)@inertiajs/vue3(クライアントアダプター)vue(Vue 3 本体)@vitejs/plugin-vue(Vite プラグイン)HandleInertiaRequestsミドルウェア- ログイン・登録などの認証画面(Inertia + Vue で実装済み)
手動インストール
既存プロジェクトに追加する場合は、サーバーサイドとクライアントサイドを別々にインストールします。vite.config.js に Vue プラグインを追加します。
resources/js/app.js で Inertia アプリを起動します。
手動インストールの詳細(ルートテンプレートの設定やミドルウェアの登録など)は Inertia 公式ドキュメント を参照してください。
ディレクトリ構造
スターターキットでは Vue のページコンポーネントをresources/js/pages/ ディレクトリに配置します。
Inertia::render('Posts/Index', [...]) と書くと resources/js/pages/Posts/Index.vue が対応するコンポーネントになります。
Vue テンプレート構文
スターターキットのコードを読み書きするために必要な、基本的なテンプレートディレクティブを紹介します。{{ }} — 変数展開
二重中括弧を使って、JavaScript の値や式をテンプレートに埋め込みます。
v-if — 条件分岐
{#if} や React の三項演算子に相当します。
v-for — リスト描画
:key は必ず指定します。React の Array.map() に相当します。
v-model — 双方向バインディング
v-model を使うと、フォーム要素の値とリアクティブ変数を双方向に同期できます。
: (v-bind) と @ (v-on)
:attr="value"— HTML 属性に動的な値をバインド(v-bind:attrの省略形)@event="handler"— イベントリスナーを登録(v-on:eventの省略形)
ページコンポーネントの基本
Inertia のページコンポーネントは通常の Vue コンポーネントです。Laravelのコントローラーから渡したデータが props として受け取れます。コントローラー
Vue ページコンポーネント
defineProps() で props を宣言するだけで、コントローラーから渡したデータをテンプレートで使えます。REST APIを定義する必要はありません。
Link コンポーネント
@inertiajs/vue3 が提供する <Link> コンポーネントを使うと、ページ遷移が XHR で行われ、ブラウザのフルリロードを回避できます。
<a> タグと同じように書けますが、裏側で Inertia がページコンポーネントだけを差し替えるため SPA のような操作感になります。
Form コンポーネント
@inertiajs/vue3 が提供する <Form> コンポーネントは、スターターキットの認証画面で使われているフォーム送信の推奨スタイルです。action と method を props で指定し、v-slot で errors と processing にアクセスします。
基本的な使い方
v-slot="{ errors, processing }" は Vue のスコープ付きスロット構文で、Form コンポーネントがこれらの値を自動で算出して渡してくれます。フォームフィールドには v-model ではなく HTML ネイティブの name 属性を使い、ブラウザの標準フォームデータ収集が機能します。
スターターキットのパターン
スターターキットは Wayfinder を使ってルートをオブジェクトとして管理しています。store.form() はルートオブジェクトの action と method を含むオブジェクトを返し、v-bind で <Form> に spread します。
reset-on-success に指定したフィールドは、送信成功時に自動でリセットされます。パスワードフィールドなど送信後に空にしたいフィールドに指定します。
Wayfinder を使わない場合は
action="/login" のように直接 URL を渡せば同じように動作します。useForm ヘルパー
フォーム処理には @inertiajs/vue3 の useForm ヘルパーを使います。フォームの状態管理・送信・バリデーションエラー表示がシンプルに実装できます。
コントローラー側
Vue フォームコンポーネント
useForm が返すオブジェクトの主なプロパティをまとめます。
バリデーションエラーが返ったとき、
useForm は入力内容を保持したままエラーを表示します。v-model との組み合わせでシームレスなフォーム体験を実現できます。
共有データ(Shared Data)
すべてのページで共通して必要なデータ(ログイン中のユーザー情報・フラッシュメッセージなど)はHandleInertiaRequests ミドルウェアの share() メソッドで定義します。
usePage() を使います。
共有データはすべてのリクエストに含まれるため、必要最低限のデータに絞ることを推奨します。
fn() を使ったレイジー評価にすると、実際にアクセスされたときだけ評価されます。Vue 3 のリアクティビティ基礎
Inertia × Vue で開発するうえで知っておくべき Vue 3 のリアクティビティ API を紹介します。ref — プリミティブなリアクティブ値
computed — 算出プロパティ
onMounted — マウント後の処理
まとめ
Vue.js は Laravel との親和性が高く、特に Inertia を経由した「モダンモノリス」構成で力を発揮します。
Inertia × Vue を使うと、LaravelのバックエンドのシンプルさとVueのリアクティブなUIの両方を享受できます。スターターキットでプロジェクトを作成すれば、認証画面も含めてすぐに開発を始められます。
Inertia.js 公式ドキュメント
Inertia v3 の全機能については公式ドキュメントを参照してください。