こんにちは。よっしーです(^^)
今日は、SvelteKitでのリンクオプションについて解説しています。
背景
SvelteKitでのリンクオプションについて調査する機会がありましたので、その時の内容を備忘として記事に残しました。
リンクオプション
SvelteKitでは、アプリのルート間を移動するために、フレームワーク特有の<Link>
コンポーネントではなく、<a>
要素が使用されます。ユーザーがアプリに「所有」されているhref
を持つリンク(例えば、外部サイトへのリンクとは対照的に)をクリックすると、SvelteKitは新しいページのコードをインポートし、必要なデータを取得するためにload
関数を呼び出すことで、新しいページにナビゲートします。
data-sveltekit-*
属性を使用して、リンクの動作をカスタマイズすることができます。これらの属性は、<a>
要素自体、または親要素に適用できます。
これらのオプションは、method="GET"
を持つ<form>
要素にも適用されます。
data-sveltekit-preload-data
ブラウザがユーザーのリンククリックを認識する前に、マウスがリンク上にホバーした(デスクトップの場合)、またはtouchstart
やmousedown
イベントが発生したことを検出できます。どちらの場合も、click
イベントが来ると予測できます。
SvelteKitはこの情報を利用して、コードのインポートとページデータの取得を先行して開始できます。これにより数百ミリ秒の先行が可能となり、ラグを感じるユーザーインターフェースと軽快に感じるインターフェースの差を生み出します。
この動作はdata-sveltekit-preload-data
属性で制御でき、以下の2つの値を持つことができます:
"hover"
: マウスがリンク上で静止すると、プリロードが開始されます。モバイルでは、touchstart
でプリロードが始まります。"tap"
:touchstart
またはmousedown
イベントが登録されるとすぐにプリロードが開始されます。
デフォルトのプロジェクトテンプレートでは、src/app.html
の<body>
要素にdata-sveltekit-preload-data="hover"
属性が適用されており、デフォルトですべてのリンクがホバー時にプリロードされます:
<body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
ユーザーがリンクにホバーした時にload
を呼び出すことが望ましくない場合があります。例えば、誤検知の可能性が高い(ホバーの後にクリックが必ずしも続くとは限らない)場合や、データが非常に速く更新され、遅延が古いデータをもたらす可能性がある場合などです。
このような場合、"tap"
値を指定することで、ユーザーがリンクをタップまたはクリックした時にのみSvelteKitがload
を呼び出すようにできます:
<a data-sveltekit-preload-data="tap" href="/stonks">
現在の株価を取得
</a>
また、$app/navigation
からpreloadData
をプログラム的に呼び出すこともできます。
ユーザーがデータ使用量の削減を選択している場合(つまりnavigator.connection.saveData
がtrue
の場合)、データは決してプリロードされません。
SvelteKitにおけるデータのプリロード機能について説明しています。主なポイントは以下の通りです:
- プリロードの目的:
ユーザーエクスペリエンスを向上させるために、実際のクリックが行われる前にデータを先行して読み込むことができます。これにより、ページ遷移がより速く感じられるようになります。 - プリロードのトリガー:
hover
: マウスがリンク上で静止した時(デスクトップ)、またはtouchstart
イベント時(モバイル)tap
:touchstart
またはmousedown
イベントが発生した時
- 設定方法:
data-sveltekit-preload-data
属性を使用して、プリロードの動作を制御します。この属性は<a>
要素や親要素に適用できます。 - デフォルト設定:
通常、プロジェクトテンプレートでは<body>
要素にdata-sveltekit-preload-data="hover"
が設定されており、全てのリンクがホバー時にプリロードされるようになっています。 - カスタマイズ:
特定のリンクで異なる動作が必要な場合(例:頻繁に更新されるデータ)、個別に"tap"
を指定することで、タップまたはクリック時のみプリロードを行うよう設定できます。 - プログラムによる制御:
$app/navigation
からプログラム的にpreloadData
を呼び出すことも可能です。 - ユーザー設定の尊重:
ユーザーがデータ使用量の削減を選択している場合(navigator.connection.saveData
がtrue
)、プリロードは行われません。
この機能を適切に使用することで、アプリケーションの応答性を向上させ、ユーザーにより滑らかな体験を提供することができます。同時に、ユーザーのデータ使用量設定も尊重するという、バランスの取れたアプローチを採用しています。
おわりに
今日は、 SvelteKitでのリンクオプションについて解説しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント