よっしー
こんにちは。よっしーです(^^)
今日は、SvelteKitでのデータ読み込みについて解説しています。
背景
SvelteKitでのデータ読み込みについて調査する機会がありましたので、その時の内容を備忘として記事に残しました。
SvelteKitでのデータ読み込み
+page.svelte コンポーネント (およびそれに含まれる +layout.svelte コンポーネント) をレンダリングする前に、多くの場合、データを取得する必要があります。これは、ロード関数を定義することによって行われます。
フェッチリクエスト
SvelteKitのload
関数で提供されるfetch
は、通常のWeb APIのfetch
と同様に動作しますが、以下の追加機能があります:
- サーバー上で認証付きリクエストが可能
- ページリクエストの
cookie
とauthorization
ヘッダーを継承
- サーバー上で相対リクエストが可能
- 通常のサーバーコンテキストでは完全なURLが必要
- 内部リクエストの最適化
- サーバー上で
+server.js
ルートへのリクエストを直接ハンドラ関数に送信 - HTTPコールのオーバーヘッドを回避
- サーバーサイドレンダリング時のレスポンスの最適化
- レスポンスをキャプチャし、レンダリングされたHTMLにインライン化
Response
オブジェクトのtext
、json
、arrayBuffer
メソッドを利用- ヘッダーは
filterSerializedResponseHeaders
で明示的に含めない限りシリアライズされない
- ハイドレーション時の一貫性保証
- レスポンスをHTMLから読み取り、追加のネットワークリクエストを防止
- ブラウザの
fetch
使用時の警告を回避
これらの機能により、SvelteKitのfetch
はサーバーサイドレンダリングとクライアントサイドの両方で効率的かつ一貫したデータ取得を実現します。
// src/routes/items/[id]/+page.js
/** @type {import('./$types').PageLoad} */
export async function load({ fetch, params }) {
const res = await fetch(`/api/items/${params.id}`);
const item = await res.json();
return { item };
}
Cookies
サーバーのload関数は Cookie を取得および設定できます。
// src/routes/+layout.server.js
import * as db from '$lib/server/database';
/** @type {import('./$types').LayoutServerLoad} */
export async function load({ cookies }) {
const sessionid = cookies.get('sessionid');
return {
user: await db.getUser(sessionid)
};
}
SvelteKitのfetch
関数でのクッキーの扱いについて:
- クッキーの転送条件:
- ターゲットホストがSvelteKitアプリケーションと同じ、またはその特定のサブドメインの場合のみ
- 例(SvelteKitが my.domain.com を提供している場合):
- domain.com:クッキーを受け取らない
- my.domain.com:クッキーを受け取る
- api.domain.com:クッキーを受け取らない
- sub.my.domain.com:クッキーを受け取る
- その他のドメインへのクッキー転送制限:
credentials: 'include'
が設定されていても、他のドメインにはクッキーが転送されない- 理由:SvelteKitはどのクッキーがどのドメインに属しているか判断できない(ブラウザはこの情報を提供しない)
- セキュリティ上の理由から、安全でないと判断される
- 回避策:
handleFetch
フックを使用して、必要に応じてクッキーの転送を制御できる
この仕組みは、クッキーの安全な取り扱いとクロスオリジンリクエストのセキュリティを確保するためのものです。
おわりに
今日は、 SvelteKitでのデータ読み込みについて解説しました。
よっしー
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント