バックエンド統合
注意
従来のバックエンド (例: Rails, Laravel) を使用して HTML を提供し、アセットの提供には Vite を使用する場合は、Awesome Vite にリストされている既存の統合を確認してください。
カスタム統合が必要な場合は、このガイドの手順に従って手動で設定できます。
Vite 設定で、エントリを設定し、ビルドマニフェストを有効にします。
jsexport default
defineConfig({build: { // generate .vite/manifest.json in outDirmanifest: true,rollupOptions: { // overwrite default .html entryinput: '/path/to/main.js', }, }, })module preload polyfill を無効にしていない場合は、エントリにポリフィルもインポートする必要があります。
js// add the beginning of your app entry import 'vite/modulepreload-polyfill'
開発環境では、サーバーの HTML テンプレートに以下を挿入します (
http://localhost:5173
は Vite が実行されているローカル URL に置き換えてください)。html<!-- if development --> <script type="module" src="http://localhost:5173/@vite/client"></script> <script type="module" src="http://localhost:5173/main.js"></script>
アセットを適切に提供するには、2 つのオプションがあります。
- サーバーが静的アセットのリクエストを Vite サーバーにプロキシするように設定されていることを確認します。
server.origin
を設定して、生成されたアセットの URL が相対パスではなくバックエンドサーバーの URL を使用して解決されるようにします。
これは、画像などのアセットを正しく読み込むために必要です。
@vitejs/plugin-react
で React を使用している場合は、上記のスクリプトの前にこれも追加する必要があります。これは、プラグインが提供している HTML を変更できないためです (http://localhost:5173
は Vite が実行されているローカル URL に置き換えてください)。html<script type="module"> import RefreshRuntime from 'http://localhost:5173/@react-refresh' RefreshRuntime.injectIntoGlobalHook(window) window.$RefreshReg$ = () => {} window.$RefreshSig$ = () => (type) => type window.__vite_plugin_react_preamble_installed__ = true </script>
本番環境の場合:
vite build
を実行すると、他のアセットファイルと一緒に.vite/manifest.json
ファイルが生成されます。マニフェストファイルの例は次のとおりです。json{ "_shared-B7PI925R.js": { "file": "assets/shared-B7PI925R.js", "name": "shared", "css": ["assets/shared-ChJ_j-JJ.css"] }, "_shared-ChJ_j-JJ.css": { "file": "assets/shared-ChJ_j-JJ.css", "src": "_shared-ChJ_j-JJ.css" }, "baz.js": { "file": "assets/baz-B2H3sXNv.js", "name": "baz", "src": "baz.js", "isDynamicEntry": true }, "views/bar.js": { "file": "assets/bar-gkvgaI9m.js", "name": "bar", "src": "views/bar.js", "isEntry": true, "imports": ["_shared-B7PI925R.js"], "dynamicImports": ["baz.js"] }, "views/foo.js": { "file": "assets/foo-BRBmoGS9.js", "name": "foo", "src": "views/foo.js", "isEntry": true, "imports": ["_shared-B7PI925R.js"], "css": ["assets/foo-5UjPuW-k.css"] } }
- マニフェストには
Record<name, chunk>
構造があります。 - エントリチャンクまたは動的エントリチャンクの場合、キーはプロジェクトルートからの相対 src パスです。
- エントリ以外のチャンクの場合、キーは生成されたファイルのベース名に
_
が付いたものです。 build.cssCodeSplit
がfalse
の場合に生成される CSS ファイルの場合、キーはstyle.css
です。- チャンクには、静的および動的なインポート (どちらもマニフェスト内の対応するチャンクにマップするキーです) と、対応する CSS ファイルとアセットファイル (存在する場合) に関する情報が含まれます。
- マニフェストには
このファイルを使用して、ハッシュされたファイル名でリンクまたはプリロードディレクティブをレンダリングできます。
適切なリンクをレンダリングする HTML テンプレートの例を次に示します。ここでの構文は説明のみを目的としており、サーバーのテンプレート言語に置き換えてください。
importedChunks
関数は説明用であり、Vite によって提供されるものではありません。html<!-- if production --> <!-- for cssFile of manifest[name].css --> <link rel="stylesheet" href="/{{ cssFile }}" /> <!-- for chunk of importedChunks(manifest, name) --> <!-- for cssFile of chunk.css --> <link rel="stylesheet" href="/{{ cssFile }}" /> <script type="module" src="/{{ manifest[name].file }}"></script> <!-- for chunk of importedChunks(manifest, name) --> <link rel="modulepreload" href="/{{ chunk.file }}" />
具体的には、HTML を生成するバックエンドは、マニフェストファイルとエントリポイントを指定して、次のタグを含める必要があります。
- エントリポイントチャンクの
css
リスト内の各ファイルに対する<link rel="stylesheet">
タグ。 - エントリポイントの
imports
リスト内のすべてのチャンクを再帰的に追跡し、インポートされた各チャンクの各 CSS ファイルに対する<link rel="stylesheet">
タグを含めます。 - エントリポイントチャンクの
file
キーに対するタグ (JavaScript の場合は<script type="module">
、CSS の場合は<link rel="stylesheet">
)。 - オプションで、インポートされた各 JavaScript チャンクの
file
に対する<link rel="modulepreload">
タグ。これもエントリポイントチャンクから始まるインポートを再帰的に追跡します。
上記のマニフェスト例に従って、エントリポイント
views/foo.js
の場合は、次のタグが本番環境に含める必要があります。html<link rel="stylesheet" href="assets/foo-5UjPuW-k.css" /> <link rel="stylesheet" href="assets/shared-ChJ_j-JJ.css" /> <script type="module" src="assets/foo-BRBmoGS9.js"></script> <!-- optional --> <link rel="modulepreload" href="assets/shared-B7PI925R.js" />
一方、エントリポイント
views/bar.js
の場合は、次のタグを含める必要があります。html<link rel="stylesheet" href="assets/shared-ChJ_j-JJ.css" /> <script type="module" src="assets/bar-gkvgaI9m.js"></script> <!-- optional --> <link rel="modulepreload" href="assets/shared-B7PI925R.js" />
importedChunks
の擬似的な実装TypeScript での
importedChunks
の擬似的な実装例 (これは、プログラミング言語とテンプレート言語に合わせて調整する必要があります)。tsimport type { Manifest, ManifestChunk } from 'vite' export default function importedChunks( manifest: Manifest, name: string, ): ManifestChunk[] { const seen = new Set<string>() function getImportedChunks(chunk: ManifestChunk): ManifestChunk[] { const chunks: ManifestChunk[] = [] for (const file of chunk.imports ?? []) { const importee = manifest[file] if (seen.has(file)) { continue } seen.add(file) chunks.push(...getImportedChunks(importee)) chunks.push(importee) } return chunks } return getImportedChunks(manifest[name]) }
- エントリポイントチャンクの