🙆♀️
Laravel Viteでvueにimport.meta.url経由でクエリパラメータを渡す
import.meta.url
モジュールの場合、import.meta
オブジェクトを使用して自身のメタ情報にアクセスできる。
そのため、
<script type="module" src="app.js?someURLInfo=5"></script>
このとき、app.js内ではimport.meta.url
で自身のURLをクエリパラメータやハッシュ付きで取得することができる。
つまり、
new URL(import.meta.url).searchParams.get('someURLInfo') // '5';
のようにしてクエリパラメータ経由で値を渡すことができる。
Laravel Viteでの利用
さて、Laravel Viteでこれを利用しようと思うと、jsの読み込みは
@vite('resources/js/app.js')
のように書くので
@vite('resources/js/app.js?someURLInfo=5')
とすれば良さそうだが、これでは上手く行かない。
正確には、npm run dev
で開発サーバを起動してローカルで開発する分には動くが、npm run build
を実行して本番にデプロイすると生成されたjsファイルの参照に失敗して500エラーになる。
そこでLaravelのドキュメントを読むと、Viteプラグインには高度なカスタマイズとしてパスの値を変更するcreateAssetPathsUsing
というメソッドが用意されているようだ。
つまりこう書けば良いらしい。
{{
Vite::withEntryPoints(['resources/js/app.js'])
->createAssetPathsUsing(function (string $path, ?bool $secure) {
return "/{$path}?someURLInfo=5";
})
}}
ところが、これはこれで今度は本番では上手く動くがnpm run dev
で開発サーバを起動してローカルで開発しようとするとcreateAssetPathsUsing
で設定した事が無視されてしまい上手く行かない。
しかし裏を返せば片方は本番で上手く動き、片方は開発サーバで上手く動く訳だから、両方を組み合わせれば良さそうだ。そのためには開発サーバを起動して開発中なのかどうかが判別出来れば良い。
ドキュメントを読むと幸いViteクラスにはそのようなメソッドが用意されている。
isRunningHot
がそれだ。
つまりこうだ。
TL;DR
index.blade.php
// Viteのエイリアスを設定しておくこと
// 'Vite' => \Illuminate\Support\Facades\Vite::class,
@if(Vite::isRunningHot())
@vite('resources/js/app.js?someURLInfo=5')
@else
{{
Vite::withEntryPoints(['resources/js/app.js'])
->createAssetPathsUsing(function (string $path, ?bool $secure) {
return "/{$path}?someURLInfo=5";
})
}}
@endif
Discussion