Svelte入門:リファレンス $app/navigation -Vol.3-

スポンサーリンク
Svelte入門:リファレンス $app/navigation -Vol.3- 用語解説
Svelte入門:リファレンス $app/navigation -Vol.3-
この記事は約10分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、SvelteKitのリファレンスについて解説しています。

スポンサーリンク

背景

SvelteKitのリファレンスについて調査する機会がありましたので、その時の内容を備忘として記事に残しました。

$app/navigation

import {
	afterNavigate,
	beforeNavigate,
	disableScrollHandling,
	goto,
	invalidate,
	invalidateAll,
	onNavigate,
	preloadCode,
	preloadData,
	pushState,
	replaceState
} from '$app/navigation';

$app/navigation モジュールは SvelteKit アプリケーションでクライアントサイドのナビゲーションを制御するための関数を提供します。主な機能は以下の通りです:

  1. afterNavigate – ナビゲーション完了後に実行されるコールバック関数を設定します。ページ遷移後の処理に使用します。
  2. beforeNavigate – ナビゲーション開始前に実行されるコールバック関数を設定します。ページ遷移前の処理に使用します。
  3. disableScrollHandling – SvelteKit のデフォルトのスクロール処理を無効化します。カスタムのスクロール動作を実装したい場合に使用します。
  4. goto – プログラムによるナビゲーションを実行します。指定されたURLに移動します。
  5. invalidate – 特定のデータの依存関係を無効化し、ページのデータを再読み込みします。
  6. invalidateAll – すべてのデータの依存関係を無効化し、ページ全体のデータを再読み込みします。
  7. onNavigate – ナビゲーション中に実行されるコールバック関数を設定します。
  8. preloadCode – 指定されたページのコードを事前に読み込みます。パフォーマンス向上のために使用します。
  9. preloadData – 指定されたページのデータを事前に読み込みます。パフォーマンス向上のために使用します。
  10. pushState – ブラウザの履歴に新しいエントリを追加します。新しいURLにナビゲーションする際に使用します。
  11. replaceState – 現在のブラウザ履歴エントリを置き換えます。現在のURLを別のURLに置き換える際に使用します。

これらの関数を使用することで、SvelteKit アプリケーション内でのナビゲーション体験をカスタマイズし、よりスムーズで効率的なユーザー体験を提供することができます。

invalidate

fetchdepends を介して問題の url に依存している場合、現在アクティブなページに属する任意の load 関数を再実行させます。ページがその後更新されると解決する Promise を返します。 引数が string または URL として与えられる場合、それは fetchdepends に渡されたのと同じ URL(クエリパラメータを含む)に解決される必要があります。カスタム識別子を作成するには、[a-z]+: で始まる文字列(例:custom:state)を使用します — これは有効な URL です。 function 引数を使用してカスタム述語を定義できます。これは完全な URL を受け取り、true が返された場合に load を再実行させます。これは、完全一致ではなくパターンに基づいて無効化したい場合に便利です。

// 例: クエリパラメータに関係なく '/path' にマッチさせる
import { invalidate } from '$app/navigation';

invalidate((url) => url.pathname === '/path');
function invalidate(
	resource: string | URL | ((url: URL) => boolean)
): Promise<void>;

解説

invalidate は SvelteKit のナビゲーション機能で、以下のような特徴があります:

  1. データの再取得 – 特定のリソースに依存するページの load 関数を再実行させます。
  2. 引数のタイプ:
    • string: URL 文字列
    • URL: URL オブジェクト
    • function: URL を引数に取り、真偽値を返す関数
  3. 依存関係の仕組み – ページの load 関数内で fetchdepends を使用してリソースに依存関係を設定している場合のみ、その依存関係が一致する場合に再実行されます。
  4. カスタム識別子custom:mydata のような形式でカスタム識別子を作成できます。これは実際の URL ではなく、データの依存関係を表す識別子として機能します。
  5. 関数による条件付き無効化 – 関数を使用して、特定のパスやパターンに基づいた条件付き無効化も可能です。

使用例

<script>
  import { invalidate } from '$app/navigation';
  
  // 特定のAPIエンドポイントに依存するデータを再取得
  async function refreshUserData() {
    await invalidate('/api/user');
    console.log('ユーザーデータが更新されました');
  }
  
  // カスタム識別子を使用したデータの無効化
  async function resetAppState() {
    await invalidate('custom:appState');
    console.log('アプリの状態がリセットされました');
  }
  
  // パターンマッチングによる無効化
  async function refreshAllProductData() {
    await invalidate((url) => url.pathname.startsWith('/api/products'));
    console.log('すべての商品データが更新されました');
  }
</script>

<!-- load 関数の例 (別のファイルで定義) -->
<!--
export async function load({ fetch, depends }) {
  // このURLに対する依存関係を設定
  depends('/api/user');
  
  // カスタム識別子に対する依存関係を設定
  depends('custom:appState');
  
  // データ取得
  const userData = await fetch('/api/user').then(r => r.json());
  const productData = await fetch('/api/products/featured').then(r => r.json());
  
  return {
    user: userData,
    products: productData
  };
}
-->

<button on:click={refreshUserData}>ユーザーデータを更新</button>
<button on:click={resetAppState}>アプリ状態をリセット</button>
<button on:click={refreshAllProductData}>全商品データを更新</button>

この関数は、ユーザーアクションに応じてデータを再取得したい場合や、特定のデータが変更された際にページを更新したい場合など、アプリケーションの状態管理に非常に役立ちます。load 関数で定義された依存関係に基づいて選択的にデータを再取得できるため、効率的なデータ更新が可能になります。

invalidateAll

現在アクティブなページに属するすべての load 関数を再実行させます。ページがその後更新されると解決する Promise を返します。

function invalidateAll(): Promise<void>;

解説

invalidateAll は SvelteKit のナビゲーション機能で、以下のような特徴があります:

  1. すべてのデータの再取得 – 現在のページに関連するすべての load 関数を無条件で再実行します。
  2. 引数なし – 特定のリソースを指定する必要がなく、すべてのデータを一括で無効化します。
  3. Promise の返却 – ページ更新が完了したときに解決する Promise を返します。
  4. invalidate との違いinvalidate が特定のリソースに依存するデータのみを再取得するのに対し、invalidateAll はすべてのデータを再取得します。

使用例

<script>
  import { invalidateAll } from '$app/navigation';
  
  // ページ内のすべてのデータを更新する関数
  async function refreshAllData() {
    try {
      await invalidateAll();
      console.log('すべてのデータが更新されました');
    } catch (error) {
      console.error('データの更新に失敗しました', error);
    }
  }
  
  // 設定変更後などにすべてのデータを更新
  async function saveSettings() {
    // 設定を保存
    await saveUserSettings();
    
    // 設定変更の影響を受ける可能性のあるすべてのデータを更新
    await invalidateAll();
  }
</script>

<!-- load 関数の例 (別のファイルで定義) -->
<!--
export async function load({ fetch, depends }) {
  // 複数のデータソースからデータを取得
  const userData = await fetch('/api/user').then(r => r.json());
  const notificationsData = await fetch('/api/notifications').then(r => r.json());
  const settingsData = await fetch('/api/settings').then(r => r.json());
  
  return {
    user: userData,
    notifications: notificationsData,
    settings: settingsData
  };
}
-->

<button on:click={refreshAllData}>すべてのデータを更新</button>
<button on:click={saveSettings}>設定を保存</button>

この関数は、以下のようなシナリオで特に役立ちます:

  1. データの包括的な更新 – ユーザーが「更新」ボタンをクリックした際など、ページ内のすべてのデータを最新の状態に更新したい場合。
  2. 複雑な依存関係 – 複数のデータ間の依存関係が複雑で、個別のリソースを指定するよりもすべてを更新した方が簡単な場合。
  3. アプリケーション状態の変更 – ユーザー設定の変更やセッション更新など、アプリケーション全体の状態に影響を与える変更があった場合。

invalidateAll は便利ですが、すべてのデータを再取得するため、必要以上のネットワークリクエストを発生させる可能性があります。パフォーマンスを考慮する場合は、可能な限り invalidate を使用して必要なデータのみを更新することをお勧めします。

おわりに

今日は、 SvelteKitのリファレンスについて解説しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました