Nuxt ライフサイクル

Nuxt アプリケーションのライフサイクルを理解することは、フレームワークがどのように動作するか、特にサーバーサイドレンダリングとクライアントサイドレンダリングの両方について、より深い洞察を得るのに役立ちます。

この章の目的は、フレームワークのさまざまな部分、その実行順序、およびそれらがどのように連携するかについて、ハイレベルな概要を提供することです。

サーバー

サーバーでは、アプリケーションへの最初のすべてのリクエストに対して、以下の手順が実行されます。

ステップ 1: Nitro サーバーと Nitro プラグインのセットアップ (1 回のみ)

Nuxt はNitro最新のサーバーエンジン、によって強化されています。

Nitro が起動すると、/server/plugins ディレクトリ下のプラグインを初期化し、実行します。これらのプラグインは以下を行うことができます。

  • アプリケーション全体のエラーを捕捉して処理する。
  • Nitro シャットダウン時に実行されるフックを登録する。
  • レスポンスの変更など、リクエストライフサイクルイベントのフックを登録する。
Nitro プラグインは、サーバー起動時に一度だけ実行されます。サーバーレス環境では、サーバーは受信する各リクエストで起動し、Nitro プラグインも同様に起動します。ただし、それらは待機されません。
Docs > 4 X > Guide > Directory Structure > Server#server Plugins で詳細を読む。

ステップ 2: Nitro サーバーミドルウェア

Nitro サーバーの初期化後、server/middleware/ ディレクトリ下のミドルウェアがすべてのリクエストに対して実行されます。ミドルウェアは認証、ロギング、リクエスト変換などのタスクに使用できます。

ミドルウェアから値を返すと、リクエストは終了し、返された値がレスポンスとして送信されます。適切なリクエスト処理を確実にするため、この動作は一般的に避けるべきです!
Docs > 4 X > Guide > Directory Structure > Server#server Middleware で詳細を読む。

ステップ 3: Nuxt の初期化と Nuxt アプリプラグインの実行

まず Vue と Nuxt のインスタンスが作成されます。その後、Nuxt はサーバープラグインを実行します。これには以下が含まれます。

  • Vue Router や unhead などの組み込みプラグイン。
  • app/plugins/ ディレクトリにあるカスタムプラグイン。これにはサフィックスなしのプラグイン (例: myPlugin.ts) や .server サフィックスを持つプラグイン (例: myServerPlugin.server.ts) が含まれます。

プラグインは特定の順序で実行され、相互に依存関係を持つ場合があります。実行順序や並列処理を含む詳細については、「プラグインのドキュメント」を参照してください。

このステップの後、Nuxt は app:created フックを呼び出します。これは追加のロジックを実行するために使用できます。
Docs > 4 X > Guide > Directory Structure > Pluginsで詳細を読むことができます。

ステップ 4: ルート検証

プラグインの初期化後、ミドルウェアの実行前に、Nuxt は definePageMeta 関数で validate メソッドが定義されていればそれを呼び出します。同期または非同期で実行できる validate メソッドは、動的ルートパラメータの検証によく使用されます。

  • パラメータが有効な場合、validate 関数は true を返すべきです。
  • 検証に失敗した場合は、false または statusCode および/または statusMessage を含むオブジェクトを返して、リクエストを終了させるべきです。

詳細については、「ルート検証のドキュメント」を参照してください。

Docs > 4 X > Getting Started > Routing#route Validation で詳細を読む。

ステップ 5: Nuxt アプリミドルウェアの実行

ミドルウェアを使用すると、特定のルートにナビゲートする前にコードを実行できます。これは、認証、リダイレクト、ロギングなどのタスクによく使用されます。

Nuxt には 3 種類のミドルウェアがあります。

  • グローバルルートミドルウェア
  • 名前付きルートミドルウェア
  • 匿名(またはインライン)ルートミドルウェア

Nuxt は、最初のページロード時(サーバーとクライアントの両方)にすべてのグローバルミドルウェアを実行し、その後、クライアントサイドナビゲーションの前に再度実行します。名前付きおよび匿名ミドルウェアは、対応するページコンポーネントで定義されたページ(ルート)メタのミドルウェアプロパティで指定されたルートでのみ実行されます。

各タイプとその例の詳細については、「ミドルウェアのドキュメント」を参照してください。

サーバー上でのリダイレクトは、ブラウザに Location: ヘッダーが送信されることになります。ブラウザはその後、この新しい場所へ新しいリクエストを行います。これが発生すると、Cookie に保持されている場合を除き、すべてのアプリケーションの状態がリセットされます。

詳細については、Docs > 4 X > Guide > Directory Structure > App > Middleware を参照してください。

ステップ 6: ページとコンポーネントのレンダリング

Nuxt はこのステップで、ページとそのコンポーネントをレンダリングし、useFetchuseAsyncData を使用して必要なデータを取得します。サーバー上では動的な更新も DOM 操作も行われないため、onBeforeMountonMounted、およびそれに続く 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 アプリプラグインの実行

このステップはサーバーサイドでの実行と同様で、組み込みプラグインとカスタムプラグインの両方が含まれます。

app/plugins/ ディレクトリにあるカスタムプラグインは、サフィックスなしのプラグイン (例: myPlugin.ts) や .client サフィックスを持つプラグイン (例: myClientPlugin.client.ts) など、クライアント側で実行されます。

このステップの後、Nuxt は app:created フックを呼び出します。これは追加のロジックを実行するために使用できます。
Docs > 4 X > Guide > Directory Structure > Pluginsで詳細を読むことができます。

ステップ 2: ルート検証

このステップはサーバーサイドの実行と同じで、definePageMeta 関数で定義されている場合、validate メソッドが含まれます。

ステップ 3: Nuxt アプリミドルウェアの実行

Nuxt ミドルウェアはサーバーとクライアントの両方で実行されます。特定のコードを特定の環境で実行したい場合は、クライアントには import.meta.client を、サーバーには import.meta.server を使用して分割することを検討してください。

Docs > 4 X > Guide > Directory Structure > App > Middleware#when Middleware Runs で詳細を読む。

ステップ 4: Vue アプリケーションのマウントとハイドレーション

app.mount('#__nuxt') を呼び出すと、Vue アプリケーションが DOM にマウントされます。アプリケーションが SSR または SSG モードを使用している場合、Vue はクライアントサイドアプリケーションをインタラクティブにするためにハイドレーションステップを実行します。ハイドレーション中に、Vue はアプリケーションを再作成し (サーバーコンポーネントを除く)、各コンポーネントを対応する DOM ノードに一致させ、DOM イベントリスナーをアタッチします。

適切なハイドレーションを確実にするには、サーバーとクライアント間のデータの一貫性を維持することが重要です。API リクエストには、useAsyncDatauseFetch、またはその他の SSR フレンドリーなコンポーザブルを使用することをお勧めします。これらのメソッドは、サーバー側でフェッチされたデータがハイドレーション中に再利用され、繰り返しのリクエストが回避されることを保証します。新しいリクエストはハイドレーション後にのみトリガーされるべきであり、ハイドレーションエラーを防ぎます。

Vue アプリケーションをマウントする前に、Nuxt は app:beforeMount フックを呼び出します。
Vue アプリケーションをマウントした後、Nuxt は app:mounted フックを呼び出します。

ステップ 5: Vue ライフサイクル

サーバーとは異なり、ブラウザは完全なVue ライフサイクル.