使用するバージョン
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-nextLaravelのインストール。ディレクトリ名は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に追加します。
FRONTEND_URL=http://localhost:3000envの設定をオプションから使えるように下記を追加します。
'frontend_url' => env('FRONTEND_URL', 'http://localhost'),CORSの設定をして、envで設定したURLと通信できるようにします。
変更するのはallowed_originsとsupports_credentialsです。
<?phpreturn [ 'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => [config('app.frontend_url')], // 変更
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => true, // 変更];動作確認用に簡単な文字を表示返すだけのAPIを作ります。
Route::get('/hello', function () { return 'Hello Next.js';});Laraelのビルドインサーバーを起動して、
$ cd api$ php artisan serv下記にアクセスして文字が表示されることを確認してください。
http://localhost:8000/api/helloNext.jsの設定
作成するソースファイルを一つのディレクトリで管理できるように設定します。
tsconfig.jsonを下記のように編集します。
{ "compilerOptions": { // ... "baseUrl": "src/", "paths": { "@/*": ["./*"] } }, // ... }これでsrcがルートとなるので、pagesとstylesをsrcに移動します。
また、pathsを設定したのでインポートするときに@からのルートパスが使用できるようになります。
次に使用するライブラリをインストールします。
$ yarn add swr$ yarn add axios下記ファイルを作成し、Axiosの初期設定をします。
import Axios from 'axios'
const axios = Axios.create({ baseURL: 'http://localhost:8000', headers: { 'X-Requested-With': 'XMLHttpRequest', }, withCredentials: true,})
export default axiosAxiosを使うときは基本このファイルと通すことになります。
次に、Laravelで作成した、hello API確認用のページを作成します。
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 <div>エラーが発生しました</div> if (!data) return <div>読み込み中</div> return ( <div> <h1>ようこそ</h1> <p>{data}</p> </div> )}
export default HelloNext.jsのビルドインサーバーを起動します。
Laravelの方も起動したままにしますので、もうひとつターミナルを開きましょう。
$ cd client$ yarn dev下記にアクセスしてLaravelで設定した文字「Hello Next.js」が表示されることを確認してください。
http://localhost:3000/helloLaravelの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/.htaccesspackage.jsonのbuildを編集して書き出し先のディレクトリを変更します。
"scripts": { "dev": "next dev", "build": "next build && next export -o ../api/public", "start": "next start", "lint": "next lint"},clientディレクトリでビルドコマンドを実行します。
$ yarn buildapi/publicに書き出されていることを確認してください。
トップページにアクセスするとLaravelのwebcomeページが表示されるので、index.htmlが表示されるようにルートを変更します。
web.phpを下記のようにします。
Route::get('/', function () { return \File::get(public_path() . '/index.html');});LaravelのビルドインサーバーにアクセスしてNext.jsで作成したファイルが表示されることを確認できれば完成です。
http://localhost:8000/hello.htmlそのままではないですが、Githubにサンプルあります。


