Laravel+React+Next.jsを使う方法

Laravel8にReactのフレームワークNext.jsを使う方法の記事です。
使用するバージョン
node : 16.12.0
next : 11.1.2
react : 17.0.2
laravel : 8.65
LaravelとNext.jsの使い方は下記ページも参考にしてください。
プロジェクトの作成
今回はLaravelとNext.jsの2つのディクトリを作ります。
最初に空のディレクトリを作り、カレントにします。
$ mkdir laravel-next
$ cd laravel-next
Laravelのインストール。ディレクトリ名は
api
にします。
$ composer create-project laravel/laravel api
次はNext.jsのインストール
$ yarn create next-app --typescript
プロジェクト名を聞かれるので
client
にします。
? What is your project named? › client
ここまでやるとディレクトリ構造はこんな感じになっていると思います。
laravel-next
├ api
│ └ Laravelが入っている
└ client
└ Next.jsが入っている
Laravelの設定
Next.jsと連携するために設定を編集します。
今回はビルドインサーバーで動作確認します。
デフォルトだとNext.jsのポートは
localhost:3000
なので、
.env
に追加します。
api/.env
FRONTEND_URL=http://localhost:3000
envの設定をオプションから使えるように下記を追加します。
api/config/app.php
CORSの設定をして、envで設定したURLと通信できるようにします。
変更するのは
allowed_origins
と
supports_credentials
です。
api/config/cors.php
return [
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
];
動作確認用に簡単な文字を表示返すだけのAPIを作ります。
api/routes/api.php
return 'Hello Next.js';
Laraelのビルドインサーバーを起動して、
$ cd api
$ php artisan serv
下記にアクセスして文字が表示されることを確認してください。
http://localhost:8000/api/hello
Next.jsの設定
作成するソースファイルを一つのディレクトリで管理できるように設定します。
tsconfig.json
を下記のように編集します。
client/tsconfig.json
{
"compilerOptions": {
// ...
"baseUrl": "src/",
"paths": {
"@/*": ["./*"]
}
},
// ...
}
これでsrcがルートとなるので、
pages
と
styles
を
src
に移動します。
また、pathsを設定したのでインポートするときに
@
からのルートパスが使用できるようになります。
次に使用するライブラリをインストールします。
$ yarn add swr
$ yarn add axios
下記ファイルを作成し、Axiosの初期設定をします。
client/src/libs/axios.ts
import Axios from 'axios'
const axios = Axios.create({
baseURL: 'http://localhost:8000',
headers: {
'X-Requested-With': 'XMLHttpRequest',
},
withCredentials: true,
})
export default axios
Axiosを使うときは基本このファイルと通すことになります。
次に、Laravelで作成した、hello API確認用のページを作成します。
client/src/pages/hello.tsx
import type { NextPage } from 'next'
import useSWR from 'swr'
import axios from '@/libs/axios'
const Hello: NextPage = () => {
const { data, error } = useSWR('/api/hello', () =>
axios
.get('/api/hello')
.then((res: any) => res.data)
)
if (error) return エラーが発生しました
if (!data) return 読み込み中
return (
ようこそ
{data}
)
}
export default Hello
Next.jsのビルドインサーバーを起動します。
Laravelの方も起動したままにしますので、もうひとつターミナルを開きましょう。
$ cd client
$ yarn dev
下記にアクセスしてLaravelで設定した文字「Hello Next.js」が表示されることを確認してください。
Laravelのpublicディレクトリにビルド
ここは最終的にどのような環境で運用するかにもよると思うのですが、今回はNext.jsのビルドをLaravelのpublic
ディレクトリにしてみます。
Laravelのpublicディレクトリから必要なファイルをNext.jsのpublicにコピーします。
$ cp api/public/index.php client/public/index.php
$ cp api/public/.htaccess client/public/.htaccess
package.json
の
build
を編集して書き出し先のディレクトリを変更します。
client/package.json
"scripts": {
"dev": "next dev",
"build": "next build && next export -o ../api/public",
"start": "next start",
"lint": "next lint"
},
api/public
に書き出されていることを確認してください。
トップページにアクセスするとLaravelのwebcomeページが表示されるので、index.htmlが表示されるように
ルートを変更します。
web.php
を下記のようにします。
api/routes/web.php
Route::get('/', function () {
return \File::get(public_path() . '/index.html');
});
LaravelのビルドインサーバーにアクセスしてNext.jsで作成したファイルが表示されることを確認できれば完成です。
http://localhost:8000/hello.html