Nuxt 3 の useAsyncData
機能がバックエンド(サーバーサイドレンダリング)とクライアントサイドでの重複HTTPリクエストを排除する仕組みは、データのキャッシュと再利用を活用しています。以下の流れで実現されています:
1. サーバーサイドでデータを取得
- サーバーサイドレンダリング(SSR)の際、
useAsyncData
を利用して非同期データを取得します。 - サーバーサイドでデータを取得すると、その結果が HTML と一緒に生成され、レスポンスとしてクライアントに送信されます。
- データは
Nuxt payload
としてページの HTML 内に埋め込まれます。このデータは<script>
タグ内に JSON フォーマットでシリアライズされ、クライアント側で直接利用可能になります。
2. クライアントサイドでのデータ利用
- クライアントがページを受け取ると、
useAsyncData
はまずサーバーから埋め込まれたNuxt payload
を確認します。 -
useAsyncData
は、リクエストしたデータが既にpayload
に存在している場合、新たにHTTPリクエストを送らず、そのデータを直接再利用します。 - この仕組みによって、クライアントでの同じデータに対する重複リクエストが排除されます。
3. 再利用のキー(Key)管理
-
useAsyncData
は、データ取得のリクエストごとに一意のキー(デフォルトではuseAsyncData
に渡された名前)を使用します。 - このキーを基に、サーバーサイドで取得されたデータが
payload
に保存され、クライアントでの参照時に利用されます。
具体的な流れをコードで説明
export default defineComponent({
async setup() {
const { data } = useAsyncData('exampleData', () =>
fetch('https://api.example.com/data').then(res => res.json())
);
return { data };
},
});
コードをコピーする
サーバーサイドでの流れ
- サーバーが
fetch
を実行してデータを取得。 - データをページの
Nuxt payload
に埋め込む。- 例:
<script type="application/json" id="__NUXT_DATA__"> {"data":{"exampleData":{...}}} </script>
- 例:
クライアントサイドでの流れ
- ページロード時、
useAsyncData
はまず__NUXT_DATA__
の内容を確認。 -
exampleData
が既に存在していれば、再度リクエストを送らずにそのデータを利用。
4. キャッシュの利用とフレッシュデータの取得
- キャッシュはデフォルトで有効ですが、必要に応じてリフレッシュ可能です。
-
useAsyncData
のオプションでlazy
やdefault
を設定することで、データの取得タイミングやキャッシュ戦略を制御できます。
例:
useAsyncData('exampleData', fetchFunction, { lazy: true, default: () => [] });
結果的なメリット
- 効率的なデータ取得: SSR で一度取得したデータをクライアントでも再利用。
- 重複リクエストの排除: サーバーとクライアント間でデータを共有する仕組みによって不要なHTTPリクエストを防止。
- シームレスな体験: ユーザーはサーバーとクライアントのデータ取得プロセスの違いを意識せず、高速なデータ提供を享受。
この仕組みが、Nuxt 3 の強力なデータ管理能力の基盤となっています。