brand logo

ドキュメント

prefetchComponents

Nuxtは、コンポーネントのプリフェッチを制御するためのユーティリティを提供します。

コンポーネントのプリフェッチは、バックグラウンドでコードをダウンロードします。これは、コンポーネントがレンダリングに使用される可能性が高いという仮定に基づいており、ユーザーがそれを要求した場合にコンポーネントが即座にロードされることを可能にします。コンポーネントは、ユーザーが明示的に要求しなくても、将来の使用を見越してダウンロードされキャッシュされます。

prefetchComponents を使用して、Nuxtアプリでグローバルに登録された個々のコンポーネントを手動でプリフェッチします。デフォルトでは、Nuxtはこれらを非同期コンポーネントとして登録します。コンポーネント名のパスカルケース版を使用する必要があります。

await prefetchComponents('MyGlobalComponent')

await prefetchComponents(['MyGlobalComponent1', 'MyGlobalComponent2'])

現在の実装は、コンポーネントをプリフェッチするだけでなくプリロードすることによって、preloadComponents と全く同じように動作します。この動作を改善するために取り組んでいます。

サーバー上では、prefetchComponents は効果を持ちません。

tips

このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。

NuxtのprefetchComponentsとは?〜ユーザー体験を向上させるプリフェッチ機能の補足解説

NuxtのprefetchComponentsは、将来的に必要となる可能性が高いコンポーネントのコードを事前にダウンロードし、ユーザーが実際にそのコンポーネントを使う際の待ち時間を短縮するための機能です。これにより、ページ遷移や動的表示がスムーズになり、UX(ユーザー体験)が大幅に向上します。

しかし、プリフェッチの仕組みや使いどころを正しく理解しないと、無駄な通信やパフォーマンス低下を招くこともあります。本記事では、prefetchComponentsの基本から実務での活用例、注意点までを丁寧に解説します。


まず結論:prefetchComponentsのポイント

  • プリフェッチは将来使う可能性のあるコンポーネントのコードを先読みする仕組み
  • prefetchComponentsで手動プリフェッチが可能。配列で複数コンポーネントも指定できる
  • サーバーサイドでは効果がなく、クライアントサイドでのみ動作する
  • 過剰なプリフェッチは通信コストやパフォーマンス悪化の原因になるため注意が必要
  • 動的に切り替わるUIや遅延ロードするコンポーネントのUX改善に有効

いつ使うべきか?使わない方がよいケースは?

使うべきケース

  • ユーザーの操作で遷移や表示が予測できるコンポーネントがある場合
    例:メニューのサブページ、モーダルウィンドウ、タブ切り替えの中身など
  • 初回表示時に重いコンポーネントを遅延ロードしているが、次の操作で必ず使うことが分かっている場合
  • SPA的なUXを重視し、ページ遷移の待ち時間を極力減らしたい場合

使わない方がよいケース

  • ユーザーがほとんどアクセスしない可能性が高いコンポーネント
    → 無駄な通信が増え、初期ロードや通信帯域を圧迫する
  • サーバーサイドレンダリング(SSR)でのプリフェッチを期待している場合
    prefetchComponentsはクライアントサイドのみで効果があるため意味がない
  • すでに軽量で即時ロード可能なコンポーネントには不要

実務でよくあるユースケースとサンプルコード

1. モーダルコンポーネントのプリフェッチ

ユーザーがボタンを押すとモーダルが表示されるケース。モーダルは重いコンポーネントで遅延ロードしているが、ボタンが表示された時点で先読みしておくと、クリック後の表示が高速化する。

// 例: ボタン表示時にモーダルコンポーネントをプリフェッチ
import { prefetchComponents } from '#app'

export default {
  mounted() {
    prefetchComponents('HeavyModal')
  }
}

2. タブ切り替えのコンポーネントプリフェッチ

タブの中身はそれぞれ別コンポーネントで遅延ロードしている場合、ユーザーがタブを切り替える前にプリフェッチしておくとUXが向上する。

// 例: タブ表示時に関連コンポーネントをまとめてプリフェッチ
import { prefetchComponents } from '#app'

export default {
  mounted() {
    prefetchComponents(['TabContentA', 'TabContentB'])
  }
}

3. ページ遷移前のプリフェッチ

リンク先のページで使われるコンポーネントを事前にプリフェッチし、遷移時の待ち時間を減らす。

// 例: ページ遷移前にプリフェッチを実行
import { prefetchComponents } from '#app'

function onLinkHover() {
  prefetchComponents('NextPageComponent')
}

よくある落とし穴・注意点

SSR環境での効果がない

prefetchComponentsはクライアントサイドでのみ動作します。サーバー上で呼び出しても効果がないため、SSRの初期レンダリング時にプリフェッチを期待して使うのは誤りです。

Hydrationとの関係

プリフェッチしたコンポーネントはキャッシュされるため、Hydration(サーバーからクライアントへの状態引き継ぎ)後の再レンダリングがスムーズになります。ただし、プリフェッチのタイミングが遅いと意味が薄れるため、ユーザーの操作を予測して早めに呼び出すことが重要です。

過剰なプリフェッチはパフォーマンス悪化の原因に

必要以上に多くのコンポーネントをプリフェッチすると、ネットワーク帯域を圧迫し、初期ロードや他のリソースの読み込みに影響を与えます。プリフェッチは「必要なものだけ」「使う可能性が高いものだけ」に絞ることが大切です。

コンポーネント名の指定に注意

prefetchComponentsにはグローバル登録されたコンポーネントのパスカルケース名を指定します。名前の間違いや登録漏れがあるとプリフェッチされません。


まとめ

NuxtのprefetchComponentsは、ユーザーが次に使う可能性の高いコンポーネントを事前に読み込むことで、UXを大幅に改善できる強力な機能です。特に動的表示や遅延ロードを多用するアプリケーションで効果を発揮します。

ただし、SSRでは効果がなく、過剰なプリフェッチは逆効果になるため、使うべきタイミングと対象を見極めることが重要です。実務ではモーダルやタブ、ページ遷移前のプリフェッチが代表的なユースケースです。

適切に活用して、快適で高速なNuxtアプリケーションを実現しましょう。


プリフェッチはユーザーの操作を予測することが鍵です。ユーザーの行動パターンを分析し、どのコンポーネントをいつプリフェッチすべきか設計すると効果的です。