Docker Inertiajs Laravel

Docker Sail × Laravel 10 × Inertia環境でSSRに対応させたけど、SSR化されない

Docker Sail × Laravel 10 × Inertia環境でSSRに対応さたけど、サイトがうまく反映されないという記事のサムネイル画像

awayuki

音大出身。学生時代はフリーランスでWEB制作しながら、2社でエンジニアインターンを経験しました。 23卒で、自社開発ベンチャー企業に入社しエンジニア・デザイナーとして働き、2024年2月、起業しました! このブログでは、ブログ開設方法・プログラミング・音大からエンジニアになれた方法など書いています。 お仕事依頼はお問い合わせフォームからお問い合わせお願いします。 Zenn

LaravelとInertiaとVueの環境構築をして、SSRに対応させるのを実装していました!

公式ドキュメントだけでは、ハマったポイントが多かったので、エラー周りも詳しく書いています。

Laravel のアプリ開発や、WEBデザイン、グラフィックデザインのご依頼大歓迎です…🥺
お問い合わせページからお気軽にご連絡ください。

Laravel 10 × Inertia環境で SSRの構築 手順

軽く導入方法についてもお話しします。

流れとしては、以下になります。

  1. sailとDockerでLaravel10環境構築 ← この時点ではInertiajsはまだ導入していません
  2. Breeze導入時にInertia SSRを選択
  3. 公式ドキュメントをもとにSSR設定

http://localhost:13714に接続してもサイトが見れない

まず1つ目に、ちょっとハマった部分。

$ sail php artisan inertia:start-ssr
Starting SSR server on port 13714...
Inertia SSR server started.

Inertia SSR server started. ってなってるんで、一見いけてそうですけど、http://localhost:13714 を見るとサイトが見れないいい。

どうなった状態がSSR化成功か?

SSRの接続ですが、以下のNOT_FOUNDが返ってきたら成功のようです。

curl http://localhost:13714
{"status":"NOT_FOUND","timestamp":1708435695439}%   

Docker コンテナ内で SSR サーバーが正しく起動しているか確認する

Docker コンテナ内で SSR サーバーが正しく起動しているか確認するために、以下のコマンドを実行してコンテナ内に入り、手動で SSR サーバーにリクエストを送ってみます。

$ sail shell
# コンテナ内で
$ curl http://localhost:13714

このコマンドが成功し、期待したレスポンスが返ってくれば、SSR サーバー自体は正しく動作しています。

私はこの状態で、先ほどご紹介したNOT_FOUND が返ってきたので、成功していました。

ここでレスポンシブが返ってきたということは、Dockerのポート設定が原因です。

docker-compose.yml に以下のポート番号を追加します。

services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.1
            dockerfile: Dockerfile
            args:
                WWWGROUP: "${WWWGROUP}"
        image: sail-8.1/app
        extra_hosts:
            - "host.docker.internal:host-gateway"
        ports:
            - "${APP_PORT:-80}:80"
            - "${VITE_PORT:-5173}:${VITE_PORT:-5173}"
            - "13714:13714"  ← 追加!
(略)

そして、Dockerコンテナを再起動します。

$ sail down
$ sail up -d

この状態で、もう一度下記のコマンドを実行すると、

curl http://localhost:13714
{"status":"NOT_FOUND","timestamp":1708435695439}   

status: NOT_FOUNDになりました!!

ブラウザで見ると、上記のような画面になります。

NOT_FOUNDとなっていますが、今までアプリを見ていたURLで、アプリケーションは閲覧可能なのでご安心を…

サイトを見るとエラーが出てSSR化されていない状態になってしまう

先ほど、NOT_FOUND が返ってきたのにも関わらず、アプリケーションを見ると、SSR化されていません。

sail php artisan inertia:start-ssr を叩いた状態だと、以下のようなエラーが出ます。

$ sail php artisan inertia:start-ssr

[Vue warn]: Property "route" was accessed during render but is not defined on instance.
TypeError: _ctx.route is not a function
    at file:///var/www/html/bootstrap/ssr/ssr.js:2231:24
    at renderComponentSubTree (/var/www/html/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js:692:9)
    at renderComponentVNode (/var/www/html/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js:638:12)
    at renderVNode (/var/www/html/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js:752:14)
    at renderComponentSubTree (/var/www/html/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js:707:7)
    at renderComponentVNode (/var/www/html/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js:638:12)
    at renderVNode (/var/www/html/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js:752:14)
    at renderComponentSubTree (/var/www/html/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js:707:7)
    at renderComponentVNode (/var/www/html/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js:638:12)
    at renderToString (/var/www/html/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js:911:24)
[Vue warn]: Property "route" was accessed during render but is not defined on instance.

これは、Laravel の route 関数をフロントエンドの Vue コンポーネント内で使用しようとしていることが原因のエラーです。

Ziggyのセットアップが必要です。

Ziggyのセットアップ

Ziggy を使用するには、Laravel のルート定義を JavaScript で利用可能にする必要があります。

これを行うには、Laravel プロジェクトの routes/web.php ファイルで定義されたルートに基づいて、Ziggy のルート定義ファイルを生成します。

sail php artisan ziggy:generate

resources/js/ziggy.js が作成されていれば完了です!

次に、resources/js/ssr.js の設定をしていきます。

import './bootstrap';
import '../css/app.css';

import { createApp, h } from 'vue';
import { createInertiaApp } from '@inertiajs/vue3';
import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers';
import { ZiggyVue } from '../../vendor/tightenco/ziggy/dist/vue.m'; // 追加
import { Ziggy } from "./ziggy"; // 追加

const appName = import.meta.env.VITE_APP_NAME || 'Laravel';

createInertiaApp({
    title: (title) => `${title} - ${appName}`,
    resolve: (name) => resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob('./Pages/**/*.vue')),
    setup({ el, App, props, plugin }) {
        return createApp({ render: () => h(App, props) })
            .use(plugin)
            .use(ZiggyVue, Ziggy) // 追加
            .mount(el);
    },
    progress: {
        color: '#4B5563',
    },
});

これで、

sail npm run build
php artisan inertia:start-ssr

を行うと、SSR化したサイトが見れるようになりましたー!

まとめ

Inertiajsかなり便利なので、SSR化して使えるのはSEO的な面から嬉しいですよね。

また、InertiajsでSSR化したアプリケーションを 今後デプロイ作業も予定しているので、その辺りも記事にしていこうと思います!

  • この記事を書いた人

awayuki

音大出身。学生時代はフリーランスでWEB制作しながら、2社でエンジニアインターンを経験しました。 23卒で、自社開発ベンチャー企業に入社しエンジニア・デザイナーとして働き、2024年2月、起業しました! このブログでは、ブログ開設方法・プログラミング・音大からエンジニアになれた方法など書いています。 お仕事依頼はお問い合わせフォームからお問い合わせお願いします。 Zenn

-Docker, Inertiajs, Laravel
-,