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

Mar 15, 2025 - 16:26
Mar 31, 2025 - 14:03
 0  1
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