プリフェッチ
ページのロード時間は、サイトの使いやすさとサイト全体の快適さに大きな影響を与えます。Astroのオプトインのプリフェッチを利用すると、訪問者がマルチページアプリケーション(MPA)のサイトを操作する際に、ほぼ瞬時にページナビゲーションできるようになります。
プリフェッチを有効にする
セクションタイトル: プリフェッチを有効にするプリフェッチは、prefetch
設定で有効にできます。
import { defineConfig } from 'astro/config';
export default defineConfig({ prefetch: true});
プリフェッチスクリプトがサイトのすべてのページに追加されます。その後、サイト上の任意の<a />
リンクにdata-astro-prefetch
属性を追加することで、プリフェッチにオプトインできます。リンク上にホバーすると、スクリプトがページをバックグラウンドでフェッチします。
<a href="/about" data-astro-prefetch>
プリフェッチはサイト内のリンクに対してのみ機能し、外部リンクに対しては機能しないことに注意してください。
プリフェッチの設定
セクションタイトル: プリフェッチの設定prefetch
設定は、プリフェッチをさらにカスタマイズするためのオプションのオブジェクトも受け付けます。
プリフェッチ戦略
セクションタイトル: プリフェッチ戦略Astroは、さまざまなユースケースのために、以下の4種類のプリフェッチ戦略をサポートします。
hover
(デフォルト): リンク上にホバーまたはフォーカスしたときにプリフェッチします。tap
: リンクをクリックする直前にプリフェッチします。viewport
: リンクがビューポートに入ったときにプリフェッチします。load
: ページのロード後に、ページ上のすべてのリンクをプリフェッチします。
個別のリンクに対して戦略を指定するには、戦略をdata-astro-prefetch
属性に渡します。
<a href="/about" data-astro-prefetch="tap">About</a>
各戦略はファインチューニングされており、必要なときにのみプリフェッチしてユーザーの帯域を節約します。たとえば、
- 訪問者がデータ節約モードや低速なコネクションを使っている場合、プリフェッチは
tap
戦略にフォールバックします。 - リンク上にすばやくホバーやスクロールした場合はプリフェッチしません。
viewport
またはload
戦略を使用したリンクは、ネットワークの専有を避けるために低優先度でプリフェッチされます。
デフォルトのプリフェッチ戦略
セクションタイトル: デフォルトのプリフェッチ戦略data-astro-prefetch
属性を追加した場合のデフォルトのプリフェッチ戦略はhover
です。デフォルトを変更するには、astro.config.mjs
ファイルのprefetch.defaultStrategy
で設定できます。
import { defineConfig } from 'astro/config';
export default defineConfig({ prefetch: { defaultStrategy: 'viewport' }});
すべてのリンクをデフォルトでプリフェッチする
セクションタイトル: すべてのリンクをデフォルトでプリフェッチするdata-astro-prefetch
属性のないリンクも含めて、すべてのリンクをプリフェッチしたい場合は、次のように、prefetch.prefetchAll
をtrue
に設定できます。
import { defineConfig } from 'astro/config';
export default defineConfig({ prefetch: { prefetchAll: true }});
その後、data-astro-prefetch="false"
に設定することで、個別のリンクのプリフェッチをオプトアウトできます。
<a href="/about" data-astro-prefetch="false">About</a>
すべてのリンクに対するデフォルトのプリフェッチ戦略は、デフォルトのプリフェッチ戦略に示したように、prefetch.defaultStrategy
で変更できます。
プログラムによるプリフェッチ
セクションタイトル: プログラムによるプリフェッチナビゲーションは常に<a />
リンクとして表示されるとは限らないため、astro:prefetch
モジュールのprefetch()
APIを使用してプログラムからプロフェッチすることもできます。
<button id="btn">Click me</button>
<script> import { prefetch } from 'astro:prefetch';
const btn = document.getElementById('btn'); btn.addEventListener('click', () => { prefetch('/about'); });</script>
with
オプションを渡すことで、追加で優先度を設定できます。
// 高優先度の`fetch()`を使用してプリフェッチする。prefetch('/about', { with: 'fetch' });
// 低優先度で、ブラウザにより手動でスケジュールされる// `<link rel="prefetch">`を使用してプリフェッチする。(デフォルト)prefetch('/about', { with: 'link' });
prefetch()
APIには、同様のデータ節約モードと低速なコネクションの検出機能があるため、必要なときにだけプリフェッチします。
低速なコネクションの検出を無視するには、ignoreSlowConnection
オプションが利用できます。
// データ節約モードや低速なコネクションの場合でもプリフェッチするprefetch('/about', { ignoreSlowConnection: true });
ブラウザのAPIに依存しているため、クライアント側でprefetch()
だけをインポートするようにしてください。
ビュートランジションとともに使用する
セクションタイトル: ビュートランジションとともに使用するページ内でビュートランジションを使用するときは、プリフェッチもデフォルトで有効になります。ビュートランジションは、{ prefetchAll: true }
というデフォルト設定を設定し、ページ内のすべてのリンクに対してプリフェッチを有効化します。
デフォルトを上書きするには、astro.config.mjs
内のプリフェッチ設定をカスタマイズできます。たとえば、次のように設定します。
import { defineConfig } from 'astro/config';
export default defineConfig({ // プリフェッチを完全に無効化する prefetch: false});
import { defineConfig } from 'astro/config';
export default defineConfig({ // プリフェッチは維持するが、`data-astro-prefetch`があるリンクのみをプリフェッチする。 prefetch: { prefetchAll: false }});
@astrojs/prefetch
からのマイグレーション
セクションタイトル: @astrojs/prefetchからのマイグレーション@astrojs/prefetch
インテグレーションはv3.5.0で廃止され、最終的には完全に削除される予定です。以下の手順を利用して、このインテグレーションを置き換えるAstroのビルトインのプリフェッチにマイグレーションしてください。
-
@astrojs/prefetch
インテグレーションを削除し、astro.config.mjs
内のprefetch
設定を有効化します。astro.config.mjs import { defineConfig } from 'astro/config';import prefetch from '@astrojs/prefetch';export default defineConfig({integrations: [prefetch()],prefetch: true}); -
@astrojs/prefetch
の設定オプションから変換します。-
非推奨になったインテグレーションでは、ビューポートに入ったときにプリフェッチするべきリンクを指定するために、
selector
設定オプションを使用していました。代わりに、これらの個別のリンクに
data-astro-prefetch="viewport"
を追加してください。<a href="/about" data-astro-prefetch="viewport"> -
非推奨になったインテグレーションは、ホバーまたはフォーカスしたときにプリフェッチするべきリンクを指定するために、
selector
設定オプションを使用していました。intentSelector
設定オプションを使用していました。代わりに、これらの個別のリンクに
data-astro-prefetch
またはdata-astro-prefetch="hover"
を追加してください。<!-- `defaultStrategy`が`hover`(デフォルト)に設定されている場合、値を省略できます --><a href="/about" data-astro-prefetch><!-- そうでない場合は、プリフェッチ戦略を明示的に定義できます --><a href="/about" data-astro-prefetch="hover"> -
新しいプリフェッチ機能は自動的にスケジューリングを行って最適にプリフェッチするため、
@astrojs/prefetch
のthrottles
オプションは必要なくなりました。
-