12k
All articles

LaravelとVueを使用したフルスタックアプリケーション開発

Inertia.js、Vite、PiniaでLaravelとVue 3を組み合わせたフルスタックアプリの構築と、適切なアーキテクチャの選定について解説する。

OpenReplay Team
OpenReplay Team
LaravelとVueを使用したフルスタックアプリケーション開発

モダンなWebアプリケーションを構築する際、多くの場合2つの選択肢があります。フロントエンドとバックエンドを完全に分離するか、密結合なモノリスにするかです。LaravelとVueのフルスタック構成は、実用的な中間地点を提供します。これは、別々のAPIコントラクトを保守するオーバーヘッドなしに、SPAのような体験を実現します。

本記事では、現在のエコシステムにおいてLaravelVue 3がどのように機能するかを検証し、アーキテクチャ上の決定、ツールの選択、そしてこのスタックがプロジェクトに適している場合について焦点を当てます。

重要なポイント

  • LaravelとVue 3、Inertia.jsの組み合わせは、別個のAPIレイヤーを必要とせずにSPAのような動作を提供し、ルーティング、ミドルウェア、バリデーションをLaravel内に保持します。
  • Laravel 9以降、ViteがLaravel Mixに代わってデフォルトのビルドツールとなり、より高速なホットモジュール置換とネイティブESモジュールサポートを提供しています。
  • Vue 3のComposition APIは、Inertiaのprops受け渡しパターンと自然に組み合わさり、ライフサイクルフック内での手動データ取得が不要になります。
  • このスタックは、単一のチームがフロントエンドとバックエンドの両方を所有し、アプリケーションが外部APIコンシューマーにサービスを提供する必要がない場合に最適です。

モダンなLaravelフロントエンドスタック

Laravelは、フロントエンドアセットの処理方法において大きく進化してきました。Laravel 9以降、ViteがLaravel Mixに代わってデフォルトのビルドツールとなり、より高速なホットモジュール置換とネイティブESモジュールサポートをもたらしました。Laravel ViteのセットアップはVue 3とシームレスに統合され、開始するために最小限の設定しか必要としません。

典型的なモダンスタックは以下のようになります:

  • Vite - アセットバンドリングと開発サーバー用
  • Vue 3 - Composition APIを使用したリアクティブUIコンポーネント用
  • Inertia.js - LaravelとVueを接続する接着剤として
  • Pinia - 必要に応じたクライアントサイドの状態管理用

この組み合わせにより、Laravelがルーティング、認証、データを処理し、Vueがリアクティブなインターフェースを駆動する統一された開発ワークフローが作成されます。

Inertia.jsによるLaravel Vue統合の仕組み

Inertia.jsは特定の問題を解決します。それは、別個のAPIレイヤーを作成せずにSPAを構築することです。LaravelコントローラーからJSONを返す代わりに、Vueコンポーネント名とそのpropsの両方を含むInertiaレスポンスを返します。

リクエストフローは以下のように機能します:

  1. ユーザーがInertiaの<Link>コンポーネントでラップされたリンクをクリック
  2. Inertiaがクリックをインターセプトし、XHRリクエストを実行
  3. Laravelがコンポーネント名とデータを含むJSONを返す
  4. Inertiaがページ全体をリロードせずにVueコンポーネントを入れ替える

このアプローチにより、従来のアプリケーションで使用するのと全く同じように、Laravelのルーティング、ミドルウェア、バリデーションを保持できます。フロントエンドは単に異なるレンダリングレイヤーになります。

Inertiaが適している場合

Inertia.jsによるLaravel Vue統合は以下の場合に最適です:

  • 単一のチームがフロントエンドとバックエンドの両方を所有している
  • RESTやGraphQL APIを構築せずにSPAの動作が必要
  • SEO要件がInertiaのSSRサポートで満たせる
  • アプリケーションがモバイルアプリやサードパーティのコンシューマーにサービスを提供する必要がない

モバイルアプリや外部統合のための公開APIが必要な場合は、専用APIを持つ分離アーキテクチャの方が適切な選択肢です。

LaravelでのVue 3 Composition API

Vue 3のComposition APIは、Laravelのデータ受け渡しパターンと自然に組み合わさります。Inertiaを使用する場合、propsはコントローラーから直接Vueコンポーネントに流れます:

// In your Vue component
const props = defineProps({
  users: Array,
  filters: Object,
})

これにより、onMountedフック内でデータを取得する煩雑さが解消されます。データはフロントエンドに到達する前にLaravelによって検証され、すぐに使用できる状態で到着します。

サーバーへの永続化が不要なクライアントサイドの状態—UIトグル、フォームドラフト、一時的な選択—については、Piniaが古いソリューションのボイラープレートなしに軽量な状態管理を提供します。

開発者体験とツール

