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

スポンサーリンク
Svelte入門:リファレンス $app/navigation -Vol.4- 未分類
Svelte入門:リファレンス $app/navigation -Vol.4-
この記事は約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 アプリケーション内でのナビゲーション体験をカスタマイズし、よりスムーズで効率的なユーザー体験を提供することができます。

onNavigate

フルページナビゲーション以外の場合に、新しいURLにナビゲーションする直前に指定された callback を実行するライフサイクル関数です。 Promise を返す場合、SvelteKit はナビゲーションを完了する前にその解決を待ちます。これにより、例えば document.startViewTransition を使用することができます。ナビゲーションがユーザーに停滞して見えるため、解決に時間がかかる Promise は避けてください。 コールバックから関数(または関数に解決する Promise)が返された場合、DOM の更新後にその関数が呼び出されます。 onNavigate はコンポーネントの初期化中に呼び出す必要があります。コンポーネントがマウントされている限り、この関数はアクティブな状態を維持します。

function onNavigate(
	callback: (
		navigation: import('@sveltejs/kit').OnNavigate
	) => MaybePromise<(() => void) | void>
): void;

解説

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

  1. タイミング – ナビゲーションが実際に開始される直前に実行されます。
  2. フルページナビゲーションの例外 – フルページリロードを伴うナビゲーション(通常のリンクによるページ遷移など)では実行されません。
  3. Promise のサポート – コールバックが Promise を返す場合、その解決を待ってからナビゲーションが完了します。
  4. DOM更新後のコールバック – コールバックが関数を返すか、関数に解決する Promise を返す場合、DOM 更新後にその関数が実行されます。
  5. ライフサイクル – コンポーネントの初期化時に設定し、コンポーネントがマウントされている間アクティブです。

使用例

<script>
  import { onNavigate } from '$app/navigation';
  
  // View Transitions API を使用したナビゲーション遷移
  onNavigate(async (navigation) => {
    // View Transitions API が利用可能かチェック
    if (!document.startViewTransition) {
      // 未サポートの場合は何もせずナビゲーションを続行
      return;
    }
    
    // View Transition を開始
    const transition = document.startViewTransition();
    
    // この Promise の解決を待ってからナビゲーションが完了する
    return () => {
      // DOM更新後に実行されるコード
      console.log('DOM が更新されました');
      
      // 必要に応じて追加のアニメーションを適用するなどの処理が可能
    };
  });
  
  // ナビゲーション前のデータ保存
  onNavigate((navigation) => {
    // フォームデータの一時保存などを行う
    saveFormDataToLocalStorage();
    
    console.log(`ナビゲーション先: ${navigation.to.url.pathname}`);
    console.log(`ナビゲーション元: ${navigation.from.url.pathname}`);
  });
</script>

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

  1. ページ遷移アニメーション – View Transitions API などを使用して、ページ間の滑らかな遷移アニメーションを実装する場合。
  2. ナビゲーション前のデータ保存 – ユーザーがページを離れる前に一時的なデータを保存する場合。
  3. ナビゲーション分析 – ユーザーのナビゲーション行動を追跡する場合。
  4. 複雑なナビゲーション状態の管理 – ナビゲーションの発生タイミングで特定の状態変更を行いたい場合。

onNavigate は SvelteKit のクライアントサイドナビゲーションを拡張するための強力なツールですが、パフォーマンスに影響を与える可能性があるため、コールバック内の処理は軽量かつ高速であることが望ましいです。

preloadCode

まだ取得されていないルートのコードをプログラムによって事前にインポートします。通常、これは後続のナビゲーションを高速化するために呼び出されます。 /aboutsrc/routes/about/+page.svelte にマッチ)や /blog/*src/routes/blog/[slug]/+page.svelte にマッチ)などの任意のマッチするパス名でルートを指定できます。 preloadData とは異なり、これは load 関数を呼び出しません。モジュールがインポートされたときに解決する Promise を返します。

function preloadCode(pathname: string): Promise<void>;

解説

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

  1. コードの事前読み込み – まだ読み込まれていないルートのコードを事前にインポートします。
  2. パフォーマンス最適化 – ユーザーが特定のリンクをクリックする前にコードを事前に読み込むことで、実際のナビゲーション時の待ち時間を短縮します。
  3. パス指定 – 具体的なパス(/about)やワイルドカードを含むパターン(/blog/*)でルートを指定できます。
  4. preloadData との違いpreloadCode はコンポーネントのコードのみを読み込み、load 関数は実行しません。データの事前読み込みが必要な場合は preloadData を使用します。

使用例

<script>
  import { preloadCode } from '$app/navigation';
  
  // マウス操作を追跡して、ホバーされたリンクのコードを事前に読み込む
  function handleMouseEnter(path) {
    preloadCode(path)
      .then(() => console.log(`${path} のコードが事前読み込みされました`))
      .catch(error => console.error(`事前読み込みエラー: ${error}`));
  }
  
  // 複数のページを一度に事前読み込み
  async function preloadCommonPages() {
    // よく訪問されるページのコードを事前に読み込む
    await Promise.all([
      preloadCode('/dashboard'),
      preloadCode('/settings'),
      preloadCode('/profile')
    ]);
    
    console.log('よく使用されるページのコードが読み込まれました');
  }
  
  // コンポーネントマウント時に実行
  import { onMount } from 'svelte';
  
  onMount(() => {
    // アイドル時にルートを事前読み込み
    if ('requestIdleCallback' in window) {
      window.requestIdleCallback(() => {
        preloadCommonPages();
      });
    } else {
      // requestIdleCallback がサポートされていない場合の代替
      setTimeout(preloadCommonPages, 1000);
    }
  });
</script>

<a 
  href="/dashboard" 
  on:mouseenter={() => handleMouseEnter('/dashboard')}
>
  ダッシュボード
</a>

<a 
  href="/blog/latest" 
  on:mouseenter={() => handleMouseEnter('/blog/*')}
>
  最新記事
</a>

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

  1. ホバー時の事前読み込み – ユーザーがリンクにマウスを合わせたときにコードを事前に読み込み、クリック時の応答性を向上させる。
  2. 予測的事前読み込み – ユーザーが次に訪問する可能性が高いページを予測し、バックグラウンドで事前に読み込む。
  3. アイドル時の最適化 – ブラウザのアイドル時に重要なルートのコードを事前に読み込み、全体的なアプリケーション体験を向上させる。

preloadCode はパフォーマンス最適化のための優れたツールですが、不必要なコードの読み込みを避けるため、ユーザーが実際に訪問する可能性が高いルートに限定して使用することをお勧めします。

おわりに

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

よっしー
よっしー

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

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

コメント

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