Nuxt ライフサイクル
Nuxt アプリケーションのライフサイクルを理解することで、特にサーバーサイドとクライアントサイドのレンダリングにおいて、フレームワークの動作をより深く理解することができます。
この章の目的は、フレームワークの異なる部分、それらの実行順序、およびそれらがどのように連携するかについての概要を提供することです。
サーバー
サーバーでは、アプリケーションへの初回リクエストごとに次のステップが実行されます。
ステップ 1: Nitro サーバーと Nitro プラグインのセットアップ(1回のみ)
Nuxt は、モダンなサーバーエンジンである Nitro によって動作しています。
Nitro が起動すると、/server/plugins
ディレクトリ内のプラグインを初期化して実行します。これらのプラグインは以下を行うことができます:
- アプリケーション全体のエラーをキャプチャして処理する。
- Nitro がシャットダウンする際に実行されるフックを登録する。
- レスポンスの修正など、リクエストライフサイクルイベントのフックを登録する。
Nitro プラグインはサーバー起動時に一度だけ実行されます。サーバーレス環境では、各リクエストのたびにサーバーが起動し、Nitro プラグインも同様に起動します。ただし、これらは待機されません。
ステップ 2: Nitro サーバーミドルウェア
Nitro サーバーを初期化した後、server/middleware/
内のミドルウェアが各リクエストに対して実行されます。ミドルウェアは、認証、ログ記録、リクエストの変換などのタスクに使用できます。
ミドルウェアから値を返すと、リクエストが終了し、返された値がレスポンスとして送信されます。この動作は、適切なリクエスト処理を確保するために一般的には避けるべきです!
ステップ 3: Nuxt の初期化と Nuxt アプリプラグインの実行
まず、Vue と Nuxt のインスタンスが作成されます。その後、Nuxt はサーバープラグインを実行します。これには以下が含まれます:
- Vue Router や
unhead
などの組み込みプラグイン。 plugins/
ディレクトリにあるカスタムプラグイン(例:myPlugin.ts
)や.server
サフィックスを持つプラグイン(例:myServerPlugin.server.ts
)。
プラグインは特定の順序で実行され、互いに依存関係を持つことがあります。実行順序や並行性を含む詳細については、プラグインのドキュメントを参照してください。
このステップの後、Nuxt は app:created
フックを呼び出し、追加のロジックを実行することができます。
ステップ 4: ルートのバリデーション
プラグインの初期化後、ミドルウェアを実行する前に、definePageMeta
関数で定義されている場合、Nuxt は validate
メソッドを呼び出します。validate
メソッドは同期または非同期であり、動的ルートパラメータのバリデーションによく使用されます。
- パラメータが有効な場合、
validate
関数はtrue
を返すべきです。 - バリデーションが失敗した場合、リクエストを終了するために
false
またはstatusCode
やstatusMessage
を含むオブジェクトを返すべきです。
詳細については、ルートバリデーションのドキュメントを参照してください。
こちらも参照 getting-started > routing#route-validationステップ 5: Nuxt アプリミドルウェアの実行
ミドルウェアを使用すると、特定のルートに移動する前にコードを実行できます。認証、リダイレクト、ログ記録などのタスクによく使用されます。
Nuxt には、次の3種類のミドルウェアがあります:
- グローバルルートミドルウェア
- 名前付きルートミドルウェア
- 匿名(またはインライン)ルートミドルウェア
Nuxt は、アプリケーションへの初回アクセス時とルートナビゲーションの前に毎回グローバルミドルウェアを自動的に実行します。名前付きおよび匿名ミドルウェアは、対応するページコンポーネントで定義されたページ(ルート)メタのミドルウェアプロパティで指定されたルートでのみ実行されます。
各タイプの詳細と例については、ミドルウェアのドキュメントを参照してください。
サーバー上でのリダイレクトは、Location:
ヘッダーがブラウザに送信され、新しい場所への新しいリクエストが行われることになります。この際、アプリケーションの状態はクッキーに保存されない限りリセットされます。
ステップ 6: ページとコンポーネントのレンダリング
このステップでは、Nuxt がページとそのコンポーネントをレンダリングし、useFetch
や useAsyncData
を使用して必要なデータを取得します。サーバー上では動的な更新や DOM 操作が行われないため、onBeforeMount
、onMounted
などの Vue ライフサイクルフックは SSR 中には実行されません。
デフォルトでは、Vue はパフォーマンス向上のために SSR 中の依存関係追跡を一時停止します。
サーバーサイドではリアクティビティがありません。これは、Vue SSR がアプリを静的 HTML としてトップダウンでレンダリングするため、すでにレンダリングされたコンテンツを戻って修正することができないためです。
<script setup>
のルートスコープでクリーンアップが必要な副作用を生じるコードは避けるべきです。例えば、setInterval
を使用してタイマーを設定することが挙げられます。クライアントサイドのみのコードでは、タイマーを設定し、onBeforeUnmount
や onUnmounted
で解除することができます。しかし、SSR 中にはアンマウントフックが呼び出されないため、タイマーは永遠に残ります。これを避けるために、副作用のあるコードを onMounted
内に移動してください。
Daniel Roe によるサーバーレンダリングとグローバルステートの説明ビデオを視聴してください。
ステップ 7: HTML 出力の生成
必要なデータがすべて取得され、コンポーネントがレンダリングされた後、Nuxt は unhead
の設定とレンダリングされたコンポーネントを組み合わせて完全な HTML ドキュメントを生成します。この HTML と関連データがクライアントに送信され、SSR プロセスが完了します。
Vue アプリケーションを HTML にレンダリングした後、Nuxt は app:rendered
フックを呼び出します。
HTML を最終化して送信する前に、Nitro は render:html
フックを呼び出します。このフックを使用して、生成された HTML を操作し、追加のスクリプトを挿入したり、メタタグを変更したりできます。
クライアント(ブラウザ)
このライフサイクルの部分は、選択した Nuxt モードに関係なく、ブラウザで完全に実行されます。
ステップ 1: Nuxt の初期化と Nuxt アプリプラグインの実行
このステップはサーバーサイドの実行と似ており、組み込みプラグインとカスタムプラグインの両方が含まれます。
plugins/
ディレクトリ内のカスタムプラグイン(例:myPlugin.ts
)や .client
サフィックスを持つプラグイン(例:myClientPlugin.client.ts
)はクライアントサイドで実行されます。
このステップの後、Nuxt は app:created
フックを呼び出し、追加のロジックを実行することができます。
ステップ 2: ルートのバリデーション
このステップはサーバーサイドの実行と同じで、definePageMeta
関数で定義されている場合、validate
メソッドが含まれます。
ステップ 3: Nuxt アプリミドルウェアの実行
Nuxt ミドルウェアはサーバーとクライアントの両方で実行されます。特定の環境でコードを実行したい場合は、クライアント用に import.meta.client
、サーバー用に import.meta.server
を使用して分割することを検討してください。
ステップ 4: Vue アプリケーションのマウントとハイドレーション
app.mount('#__nuxt')
を呼び出すことで、Vue アプリケーションが DOM にマウントされます。アプリケーションが SSR または SSG モードを使用している場合、Vue はクライアントサイドアプリケーションをインタラクティブにするためにハイドレーションステップを実行します。ハイドレーション中、Vue はアプリケーションを再作成し(サーバーコンポーネントを除く)、各コンポーネントを対応する DOM ノードにマッチさせ、DOM イベントリスナーをアタッチします。
適切なハイドレーションを確保するためには、サーバーとクライアントのデータの一貫性を維持することが重要です。API リクエストには、useAsyncData
、useFetch
、または他の SSR フレンドリーなコンポーザブルを使用することをお勧めします。これらの方法は、サーバーサイドで取得したデータがハイドレーション中に再利用され、リクエストの繰り返しを避けることを保証します。新しいリクエストはハイドレーション後にのみトリガーされ、ハイドレーションエラーを防ぎます。
Vue アプリケーションをマウントする前に、Nuxt は app:beforeMount
フックを呼び出します。
Vue アプリケーションをマウントした後、Nuxt は app:mounted
フックを呼び出します。
ステップ 5: Vue ライフサイクル
サーバーとは異なり、ブラウザでは完全な Vue ライフサイクル が実行されます。
※このページは Nuxt.js 公式ドキュメントの翻訳ページ(非公式)です。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/guide/concepts/nuxt-lifecycle