Laravelの通常のビュー部分は、Bladeです。とても使いやすく、私はずっとこれを使ってきました。これでも充分開発可能ですが、従来から存在するMPA(マルチページアプリケーション)が、クラシックというか、やぼったい感じがしています。
今年はReactやVue.jsも学ばなければなー、ということで、久々にLaravel×Reactをテスト環境にインストールしてみようと思います。
というのも昨年はPCを新しくしたので、いろいろといじって遊んでみようかなと。
LaravelではBladeばかりという、私と同じような状況にある方に、何か少しでも参考になることがあれば幸いです。
インストール
まずはインストールします。
前提
- 本ページはWindows11 Professional環境で行っていますが、他の環境でも大差ありません。
- Composerをインストールしていない場合は、事前にインストールしてください。Windows系へのインストールはこちらで書いてます。
- 本ページでは
D:\www\larareact.local
というディレクトリに、react-experiment
というプロジェクトを作ろうと思います。以後、適宜読みかえてください。 - 本ページではLaravel Breeze(付随してInertia)をインストールします。
プロジェクトディレクトリ作成
まず最初にD:\www\larareact.local
というディレクトリを作成しました。この中にプロジェクトをインストールします。
そのためにこの場所でプロンプトを出しておきます。例えばWinowsなら、該当フォルダを「右クリック→ターミナルで開く」でOKです。
インストール
以下のコマンドでLaravelをインストールします。最後のreact-experiment
部分はプロジェクト名ですので、各自ご希望の文字に変えてください。
composer create-project --prefer-dist laravel/laravel react-experiment
作成したプロジェクトのディレクトリに移動します。
cd react-experiment
その他各種インストール
Laravel Breezeと、それをReactオプションで使うためのコマンド、そしてnpmインストールを実行します。
composer require laravel/breeze
php artisan breeze:install react
npm install
動作確認
これで普通はOKなので、動作確認します。
起動
毎度おなじみの、以下のコマンドでViteを起動します。
npm run dev
私の場合、初期状態で以下の様になりました。
VITE v5.0.11 ready in 187 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h + enter to show help
LARAVEL v10.40.0 plugin v1.0.1
➜ APP_URL: http://localhost
http://localhost
部分で、Ctrl+クリック
でアクセス可能です。
表示されない場合
私の場合、そのままでは表示されませんでした。なぜなら、すでにhttp://localhost
で別にバーチャルホストを指定してあるからです。
その場合、面倒ですがバーチャルホスト指定を解除するか、新たにバーチャルホスト指定をします。
私の場合は後者を選択。ひいてはlarareact.local
でバーチャルホスト設定し、D:\www\larareact.local\react-experiment\public
を公開ディレクトリとしました。
その場合、.env
のAPP_URLを以下に書き換えます。
APP_URL=http://larareact.local
保存すると即座にViteが反応してくれますので、http://larareact.local
でアクセスすると……
OKです!見た目は普段通りですが、Laravel×Reactで表示されています。
ビューの違いを見てみる
今回、Laravel Breezeを利用することで、ユーザー認証の機能&コードも最初からついてきています。
私はReactにはあまり慣れていないため、このコードを大いに参考にすることができそうです。
通常のBladeとの構造の違いなど、まずはビュー部分のコードの違いを見ていきたいと思います。
viewsにはエントリポイントのみ
通常のBladeでは、resources/view/
には多くのファイルが収まっているはずですが、今回はapp.blade.php
しかありません。
逆に言えば、ここがエントリポイントとしてシステムが動作します(記述が全てに反映される)。
Laravel×Reactの場合はこの場所ではなく、resources/js/
をメインに開発することになります。
該当ディレクトリには、以下のようなディレクトリ・ファイルが存在します。
- Components/(ディレクトリ)
- Layouts/(ディレクトリ)
- Pages/(ディレクトリ)
- app.jsx
- bootstrap.js
これらを見ていきましょう。ChatGPT大先生に教えてもらったことをまとめます。
Components/
Components
ディレクトリは、再利用可能なUIコンポーネントを格納します。ボタン、インプットフィールド、ナビゲーションバーなど、アプリケーション全体で共通して使用される小さなコンポーネントが含まれます。
Bladeでも同様の思想があるので、分かりやすいですね。
Layouts/
Layouts
ディレクトリは、ページのレイアウトを定義するコンポーネントを格納します。アプリケーションの異なるページに共通するレイアウト要素(例えばヘッダー、フッター、サイドバー)を定義するのに使用されます。
これもBlade同様です。
Pages/
Pages
ディレクトリは、アプリケーションの各ページに対応するコンポーネントを格納します。特定のページや機能に特化しており、Layouts
や Components
ディレクトリの要素を使用して構築されます。
要は各ページごと、1ページずつ作ることになりそうです。
app.jsx
app.jsx
は、アプリケーションのメインのJavaScriptエントリポイントです。Reactコンポーネントのルート、ルーティングの設定、グローバルなスタイルやコンテキストの設定など、アプリケーションの初期化に関連するコードが含まれます。
このファイルはアプリケーションの起動と挙動の基盤を提供するため、非常に重要になりそうです。
bootstrap.js
bootstrap.js
は、アプリケーションのブートストラッププロセス、つまり初期化プロセスを管理するファイルです。ここで外部ライブラリの設定、環境設定、アプリケーションが必要とする前提条件の設定などが行われます。
デフォルトでは、axiosを利用する設定になっています。axiosとはHTTPリクエストを行うためのライブラリです。
コントローラーの違いを見てみる
次に、コントローラーの違いを見てみます。基本的に、大きな違いはなさそうに見えますが、よく見ると処理の最後が変わっています。
ビューに返す部分の違い
通常、以下の様な書き方でビュー(Blade)を指定してコントローラーが終わります。
return view('posts.show', compact('post'));
しかしBreezeで同等のことをする場合、Inertiaのレスポンスメソッドであるrender
を使います。Bladeに変数を渡すかのごとく、Reactコンポーネントにpropsを渡すことが可能です。
return Inertia::render('Profile/Edit', [
'mustVerifyEmail' => $request->user() instanceof MustVerifyEmail,
'status' => session('status'),
]);
なぜ?
Laravel Breeze インストール時、Reactオプションを選択すると、自動的にInertia.js(イナーシャ)がセットアップされます。
Inertia.jsは、LaravelとReactの間のシームレスなデータのやり取りを可能にするライブラリです。
通常はバックエンドとフロントエンドは別物ですよね!?
Inertia.jsのおかげで、それらの間で効率的な通信が行える。つまりフルスタック開発において(良くも悪くも)「いいとこ取り」のようなことができるようになります。
まとめ
コードを見る限り、Bladeで利用する場合よりも、ぐっと難しくなりそうです。Reactの基本構文程度は理解しているつもりでしたが、ハードルを感じます。
とは言えある程度はコードが分かるので、何となくで開発を進めることもできそうです。……うーん。
- 最初からLaravel×Reactで慣れていく
- 先にReactの習熟度合いを高めてから進める
このどちらかで進めるかが難しい所ですね。まだ私は決めかねていますが、今は時間に余裕があるので、他に寄り道をしながら考えてみたいと思います。
個人的には、今回の方法とは別で、Next.js(Reactのフレームワーク)ベースにLaravel(API)と組み合わせるサイト構築にも興味があり、難易度など比べてみたいと思います。
自分なりに結論が出たらまた追記します。
コメント