Laravel 12以降は、新しい公式スターターキット(Vue、React、Livewire)が付属しています。Vueスターターキットは、TypeScriptとTailwindを備えたInertia + Vue 3(Composition API)のセットアップです。Jetstreamは、その機能セットを必要とするチーム向けのInertia(Vue)スタックを持つ代替スターターキットとして残っています。Inertia SSRはサポートされていますが、別途有効化/設定するオプションのアドオンです。

フォーム処理については、Laravel Precognitionが、ユーザーの入力中にサーバーサイドのバリデーションルールを実行することで、リアルタイムバリデーションを可能にします。これにより、JavaScriptでバリデーションロジックを重複させることなく、緊密なフィードバックループが作成されます。

開発体験は以下の点から恩恵を受けます:

  • Viteのサブ秒単位のホットリロード
  • Vueコンポーネント内に直接表示されるLaravelのエラーハンドリング
  • Laravelモデルから生成される共有TypeScript型
  • フロントエンドとバックエンドの両方を含む単一のデプロイメントアーティファクト

パフォーマンスと保守性のトレードオフ

Inertiaアプローチは、複雑さの軽減と引き換えに一部の柔軟性をトレードオフします。OpenAPI仕様を保守したり、APIバージョニングを心配したりする必要はありません。しかし、フロントエンドフレームワークを簡単に交換したり、同じバックエンドから複数のクライアントにサービスを提供したりすることもできません。

パフォーマンス特性は従来のSPAとは異なります。初期ページロードには(SSRが有効な場合)サーバーレンダリングされたHTMLが含まれ、その後のナビゲーションは部分的なページ更新により瞬時に感じられます。ルーティングライブラリやデータ取得レイヤーを配布する必要がないため、バンドルサイズは管理可能な範囲に収まります。

すでにLaravelに慣れているチームにとって、学習曲線は最小限です。PHPに不慣れなフロントエンド開発者は、Laravelの規約を理解する必要がありますが、統合ポイントは十分に文書化されており、予測可能です。

まとめ

LaravelとVueのフルスタックアプローチは、開発速度とチームの結束力がアーキテクチャの柔軟性よりも重要なプロジェクトに適しています。管理パネル、社内ツール、SaaSアプリケーション、リアクティブなインターフェースが必要なコンテンツ重視のサイトで優れた性能を発揮します。

複数のフロントエンドクライアントを持つプラットフォームを構築している場合、フロントエンドチームの最大限の自律性が必要な場合、または自社アプリケーション以外の重要なAPIコンシューマーが想定される場合は、代わりに分離アーキテクチャを検討してください。

モダンなLaravelフロントエンドスタックは、すべてのプロジェクトに適した選択肢ではありません。しかし、適切なユースケースにおいては、ユーザーが期待するレスポンシブな体験を提供しながら、大幅な複雑さを排除します。

よくある質問

Inertia.jsなしでLaravelとVueを使用できますか?

はい。VueをスタンドアロンのSPAとして使用し、RESTまたはGraphQL APIを通じてLaravelと通信できます。Inertia.jsは統合アプローチの1つであり、必須ではありません。Inertia.jsを使用しない場合、別個のAPIレイヤーを構築・保守する必要がありますが、同じバックエンドからモバイルアプリやサードパーティのコンシューマーなど、複数のクライアントにサービスを提供する柔軟性が得られます。

Laravel VueスタックはSEO用のサーバーサイドレンダリングをサポートしていますか?

はい。Inertia.jsは、Node.jsを使用してサーバー上でVueコンポーネントを実行する組み込みのSSRサポートを提供しています。これにより、初期ページロード時にHTMLが生成され、コンテンツが検索エンジンによってクロール可能になります。Laravel BreezeとJetstreamスターターキットにはSSR設定オプションが含まれているため、ほとんどのプロジェクトでセットアップは簡単です。

InertiaでLaravelとVue間のフォームバリデーションはどのように機能しますか?

Inertiaには、データをLaravelに送信し、サーバーサイドのバリデーションエラーを自動的にVueコンポーネントにマッピングするフォームヘルパーが含まれています。Laravel Precognitionはこれをさらに進め、ユーザーの入力中に既存のバリデーションルールをリアルタイムで実行し、クライアントサイドでバリデーションロジックを重複させることなく即座にフィードバックを提供します。

Inertiaアプローチの代わりに分離APIを選択すべきなのはいつですか?

バックエンドがWebアプリ、モバイルアプリ、サードパーティ統合など、複数のフロントエンドにサービスを提供する必要がある場合は、分離アーキテクチャを選択してください。また、フロントエンドチームとバックエンドチームが独立して作業する必要がある場合や、外部コンシューマー向けにバージョニングを伴う正式なAPIコントラクトが必要な場合も検討してください。

DevTools for the frontend

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.