Laravel Inertiaを活用したシームレスなSPA開発ガイド:React/Vueとの統合方法

実装・応用テクニック

LaravelとInertia.jsを組み合わせたSPA(Single Page Application)開発は、ユーザー体験を向上させ、開発者の作業を効率化する強力な手法です。このガイドでは、Inertia.jsを使用して、Laravelをバックエンドとし、フロントエンドにReactまたはVueを統合する方法を詳しく解説します。これにより、シームレスなSPAを構築するステップを理解しましょう。

Laravel Inertia.jsの基本

Inertia.jsは、Laravelとフロントエンドフレームワーク(ReactやVueなど)をシームレスにつなぐアダプターとして機能します。これにより、伝統的なサーバーサイドアプリケーションのようにLaravelのルーティングやコントローラーを使用しつつ、フロントエンドにはモダンなクライアントサイドレンダリングを採用できます。

Inertia.jsの利点は、SPAのようにページ遷移をスムーズにしながらも、Laravelの既存のビューやルーティングシステムをそのまま活用できる点にあります。それでは、具体的なセットアップ方法を見ていきましょう。

制作環境の準備

まず、Laravelプロジェクトを新たに作成するか、既存のプロジェクトにInertia.jsを組み込むために必要な環境を整えます。

必要条件

  • Node.jsnpmのインストール
  • Composerを使ったLaravelのインストール
  • Inertia.jsアダプター(ReactまたはVue)の準備

Laravelプロジェクトの作成

composer create-project --prefer-dist laravel/laravel your-project-name
cd your-project-name

Laravelプロジェクトを設定したら、Inertia.jsをインストールします。

Inertia.jsのインストール

Inertia.jsにはLaravelのバックエンドとフロントエンドのアダプターがあります。まず、以下のコマンドでLaravelのInertia.jsパッケージを追加します。

composer require inertiajs/inertia-laravel

次に、選んだフロントエンドフレームワーク用アダプターをインストールします。

Reactの場合:

npm install @inertiajs/inertia @inertiajs/inertia-react
npm install react react-dom

Vueの場合:

npm install @inertiajs/inertia @inertiajs/inertia-vue
npm install vue

フロントエンドのセットアップ

Inertia.jsは、フロントエンドコンポーネントの管理をできるだけスムーズに行えるように設計されています。各フレームワークごとに若干の違いがありますが、基本の構成は共通しています。

Reactの設定

プロジェクトのresources/jsディレクトリにapp.jsを作成し、次の内容を追加します。

import React from 'react';
import { render } from 'react-dom';
import { InertiaApp } from '@inertiajs/inertia-react';

const app = document.getElementById('app');

render(
  <InertiaApp
    initialPage={JSON.parse(app.dataset.page)}
    resolveComponent={name => import(`./Pages/${name}`).then(module => module.default)}
  />,
  app
);

これにより、Inertia.jsを介してReactコンポーネントをレンダリングできます。Pagesフォルダを作成し、そこに個々のページコンポーネントを保存します。

Vueの設定

Vue用には次のようにします。resources/js/app.js内でVueの初期設定を行います。

import Vue from 'vue';
import { InertiaApp } from '@inertiajs/inertia-vue';

Vue.use(InertiaApp);

const el = document.getElementById('app');

new Vue({
  render: h => h(InertiaApp, {
    props: {
      initialPage: JSON.parse(el.dataset.page),
      resolveComponent: name => import(`./Pages/${name}`).then(module => module.default),
    },
  }),
}).$mount(el);

これでVueを使ったSPA環境を整えられます。

ルーティングとコントローラーの設定

次に、Laravelのルートやコントローラーを設定して実際にデータをやり取りできるようにします。

ルートの設定

通常のLaravelプロジェクトと同様に、routes/web.phpにてルーティングを設定します。ただし、Inertia.jsの場合、ビューを返す際には特定のInertiaコンポーネントを指定します。

use Inertia\Inertia;

Route::get('/', function () {
    return Inertia::render('Home');
});

Homeは、resources/js/Pagesディレクトリ内に存在するコンポーネント名です。

コントローラーとの連携

コントローラーも通常のLaravelと同様に作成します。ただし、ビューを返す代わりにInertiaコンポーネントを指定します。

namespace App\Http\Controllers;

use Inertia\Inertia;

class HomeController extends Controller
{
    public function index()
    {
        return Inertia::render('Home', [
            'foo' => 'bar'
        ]);
    }
}

ここでは、Homeコンポーネントにpropsとしてfooというデータを渡しています。

フロントエンドでのデータ受け取り

VueまたはReactで受け取ったプロップスをそのまま使用し、フロントエンドでレンダリングします。以下にReactとVueの例を示します。

Reactでのデータ表示

resources/js/Pages/Home.jsを作成し、以下のように内容を定義します。

import React from 'react';

const Home = ({ foo }) => (
  <div>
    <h1>Home Component</h1>
    <p>Received: {foo}</p>
  </div>
);

export default Home;

Vueでのデータ表示

resources/js/Pages/Home.vueを作成します。

<template>
  <div>
    <h1>Home Component</h1>
    <p>Received: {{ foo }}</p>
  </div>
</template>

<script>
export default {
  props: {
    foo: String,
  },
};
</script>

パフォーマンスとデバッグのポイント

Inertia.jsを使用することで、SPAのような体験を得られる反面、データの取得時の効率性や、対話性の高い部分のデバッグが課題になることがあります。デバッグにはブラウザの開発者ツールを活用し、レスポンスの確認や状態管理の追跡を行いましょう。また、Laravelとフロントエンドのデーターバインディングの際には、モデルを最小限にしてレスポンスタイムを向上させることが推奨されます。

まとめ

LaravelとInertia.jsを活用したSPA開発は、フロントエンドとバックエンドの開発をシームレスに行うための優れた選択肢です。このガイドの手順に基づいて基本的なセットアップができれば、あとはプロジェクトごとに必要なカスタマイズを施すことで、高機能かつ効率的なウェブアプリケーションを構築できるでしょう。これを活用して、より充実したWeb体験を提供してください。

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする

コメント