Typescriptを使ったLaravelの開発で、本番用にビルドを実行すれば「public/build/assets/」にJSファイルが生成されるのだが、私の環境だとそれが機能していないにもかかわらず、TSは動いていた。
このあたりが少しややこしいので、form.tsを例にしてメモとして残しておく
Table of Contents
publicにjsがなくてもTS動く理由
理由は単純にsail npm run dev で開発用にVite経由でビルドしているからだ。
この状態であればpublicは以下にform.jsがなくても、呼び出しもとのgallery.blade.phpなどにtsのパスを定義しておけば、動いてくれる
@push('scripts')
@vite('resources/js/form.ts')
{{-- vite.confugにform.tsを定義しておけば、本番でもビルド後に自動的にTS→JSとして変換・認識してくれる --}}
@endpush
しかし、これはあくまでもローカルでsailコマンドを使っている時だけ有効で、本番用に「npm run build」をすると表示エラーになるだろう。
本番時も動かす場合
「vite.configs.php」にて、下記を実行すればOKだ。
laravel({
input: ['resources/css/app.css', 'resources/js/form.ts'],
refresh: true,
}),
ここに、TSを個別に追加しないと、ローカルでは動いても本番用ビルドには反映されない。
この状態で「npm run build」を実行すれば、「public/build/assets/」にform.tsのが自動生成される。
パスの通し方はjsではなくts表記でOK
ちなみに、laravelではform.jsのようにtsではなくjsでパスを指定する必要はない。
Laravel(正確には Laravel Vite プラグイン)が TypeScript(.ts
)を すべて自動的に .js
に変換・対応してくれるからだ。
- ①
@vite('resources/js/form.ts')
のような Blade の記述をスキャン - ②実際に必要なファイル(=エントリーポイント)を Vite に伝える
- ③Vite が
form.ts → form-[hash].js
に変換 - ④その変換結果を 自動的に
public/build/manifest.json
に記録
こちら側は何もする必要はないのだ。この状態であれば、tsだけでも正常に動くはず。