Vite
AdonisJSは、アプリケーションのフロントエンドアセットをバンドルするためにViteを使用しています。私たちは公式の統合を提供しており、ViteをAdonisJSのようなバックエンドフレームワークと統合するために必要なすべての重い作業を行います。以下を含みます:
- AdonisJS内にVite開発サーバーを埋め込むこと。
- 設定オプションを簡素化するための専用のViteプラグイン。
- Viteによって処理されたアセットのURLを生成するためのEdgeヘルパーとタグ。
- サーバーサイドレンダリング(SSR)を実行するためのViteランタイムAPIへのアクセス。
ViteはAdonisJSの開発サーバーに埋め込まれており、Viteが処理する必要のあるすべてのリクエストは、AdonisJSのミドルウェアを介してViteにプロキシされます。これにより、サーバーサイドレンダリング(SSR)を実行したり、単一の開発サーバーを管理したりするために、ViteのランタイムAPIに直接アクセスできます。また、アセットはAdonisJSによって直接提供され、別のプロセスでは提供されません。
まだ@adonisjs/vite 2.xを使用していますか?マイグレーションガイドを参照して最新バージョンにアップグレードしてください。
インストール
まず、少なくとも以下のバージョンのAdonisJSがインストールされていることを確認してください:
@adonisjs/core
: 6.9.1以降@adonisjs/assembler
: 7.7.0以降
次に、@adonisjs/vite
パッケージをインストールして設定します。以下のコマンドは、パッケージとvite
をインストールし、必要な設定ファイルを作成してプロジェクトを構成します。
node ace add @adonisjs/vite
-
adonisrc.ts
ファイル内で次のサービスプロバイダーを登録します。{providers: [// ...other providers() => import('@adonisjs/vite/vite_provider')]} -
vite.config.ts
とconfig/vite.ts
の設定ファイルを作成します。 -
フロントエンドのエントリーポイントファイル(
resources/js/app.js
など)を作成します。
完了したら、adonisrc.ts
ファイルに以下を追加してください。
import { defineConfig } from '@adonisjs/core/build/standalone'
export default defineConfig({
assetsBundler: false,
hooks: {
onBuildStarting: [() => import('@adonisjs/vite/build_hook')],
},
})
assetsBundler
プロパティはfalse
に設定されており、AdonisJS Assemblerによるアセットバンドラーの管理をオフにします。
hooks
プロパティは@adonisjs/vite/build_hook
を登録してViteのビルドプロセスを実行します。詳細については、Assembler hooksを参照してください。
設定
セットアッププロセスでは、2つの設定ファイルが作成されます。vite.config.ts
ファイルはViteバンドラーを設定するために使用され、config/vite.ts
はAdonisJSのバックエンドで使用されます。
Vite設定ファイル
vite.config.ts
ファイルは、Viteによって使用される通常の設定ファイルです。プロジェクトの要件に応じて、このファイル内で追加のViteプラグインをインストールおよび登録できます。
デフォルトでは、vite.config.ts
ファイルはAdonisJSプラグインを使用しており、次のオプションを受け入れます。
import { defineConfig } from 'vite'
import adonisjs from '@adonisjs/vite/client'
export default defineConfig({
plugins: [
adonisjs({
entrypoints: ['resources/js/app.js'],
reload: ['resources/views/**/*.edge'],
}),
]
})
- entrypoints
-
entrypoints
は、フロントエンドのコードベースのエントリーポイントファイルを指します。通常、追加のインポートを含むJavaScriptまたはTypeScriptファイルになります。各エントリーポイントは、個別の出力バンドルとして結果をもたらします。また、必要に応じて複数のエントリーポイントを定義することもできます。たとえば、ユーザー向けのアプリと管理パネル向けの別個のエントリーポイントなどです。
- buildDirectory
-
buildDirectory
オプションは、出力ディレクトリへの相対パスを定義します。このオプションの値は、Viteのbuild.outDir
オプションに供給されます。デフォルト値を変更する場合は、
config/vite.ts
ファイル内のbuildDirectory
パスも更新する必要があります。デフォルト:public/assets
- reload
-
ファイルの変更時にブラウザを監視してリロードするためのグロブパターンの配列を含みます。デフォルトでは、Edgeテンプレートを監視しますが、追加のパターンを設定することもできます。
- assetsUrl
-
本番環境でアセットのリンクを生成する際に接頭辞とするURLを含みます。Viteの出力をCDNにアップロードする場合は、このプロパティの値をCDNサーバーのURLに設定する必要があります。
バックエンドの設定でも同じ
assetsUrl
の値を使用するようにバックエンドの設定を更新してください。
AdonisJS設定ファイル
AdonisJSは、Viteのビルドプロセスの出力パスに関する情報を知るために、バックエンドでconfig/vite.ts
ファイルを使用します。
import { defineConfig } from '@adonisjs/vite'
const viteBackendConfig = defineConfig({
buildDirectory: 'public/assets',
assetsUrl: '/assets',
})
export default viteBackendConfig
- buildDirectory
-
Viteのビルド出力ディレクトリへのパスを含みます。
vite.config.ts
ファイル内のデフォルト値を変更した場合は、このバックエンドの設定も更新する必要があります。 - assetsUrl
-
本番環境でアセットのリンクを生成する際に接頭辞とするURLを含みます。Viteの出力をCDNにアップロードする場合は、このプロパティの値をCDNサーバーのURLに設定する必要があります。
- scriptAttributes
-
scriptAttributes
プロパティを使用して、@vite
タグを使用して生成されたスクリプトタグに属性を設定できます。属性はキーと値のコレクションです。config/vite.tsdefineConfig({scriptAttributes: {defer: true,async: true,}}) - styleAttributes
-
styleAttributes
プロパティを使用して、@vite
タグを使用して生成されたリンクタグに属性を設定できます。属性はキーと値のコレクションです。config/vite.tsdefineConfig({styleAttributes: {'data-turbo-track': 'reload'}})また、
styleAttributes
オプションに関数を割り当てることで、条件付きで属性を適用することもできます。defineConfig({styleAttributes: ({ src, url }) => {if (src === 'resources/css/admin.css') {return {'data-turbo-track': 'reload'}}}})
フロントエンドアセットのフォルダ構造
AdonisJSは、フロントエンドアセットを格納するための特定のフォルダ構造を強制しません。自由に組織化できます。
ただし、resources
フォルダ内にフロントエンドアセットを格納し、各アセットクラスをそれぞれのサブディレクトリ内に配置することをオススメします。
resources
└── css
└── js
└── fonts
└── images
Viteの出力はpublic/assets
フォルダになります。/assets
サブディレクトリを選択したのは、Viteを使用せずに処理したい他の静的ファイルをpublic
フォルダに引き続き使用できるようにするためです。
開発サーバーの起動
通常どおりアプリケーションを起動すると、AdonisJSが必要なリクエストを自動的にViteにプロキシします。
node ace serve --hmr
Edgeテンプレートにエントリーポイントを含める
vite.config.ts
ファイルで定義されたエントリーポイントのスクリプトタグとスタイルタグを、@vite
Edgeタグを使用してレンダリングできます。このタグはエントリーポイントの配列を受け入れ、script
タグとlink
タグを返します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@vite(['resources/js/app.js'])
</head>
<body>
</body>
</html>
CSSファイルはJavaScriptファイル内でインポートし、別個のエントリーポイントとして登録することをオススメします。例:
resources
└── css
└── app.css
└── js
└── app.js
import '../css/app.css'
Edgeテンプレート内でアセットを参照する
Viteは、エントリーポイントによってインポートされたファイルの依存関係グラフを作成し、バンドルされた出力に応じてパスを自動的に更新します。ただし、ViteはEdgeテンプレートを認識せず、参照されたアセットを検出することはできません。
そのため、Viteによって処理されたファイルのURLを作成するために使用できるEdgeヘルパーを提供しています。次の例では:
asset
ヘルパーは、開発中にVite開発サーバーを指すURLを返します。- 本番環境では、出力ファイルを指すURLを返します。
<link rel="stylesheet" href="{{ asset('resources/css/app.css') }}">
<link rel="stylesheet" href="http://localhost:5173/resources/css/app.css">
<link rel="stylesheet" href="/assets/app-3bc29777.css">
Viteで追加のアセットを処理する
Viteは、フロントエンドのコードによってインポートされない静的アセット(静的な画像、フォント、またはEdgeテンプレート内でのみ参照されるSVGアイコンなど)は無視します。
そのため、これらのアセットの存在をViteに通知する必要があります。そのためには、Glob imports APIを使用します。
次の例では、resources/images
ディレクトリ内のすべてのファイルをViteに処理するように指示しています。このコードはエントリーポイントファイル内に記述する必要があります。
import.meta.glob(['../images/**'])
これで、Edgeテンプレート内で次のように画像を参照できます。
<img src="{{ asset('resources/images/hero.jpg') }}" />
TypeScriptの設定
フロントエンドのコードベースでTypeScriptを使用する場合は、resources
ディレクトリ内に追加のtsconfig.json
ファイルを作成してください。Viteとコードエディタは、resources
ディレクトリ内のTypeScriptソースコードに自動的にこの設定ファイルを使用します。
{
"extends": "../tsconfig.json",
"compilerOptions": {
"baseUrl": ".",
"lib": ["DOM"],
"jsx": "preserve", // Reactを使用している場合
"paths": {
"@/*": ["./js/*"]
}
}
}
ReactでHMRを有効にする
開発中にreact-refreshを有効にするには、@viteReactRefresh
Edgeタグを使用する必要があります。エントリーポイントを含む前に、@vite
タグを使用してください。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@viteReactRefresh()
@vite(['resources/js/app.js'])
</head>
<body>
</body>
</html>
一度完了したら、Reactプラグインを通常通りViteプロジェクトで設定できます。
import { defineConfig } from 'vite'
import adonisjs from '@adonisjs/vite/client'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [
adonisjs({
entrypoints: ["resources/js/app.js"],
}),
react(),
],
})
CDNへのアセットのデプロイ
Viteを使用して本番ビルドを作成した後、バンドルされた出力をCDNサーバーにアップロードしてファイルを提供できます。
ただし、それを行う前に、manifest.json
ファイル内の出力URLがCDNサーバーを指すように、ViteとAdonisJSの両方でCDNサーバーのURLを登録する必要があります。
vite.config.ts
ファイルとconfig/vite.ts
ファイル内でassetsUrl
を定義する必要があります。
import { defineConfig } from 'vite'
import adonisjs from '@adonisjs/vite/client'
export default defineConfig({
plugins: [
adonisjs({
entrypoints: ['resources/js/app.js'],
reloads: ['resources/views/**/*.edge'],
assetsUrl: 'https://cdn.example.com/',
}),
]
})
import { defineConfig } from '@adonisjs/vite'
const viteBackendConfig = defineConfig({
buildDirectory: 'public/assets',
assetsUrl: 'https://cdn.example.com/',
})
export default viteBackendConfig
高度なコンセプト
ミドルウェアモード
古いバージョンのAdonisJSでは、Viteは別のプロセスとして起動され、独自の開発サーバーを持っていました。
3.xバージョンでは、ViteはAdonisJSの開発サーバーに埋め込まれ、Viteが処理する必要のあるすべてのリクエストは、AdonisJSのミドルウェアを介してViteにプロキシされます。
ミドルウェアモードの利点は、ViteのランタイムAPIに直接アクセスしてサーバーサイドレンダリング(SSR)を実行したり、単一の開発サーバーを管理したりできることです。
ミドルウェアモードについて詳しくは、Viteのドキュメントを参照してください。
マニフェストファイル
Viteは、アセットの本番ビルドとともにマニフェストファイルを生成します。
マニフェストファイルには、Viteによって処理されたアセットへのURLが含まれており、AdonisJSはこのファイルを使用して、asset
ヘルパーや@vite
タグを使用してEdgeテンプレート内で参照されるアセットのURLを作成します。