アセットのバンドリング(Vite)
はじめに
Viteは、非常に高速な開発環境を提供し、コードを本番用にバンドルする現代的なフロントエンドビルドツールです。Laravelでアプリケーションを構築する際には、通常、Viteを使用してアプリケーションのCSSやJavaScriptファイルを本番用のアセットにバンドルします。
Laravelは、公式のプラグインとBladeディレクティブを提供することで、Viteとシームレスに統合され、開発および本番用のアセットを読み込むこ とができます。
Laravel Mixを使用していますか? Viteは新しいLaravelインストールでLaravel Mixの代わりになりました。Mixのドキュメントについては、Laravel Mixのウェブサイトをご覧ください。Viteに切り替えたい場合は、移行ガイドをご覧ください。
ViteとLaravel Mixの選択
Viteに移行する前に、新しいLaravelアプリケーションは、アセットをバンドルする際にwebpackを利用している Mixを使用していました。 Viteは、豊かなJavaScriptアプリケーションを構築する際に、より高速で生産性の高いエクスペリエンスを提供することに焦点を当てています。 Inertiaなどのツールで開発されたSPA(Single Page Application)を含む場合、Viteが最適です。
Viteは、Livewireを使用してJavaScript "スプリンクル"を含む従来のサーバーサイドレンダリングアプリケーションでもうまく機能します。ただし、Laravel Mixがサポートする任意のアセットをビルドに直接参照されていないアセットをコピーする機能など、一部の機能が欠けています。
Mixに戻る
Viteのスキャフォールディングを使用して新しいLaravelアプリケーションを開始しましたが、Laravel Mixとwebpackに戻る必要がありますか? 問題ありません。 ViteからMixに移行する公式ガイドをご参照ください。
インストールとセットアップ
以下のドキュメントでは、Laravel Viteプラグインを手動でインストールおよび構成する方法について説明しています。ただし、Laravelのスターターキットには、このスキャフォールディングがすでに含まれており、LaravelとViteを素早く始める最速の方法です。
Nodeのインストール
ViteとLaravelプラグインを実行する前に、Node.js(16+)とNPMがインストールされていることを確認する必要があります:
node -v
npm -v
最新バージョンのNodeとNPMを簡単にインストールするには、公式Nodeウェブサイトからシンプルなグラフィカルインストーラーを使用できます。また、Laravel Sailを使用している場合は、Sailを介してNodeとNPMを呼び出すことができます:
./vendor/bin/sail node -v
./vendor/bin/sail npm -v
ViteとLaravelプラグインのインストール
新しいLaravelのインストールでは、アプリケーションディレクトリ構造のルートにpackage.json
ファイルがあります。デフォルトのpackage.json
ファイルには、ViteとLaravelプラグインを使用するために必要なすべてがすでに含まれています。NPMを使用してアプリケーションのフロントエンド依存関係をインストールできます:
npm install
Viteの設定
Viteはプロジェクトのルートにあるvite.config.js
ファイルを介して構成されます。必要に応じてこのファイルをカスタマイズすることができ、@vitejs/plugin-vue
や@vitejs/plugin-react
など、アプリケーションが必要とする他のプラグインをインストールすることもできます。
Laravel Viteプラグインでは、アプリケーションのエントリポイントを指定する必要があります。これにはJavaScriptやCSSファイルが含まれ、TypeScript、JSX、TSX、Sassなどの前処理言語も含まれます。
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel([
'resources/css/app.css',
'resources/js/app.js',
]),
],
});
SPAを構築している場合、Inertiaを使用して構築されたアプリケーションを含む場合、ViteはCSSエントリポイントなしで最適に機能します:
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel([
'resources/css/app.css', // [tl! remove]
'resources/js/app.js',
]),
],
});
代わりに、JavaScript経由でCSSをインポートする必要があります。通常、これはアプリケーションのresources/js/app.js
ファイルで行われます:
import './bootstrap';
import '../css/app.css'; // [tl! add]
Laravelプラグインは、SSRエントリポイントなどの複数のエントリポイントや高度な構成オプションもサポートしています。
安全な開発サーバーでの作業
ローカル開発WebサーバーがHTTPS経由でアプリケーションを提供している場合、Vite開発サーバーへの接続に問題が発生する可能性があります。
Laravel Herdを使用しており、サイトをセキュリティで保護しているか、Laravel Valetを使用しており、アプリケーションに対してsecureコマンドを実行している場合、Laravel Viteプラグインは自動的に生成されたTLS証明書を検出して使用します。
アプリケーションのディレクトリ名と一致しないホストを使用してサイトをセキュリティで保護した場合、アプリケーションのvite.config.js
ファイルでホストを手動で指定することができます。
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel({
// ...
detectTls: 'my-app.test', // [tl! add]
}),
],
});
別のWebサーバーを使用する場合、信頼できる証明書を生成し、手動でViteを生成された証明書を使用するように構成する必要があります:
// ...
import fs from 'fs'; // [tl! add]
const host = 'my-app.test'; // [tl! add]
export default defineConfig({
// ...
server: { // [tl! add]
host, // [tl! add]
hmr: { host }, // [tl! add]
https: { // [tl! add]
key: fs.readFileSync(`/path/to/${host}.key`), // [tl! add]
cert: fs.readFileSync(`/path/to/${host}.crt`), // [tl! add]
}, // [tl! add]
}, // [tl! add]
});
システムのために信頼できる証明書を生成できない場合は、@vitejs/plugin-basic-ssl
プラグインをインストールして構成することができます。信頼されていない証明書を使用する場合は、npm run dev
コマンドを実行するときにコンソールの「Local」リンクに従って、Viteの開発サーバーの証明書警告をブラウザで受け入れる必要があります。
WSL2のSailでの開発サーバーの実行
Windows Subsystem for Linux 2(WSL2)内のLaravel SailでVite開発サーバーを実行する場合は、ブラウザが開発サーバーと通信できるようにするために、vite.config.js
ファイルに以下の構成を追加する必要があります:
// ...
export default defineConfig({
// ...
server: { // [tl! add:start]
hmr: {
host: 'localhost',
},
}, // [tl! add:end]
});
開発サーバーが実行されている間にファイルの変更がブラウザに反映されない場合は、Viteのserver.watch.usePolling
オプションを構成する必要があるかもしれません。
スクリプトとスタイルの読み込み
Viteエントリーポイントが構成されたら、アプリケーションのルートテンプレートの<head>
に追加する@vite()
ブレードディレクティブでそれらを参照できます:
<!doctype html>
<head>
{{-- ... --}}
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
CSSをJavaScript経由でインポートしている場合は、JavaScriptエントリーポイントのみを含めれば十分です:
<!doctype html>
<head>
{{-- ... --}}
@vite('resources/js/app.js')
</head>
@vite
ディレクティブは、Vite開発サーバーを自動的に検出し、Viteクライアントを注入してHot Module Replacementを有効にします。ビルドモードでは、ディレクティブはコンパイルされたバージョン管理されたアセットをロードし、インポートされたCSSを含めます。
必要に応じて、@vite
ディレクティブを呼び出す際にコンパイルされたアセットのビルドパスを指定することもできます:
<!doctype html>
<head>
{{-- Given build path is relative to public path. --}}
@vite('resources/js/app.js', 'vendor/courier/build')
</head>
インラインアセット
アセットのバージョン付きURLへのリンクではなく、アセットの生のコンテンツを含める必要がある場合があります。たとえば、HTMLコンテンツをPDFジェネレータに渡す際に、アセットのコンテンツを直接ページに含める必要があるかもしれません。Vite
ファサードが提供するcontent
メソッドを使用して、Viteアセットのコンテンツを出力できます:
@use('Illuminate\Support\Facades\Vite')
<!doctype html>
<head>
{{-- ... --}}
<style>
{!! Vite::content('resources/css/app.css') !!}
</style>
<script>
{!! Vite::content('resources/js/app.js') !!}
</script>
</head>
Viteの実行
Viteを実行する方法は2つあります。開発サーバーをdev
コマンドで実行することができ、これはローカルで開発する際に便利です。開発サーバーはファイルの変更を自動的に検出し、すぐに開いているブラウザウィンドウに反映します。
または、build
コマンドを実行すると、アプリケーションのアセットがバージョン管理され、バンドルされ、本番環境へのデプロイの準備が整います:
# Run the Vite development server...
npm run dev
# Build and version the assets for production...
npm run build
WSL2でSailの開発サーバーを実行している場合は、追加の構成オプションが必要になる場合があります。
JavaScriptの操作
エイリアス
デフォルトでは、Laravelプラグインは一般的なエイリアスを提供して、すぐに始めることができ、アプリケーションのアセットを便利にインポートできます:
{
'@' => '/resources/js'
}
vite.config.js
構成ファイルに独自のエイリアスを追加することで、'@'
エイリアスを上書きできます:
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
export default defineConfig({
plugins: [
laravel(['resources/ts/app.tsx']),
],
resolve: {
alias: {
'@': '/resources/ts',
},
},
});
Vue
Vueフレームワークを使用してフロントエンドを構築したい場合は、@vitejs/plugin-vue
プラグインもインストールする必要があります:
npm install --save-dev @vitejs/plugin-vue
その後、vite.config.js
構成ファイルにプラグインを含めることができます。LaravelでVueプラグインを使用する際に必要ないくつかの追加オプションがあります:
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
plugins: [
laravel(['resources/js/app.js']),
vue({
template: {
transformAssetUrls: {
// The Vue plugin will re-write asset URLs, when referenced
// in Single File Components, to point to the Laravel web
// server. Setting this to `null` allows the Laravel plugin
// to instead re-write asset URLs to point to the Vite
// server instead.
base: null,
// The Vue plugin will parse absolute URLs and treat them
// as absolute paths to files on disk. Setting this to
// `false` will leave absolute URLs un-touched so they can
// reference assets in the public directory as expected.
includeAbsolute: false,
},
},
}),
],
});
Laravelのスターターキットには、適切なLaravel、Vue、Viteの構成がすでに含まれています。Laravel、Vue、Viteを素早く始める最速の方法については、Laravel Breezeをチェックしてください。
React
フロントエンドをReactフレームワークを使用して構築したい場合は、@vitejs/plugin-react
プラグインもインストールする必要があります:
npm install --save-dev @vitejs/plugin-react
その後、vite.config.js
構成ファイルにプラグインを含める必要があります:
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [
laravel(['resources/js/app.jsx']),
react(),
],
});
JSXを含むファイルには.jsx
または.tsx
拡張子が必要であり、必要に応じてエントリーポイントを更新する必要があります。上記のように。
既存の@vite
ディレクティブに追加して、追加の@viteReactRefresh
Bladeディレクティブを含める必要があります。
@viteReactRefresh
@vite('resources/js/app.jsx')
@viteReactRefresh
ディレクティブは、@vite
ディレクティブの前に呼び出す必要があります。
Laravelのスターターキットには、適切なLaravel、React、およびVite構成がすでに含まれています。Laravel、React、およびViteを素早く始める方法として、Laravel Breezeをチェックしてください。
Inertia
Laravel Viteプラグインは、Inertiaページコンポーネントを解決するのに便利なresolvePageComponent
関数を提供します。以下は、Vue 3を使用したヘルパーの使用例ですが、Reactなどの他のフレームワークでもこの関数を利用することができます:
import { createApp, h } from 'vue';
import { createInertiaApp } from '@inertiajs/vue3';
import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers';
createInertiaApp({
resolve: (name) => resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob('./Pages/**/*.vue')),
setup({ el, App, props, plugin }) {
return createApp({ render: () => h(App, props) })
.use(plugin)
.mount(el)
},
});
Laravelのスターターキットには、適切なLaravel、Inertia、およびVite構成がすでに含まれています。Laravel、Inertia、およびViteを素早く始める方法として、Laravel Breezeをチェックしてください。
URL処理
Viteを使用してアプリケーションのHTML、CSS、またはJSでアセットを参照する場合、考慮すべき注意点がいくつかあります。まず、絶対パスでアセットを参照する場合、Viteはアセットをビルドに含めません。そのため、アセットが公開ディレクトリで利用可能であることを確認する必要があります。
相対アセットパスを参照する場合は、それらが参照されているファイルに対して相対的であることを覚えておく必要があります。相対パスを介して参照されるアセットは、Viteによって書き換えられ、バージョン管理され、バンドルされます。
考えられるプロジェクト構造は次のとおりです:
public/
taylor.png
resources/
js/
Pages/
Welcome.vue
images/
abigail.png
次の例は、Viteが相対および絶対URLをどのように扱うかを示しています:
<!-- This asset is not handled by Vite and will not be included in the build -->
<img src="/taylor.png">
<!-- This asset will be re-written, versioned, and bundled by Vite -->
<img src="../../images/abigail.png">
スタイルシートの操作
Viteのドキュメント内でViteのCSSサポートについて詳しく学ぶことができます。TailwindなどのPostCSSプラグインを使用している場合は、プロジェクトのルートにpostcss.config.js
ファイルを作成すると、Viteが自動的に適用されます:
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
Laravelのスターターキットには、適切なTailwind、PostCSS、およびViteの設定がすでに含まれています。また、スターターキットを使用せずにTailwindとLaravelを使用したい場合は、Laravel用Tailwindのインストールガイドを参照してください。
Bladeとルートの操作
Viteを使用した静的アセットの処理
JavaScriptやCSSでアセットを参照する場合、Viteはそれ らを自動的に処理およびバージョン管理します。さらに、Bladeベースのアプリケーションをビルドする際、ViteはBladeテンプレート内でのみ参照する静的アセットも処理およびバージョン管理できます。
ただし、これを実現するには、アプリケーションのエントリーポイントに静的アセットをインポートしてViteに認識させる必要があります。たとえば、resources/images
に保存されているすべての画像とresources/fonts
に保存されているすべてのフォントを処理およびバージョン管理したい場合は、アプリケーションのresources/js/app.js
エントリーポイントに次のように追加する必要があります:
import.meta.glob([
'../images/**',
'../fonts/**',
]);
これらのアセットはnpm run build
を実行するとViteによって処理されます。その後、BladeテンプレートでこれらのアセットをVite::asset
メソッドを使用して参照できます。このメソッドは指定されたアセットのバージョン管理されたURLを返します:
<img src="{{ Vite::asset('resources/images/logo.png') }}">