Zenn
🙆

SvelteKitで<a>のプリロードの完了を待ちたい

に公開

はじめに

皆さん、こんにちは。
今回はSvelteKitの<a>のプリロードを待機する方法を調べましたので、ご紹介します。

<a>のプリロードって?

SvelteKitは<a>でページ遷移のリンクを配置します。この<a>は機能拡張されており、デフォルトだとホバーぼタイミングでプリロードが行われます。

プリロードが終わる前に遷移させたくない

プリロードが完了するのを待つには次のような書き方で実現できます。

preloadData 関数を活用することで、データの事前ロードとその結果に基づくページ遷移を効率的に管理できます。

<script lang="ts">
  import { goto, preloadData } from "$app/navigation"; // SvelteKitのナビゲーション関数をインポート

  // '/examplepage' のデータをプリロードし、成功した場合にそのページへ遷移する非同期関数
  const loadCheck = async () => {
    // '/examplepage' のデータをプリロードし、その結果を取得
    const result = await preloadData("/examplepage");

    // プリロードが成功し、HTTPステータスが200の場合
    if (result.type === "loaded" && result.status === 200) {
      goto("/examplepage"); // '/examplepage' へ遷移
    } 
    // プリロード結果がリダイレクトを示す場合
    else if (result.type === "redirect") {
      goto(result.location); // 指定されたリダイレクト先へ遷移
    } 
    // その他の場合(プリロード失敗など)
    else {
      console.error("プリロードに失敗しました:", result); // エラーメッセージをコンソールに出力
    }
  };
</script>

<!-- ボタンがクリックされたときに loadCheck 関数を実行 -->
<button onclick={loadCheck}>プリロードしてから遷移ボタン</button>

preloadData('パス') を呼び出すことで、該当のページのデータを事前にロードします。preloadData は Promise を返し、その解決時に以下のようなオブジェクトを取得します。

  • { type: 'loaded', status: number, data: Record<string, any> }:データのロードが成功した場合。​
  • { type: 'redirect', location: string }:リダイレクトが必要な場合。​

type が 'loaded' かつ status が 200 の場合、goto('/examplepage') により /examplepage へ遷移します。​type が 'redirect' の場合、goto(result.location) によりリダイレクト先へ遷移します。​

<a>のプリロードのタイミングを変えたい

<a>にはオプションがあり、プリロードのタイミングを変えることができます。デフォルトではホバーですが、ページが表示されたタイミングなどに変更可能です。

<!-- "eager" を指定することで、ページの読み込み時に即座にリンク先のデータをプリロード -->
<a href="/page1" data-sveltekit-preload-data="eager">リンク1</a>

<a>タグにdata-sveltekit-preload-data属性を追加することで、リンク先のデータのプリロードタイミングを制御できます。​

  • "hover" デフォルト
  • "tap" デスクトップではマウスダウン、モバイルではタップ時にプリロードを開始
  • "off"プリロードを無効化
  • "eager"ページの読み込み時に即座にリンク先のコードをプリロード
  • "viewport"リンクがビューポート内に入った際にコードをプリロード

おわりに

プリロードの制御について見てきました。あまり意識しないことかもしれませんが、頻繁なアクセスや確実なアクセスが必要な場合はプリロードについて工夫をしても良いかもしれませんね。

参考リンク集

Discussion

ログインするとコメントできます