<NuxtLink>
Nuxtは、アプリケーション内のあらゆる種類のリンクを処理するための<NuxtLink>コンポーネントを提供します。
<NuxtLink>は、Vue Routerの<RouterLink>コンポーネントとHTMLの<a>タグの両方の代替として使用できます。リンクが_内部_か_外部_かを賢く判断し、利用可能な最適化(プリフェッチ、デフォルト属性など)を用いて適切にレンダリングします。
内部ルーティング
この例では、アプリケーションの別のページにリンクするために<NuxtLink>コンポーネントを使用します。
<template>
<NuxtLink to="/about">Aboutページ</NuxtLink>
</template>
動的ルートへのパラメータの渡し方
この例では、idパラメータを渡してルート~/pages/posts/[id].vueにリンクします。
<template>
<NuxtLink :to="{ name: 'posts-id', params: { id: 123 } }">
Post 123
</NuxtLink>
</template>
Nuxt DevToolsのPagesパネルをチェックして、ルート名とそのパラメータを確認してください。
toプロップにオブジェクトを渡すと、<NuxtLink>はVue Routerのクエリパラメータの処理を継承します。キーと値は自動的にエンコードされるため、手動でencodeURIやencodeURIComponentを呼び出す必要はありません。
静的ファイルとクロスアプリケーションリンクの処理
デフォルトでは、<NuxtLink>は相対ルートに対してVue Routerのクライアントサイドナビゲーションを使用します。/publicディレクトリ内の静的ファイルや同じドメイン上にホストされている別のアプリケーションにリンクする場合、それらはクライアントルートの一部ではないため、予期しない404エラーが発生する可能性があります。このような場合、externalプロップを使用して、Vue Routerの内部ルーティングメカニズムをバイパスできます。
externalプロップはリンクが外部であることを明示的に示します。<NuxtLink>はリンクを標準のHTML <a>タグとしてレンダリングします。これにより、リンクが正しく動作し、Vue Routerのロジックをバイパスしてリソースを直接指すことが保証されます。
静的ファイルへのリンク
/publicディレクトリ内のPDFや画像などの静的ファイルに対しては、externalプロップを使用してリンクが正しく解決されるようにします。
<template>
<NuxtLink to="/example-report.pdf" external>
レポートをダウンロード
</NuxtLink>
</template>
クロスアプリケーションURLへのリンク
同じドメイン上の別のアプリケーションを指す場合、externalプロップを使用することで正しい動作が保証されます。
<template>
<NuxtLink to="/another-app" external>
別のアプリへ移動
</NuxtLink>
</template>
externalプロップを使用するか、自動処理に依存することで、適切なナビゲーションが保証され、予期しないルーティングの問題を回避し、静的リソースやクロスアプリケーションのシナリオとの互換性が向上します。
外部ルーティング
この例では、<NuxtLink>コンポーネントを使用してウェブサイトにリンクします。
<template>
<NuxtLink to="https://nuxtjs.org">
Nuxtウェブサイト
</NuxtLink>
<!-- <a href="https://nuxtjs.org" rel="noopener noreferrer">...</a> -->
</template>
relとnoRel属性
rel属性のnoopener noreferrerは、target属性を持つリンクや絶対リンク(例:http://、https://、//で始まるリンク)にデフォルトで適用されます。
noopenerは古いブラウザのセキュリティバグを解決します。noreferrerはリンク先サイトにRefererヘッダーを送信しないことでユーザーのプライバシーを向上させます。
これらのデフォルトはSEOに悪影響を与えず、ベストプラクティスとされています。
この動作を上書きする必要がある場合は、relまたはnoRelプロップを使用できます。
<template>
<NuxtLink to="https://twitter.com/nuxt_js">
Nuxt Twitter
</NuxtLink>
<!-- <a href="https://twitter.com/nuxt_js" rel="noopener noreferrer">...</a> -->
<NuxtLink to="https://discord.nuxtjs.org" rel="noopener">
Nuxt Discord
</NuxtLink>
<!-- <a href="https://discord.nuxtjs.org" rel="noopener">...</a> -->
<NuxtLink to="/about" target="_blank">Aboutページ</NuxtLink>
<!-- <a href="/about" target="_blank" rel="noopener noreferrer">...</a> -->
</template>
noRelプロップを使用すると、絶対リンクにデフォルトのrel属性が追加されるのを防ぐことができます。
<template>
<NuxtLink to="https://github.com/nuxt" no-rel>
Nuxt GitHub
</NuxtLink>
<!-- <a href="https://github.com/nuxt">...</a> -->
</template>
noRelとrelは同時に使用できません。relは無視されます。
プリフェッチリンク
Nuxtは自動的にスマートプリフェッチを含んでいます。つまり、リンクがビューポート内またはスクロール時に表示されると(デフォルトで)、そのページのJavaScriptをプリフェッチし、ユーザーがリンクをクリックしたときにすぐに準備が整うようにします。Nuxtは、ブラウザが忙しくないときにのみリソースをロードし、接続がオフラインの場合や2g接続しかない場合はプリフェッチをスキップします。
<NuxtLink to="/about" no-prefetch>Aboutページはプリフェッチされません</NuxtLink>
<NuxtLink to="/about" :prefetch="false">Aboutページはプリフェッチされません</NuxtLink>
カスタムプリフェッチトリガー
v3.13.0以降、<NuxtLink>のカスタムプリフェッチトリガーをサポートしています。prefetchOnプロップを使用して、リンクをプリフェッチするタイミングを制御できます。
<template>
<NuxtLink prefetch-on="visibility">
これは表示されるときにプリフェッチされます(デフォルト)
</NuxtLink>
<NuxtLink prefetch-on="interaction">
これはホバーまたはフォーカスされたときにプリフェッチされます
</NuxtLink>
</template>
visibility: リンクがビューポート内に表示されるときにプリフェッチします。要素がビューポートと交差するかどうかをIntersection Observer APIを使用して監視します。要素が表示されるとプリフェッチがトリガーされます。interaction: リンクがホバーまたはフォーカスされたときにプリフェッチします。このアプローチはpointerenterとfocusイベントをリッスンし、ユーザーがインタラクションする意図を示したときにリソースを積極的にプリフェッチします。
オブジェクトを使用してprefetchOnを設定することもできます。
<template>
<NuxtLink :prefetch-on="{ interaction: true }">
これはホバーまたはフォーカスされたときにプリフェッチされます
</NuxtLink>
</template>
両方を有効にしたくないかもしれません!
<template>
<NuxtLink :prefetch-on="{ visibility: true, interaction: true }">
これはホバー/フォーカスされたとき、または表示されたときにプリフェッチされます
</NuxtLink>
</template>
この設定は、要素がビューポートに入るときに監視し、pointerenterとfocusイベントもリッスンします。これにより、不要なリソース使用や冗長なプリフェッチが発生する可能性があります。異なる条件で同じリソースをプリフェッチすることがあるためです。
クロスオリジンプリフェッチの有効化
クロスオリジンプリフェッチを有効にするには、nuxt.configでcrossOriginPrefetchオプションを設定します。これにより、Speculation Rules APIを使用してクロスオリジンプリフェッチが有効になります。
export default defineNuxtConfig({
experimental: {
crossOriginPrefetch: true,
},
})
プリフェッチをグローバルに無効化
アプリ全体でプリフェッチを有効/無効にすることも可能です。
export default defineNuxtConfig({
experimental: {
defaults: {
nuxtLink: {
prefetch: false,
},
},
},
})
プロップ
RouterLink
externalを使用しない場合、<NuxtLink>はVue RouterのすべてのRouterLinkプロップをサポートします。
to: 任意のURLまたはVue Routerのルートロケーションオブジェクトcustom:<NuxtLink>がそのコンテンツを<a>要素でラップするかどうか。リンクがレンダリングされる方法とクリックされたときのナビゲーションの動作を完全に制御できます。Vue Routerのcustomプロップと同様に動作します。exactActiveClass: 正確にアクティブなリンクに適用するクラス。内部リンクでVue RouterのexactActiveClassプロップと同様に動作します。デフォルトはVue Routerのデフォルト("router-link-exact-active")です。activeClass: アクティブなリンクに適用するクラス。内部リンクでVue RouterのactiveClassプロップと同様に動作します。デフォルトはVue Routerのデフォルト("router-link-active")です。replace: 内部リンクでVue Routerのreplaceプロップと同様に動作します。ariaCurrentValue: 正確にアクティブなリンクに適用するaria-current属性値。内部リンクでVue RouterのariaCurrentValueプロップと同様に動作します。
NuxtLink
href:toのエイリアス。toと一緒に使用すると、hrefは無視されます。noRel:trueに設定すると、外部リンクにrel属性が追加されません。external: リンクをVue RouterのRouterLinkではなく<a>タグとしてレンダリングすることを強制します。prefetch: 有効にすると、ビューポート内のリンクのミドルウェア、レイアウト、ペイロード(payloadExtractionを使用する場合)をプリフェッチします。実験的なcrossOriginPrefetch設定で使用されます。prefetchOn: リンクをプリフェッチするタイミングをカスタム制御します。可能なオプションはinteractionとvisibility(デフォルト)です。完全な制御のためにオブジェクトを渡すこともできます。例:{ interaction: true, visibility: true }。このプロップは、prefetchが有効(デフォルト)でnoPrefetchが設定されていない場合にのみ使用されます。noPrefetch: プリフェッチを無効にします。prefetchedClass: プリフェッチされたリンクに適用するクラス。
アンカー
target: リンクに適用するtarget属性値rel: リンクに適用するrel属性値。外部リンクの場合、デフォルトは"noopener noreferrer"です。
デフォルトは上書き可能です。変更したい場合はデフォルトの上書きを参照してください。
デフォルトの上書き
Nuxt Configで
nuxt.configで<NuxtLink>のデフォルトを上書きできます。
これらのオプションは将来的に別の場所、例えばapp.configやapp/ディレクトリに移動される可能性があります。
export default defineNuxtConfig({
experimental: {
defaults: {
nuxtLink: {
// デフォルト値
componentName: 'NuxtLink',
externalRelAttribute: 'noopener noreferrer',
activeClass: 'router-link-active',
exactActiveClass: 'router-link-exact-active',
prefetchedClass: undefined, // 有効な文字列クラス名
trailingSlash: undefined // 'append'または'remove'が可能
prefetch: true,
prefetchOn: { visibility: true }
}
}
}
})
カスタムリンクコンポーネント
defineNuxtLinkを使用して独自のリンクコンポーネントを作成することで、<NuxtLink>のデフォルトを上書きできます。
export default defineNuxtLink({
componentName: 'MyNuxtLink',
/* 以下のシグネチャを参照 */
})
その後、通常のデフォルトで<MyNuxtLink />コンポーネントを使用できます。
defineNuxtLinkシグネチャ
interface NuxtLinkOptions {
componentName?: string;
externalRelAttribute?: string;
activeClass?: string;
exactActiveClass?: string;
trailingSlash?: 'append' | 'remove'
prefetch?: boolean
prefetchedClass?: string
prefetchOn?: Partial<{
visibility: boolean
interaction: boolean
}>
}
function defineNuxtLink(options: NuxtLinkOptions): Component {}
componentName: コンポーネントの名前。デフォルトはNuxtLink。externalRelAttribute: 外部リンクに適用されるデフォルトのrel属性値。デフォルトは"noopener noreferrer"。無効にするには""に設定activeClass: アクティブなリンクに適用するデフォルトのクラス。Vue RouterのlinkActiveClassオプションと同様に動作します。デフォルトはVue Routerのデフォルト("router-link-active")exactActiveClass: 正確にアクティブなリンクに適用するデフォルトのクラス。Vue RouterのlinkExactActiveClassオプションと同様に動作します。デフォルトはVue Routerのデフォルト("router-link-exact-active")trailingSlash:hrefの末尾のスラッシュを追加または削除するオプション。設定されていない場合や有効な値appendまたはremoveに一致しない場合は無視されます。prefetch: デフォルトでリンクをプリフェッチするかどうか。prefetchOn: デフォルトで適用するプリフェッチ戦略の詳細な制御。prefetchedClass: プリフェッチされたリンクに適用するデフォルトのクラス。
tips
このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。
NuxtLinkコンポーネントの実践的な活用と注意点
Nuxt.jsでのページ遷移やリンク管理において、NuxtLinkコンポーネントは非常に重要な役割を果たします。単なるリンクタグの代替ではなく、内部ルーティングの最適化やプリフェッチ機能など、ユーザー体験を向上させるための多くの機能を備えています。
本記事では、NuxtLinkの基本的な使い方に加え、実務での活用例や注意すべきポイントを詳しく解説します。これにより、NuxtLinkを正しく理解し、効果的に利用できるようになるでしょう。
1. まず結論:NuxtLinkの要点まとめ
- 内部リンクはNuxtLinkで管理することで、Vue Routerのクライアントサイドナビゲーションやスマートプリフェッチが自動的に適用される。
- 外部リンクや静的ファイルへのリンクは
externalプロップを使うことで、Vue Routerのルーティングをバイパスし正しく動作させられる。 - プリフェッチ機能によりページ遷移が高速化されるが、必要に応じて
no-prefetchやprefetchOnで制御可能。 rel属性はセキュリティとプライバシーの観点から自動付与されるが、relやnoRelプロップでカスタマイズできる。- 動的ルートへのパラメータ渡しも簡単にできるため、柔軟なリンク生成が可能。
2. いつ使うべきか・使わない方がよいケース
使うべきケース
- アプリ内のページ遷移を行う場合は必ずNuxtLinkを使いましょう。これにより、ページ遷移がSPAのように高速かつスムーズになります。
- 動的ルートや名前付きルートを使う場合、パラメータをオブジェクト形式で渡すことで安全かつ簡潔にリンクを生成できます。
- ユーザー体験を向上させるためにプリフェッチを活用したい場合は、NuxtLinkのプリフェッチ機能を利用しましょう。
使わない方がよいケース
- 外部サイトや別ドメインへのリンクは、
externalプロップを付けて通常の<a>タグとして扱うべきです。NuxtLinkの内部ルーティングを誤って適用すると、404エラーや不正な挙動の原因になります。 - 静的ファイル(PDFや画像など)へのリンクも同様に
externalを使い、Vue Routerの制御外に置く必要があります。 - プリフェッチが不要な場合やパフォーマンスに影響を与えたくない場合は、
no-prefetchやprefetchOnでプリフェッチを制御しましょう。
3. 実務でよくあるユースケースとサンプルコード
ユースケース1:内部ページへのリンク(動的ルート)
ブログ記事一覧から特定の記事ページへ遷移する例です。動的ルートのパラメータをオブジェクトで渡すことで、URLの生成を安全に行えます。
<template>
<NuxtLink :to="{ name: 'posts-id', params: { id: post.id } }">
{{ post.title }}
</NuxtLink>
</template>
<script setup>
const post = { id: 42, title: 'NuxtLinkの使い方' }
</script>
ユースケース2:静的ファイルへのリンク
/publicディレクトリに配置したPDFファイルをダウンロードさせる場合、externalプロップを付けてリンクを作成します。
<template>
<NuxtLink to="/files/report.pdf" external>
レポートをダウンロード
</NuxtLink>
</template>
ユースケース3:外部サイトへのリンクとrel属性のカスタマイズ
外部サイトへリンクする際に、セキュリティ上の理由でrel="noopener noreferrer"が自動付与されますが、必要に応じてrelやnoRelで制御可能です。
<template>
<NuxtLink to="https://example.com" rel="noopener">
Exampleサイトへ
</NuxtLink>
<NuxtLink to="https://example.com" no-rel>
rel属性なしリンク
</NuxtLink>
</template>
4. よくある落とし穴・注意点
SSRとHydrationの観点
NuxtLinkはサーバーサイドレンダリング(SSR)時に正しいHTMLを生成し、クライアント側でVue Routerのリンクに変換されます。しかし、externalプロップを付け忘れると、外部リンクが内部ルーティングとして解釈され、Hydrationエラーや404が発生することがあります。外部リンクは必ずexternalを指定しましょう。
プリフェッチのパフォーマンス影響
プリフェッチはユーザー体験を向上させますが、過剰に使うとネットワーク帯域やブラウザリソースを消費します。特にモバイル環境や低速回線では注意が必要です。no-prefetchやprefetchOnでプリフェッチのタイミングを制御し、必要なリンクだけに絞ることが望ましいです。
rel属性の自動付与とセキュリティ
target="_blank"を使う外部リンクには自動的にrel="noopener noreferrer"が付与されます。これはセキュリティ上のベストプラクティスですが、意図的に外したい場合はnoRelプロップを使います。ただし、relとnoRelは同時に使えないため注意してください。
5. まとめ
NuxtLinkはNuxtアプリケーションにおけるリンク管理の中核であり、内部ルーティングの最適化やプリフェッチ機能によってユーザー体験を大きく向上させます。実務では内部リンクには必ずNuxtLinkを使い、外部リンクや静的ファイルにはexternalプロップを付けることが重要です。また、プリフェッチの使い方やrel属性の扱いにも注意し、パフォーマンスやセキュリティを意識した実装を心がけましょう。
正しく使いこなすことで、Nuxtアプリのナビゲーションがより快適で安全なものになります。ぜひ本記事のポイントを参考に、NuxtLinkを効果的に活用してください。
title: 'NuxtLinkの活用とカスタマイズ:実務で役立つポイントと注意点' description: 'NuxtLinkコンポーネントの基本的な使い方から、デフォルト設定の上書き方法、実務での活用例、よくある落とし穴までを丁寧に解説します。初〜中級者が理解を深め、効率的にNuxtのリンク機能を使いこなせるようになる補足記事です。'
NuxtLinkの活用とカスタマイズ:実務で役立つポイントと注意点
Nuxt.jsでのページ遷移やリンク生成に欠かせないのがNuxtLinkコンポーネントです。Vue RouterのRouterLinkをベースにしつつ、Nuxt特有の機能や最適化が施されているため、単なるリンク以上の役割を果たします。
本記事では、NuxtLinkの基本的な特徴や設定のカスタマイズ方法を解説し、実務でよくあるユースケースや注意点を踏まえて、より効果的に使いこなすためのポイントを補足します。
1. イントロ:なぜNuxtLinkを理解することが重要か
-
パフォーマンス最適化
NuxtLinkはプリフェッチ機能を備えており、ユーザーの操作を予測して必要なデータやコードを事前に読み込むことで、ページ遷移を高速化します。 -
アクセシビリティ対応
アクティブなリンクに自動でクラスやaria-current属性を付与し、視覚的・機能的に現在のページを示せます。 -
柔軟なカスタマイズ
デフォルトのクラス名やプリフェッチの挙動、外部リンクのrel属性などをプロジェクト全体で統一的に設定可能です。 -
Vue Routerとの親和性
Vue RouterのRouterLinkのプロップをほぼそのまま使えるため、Vue Routerの知識が活かせます。
2. まず結論:NuxtLinkの要点まとめ
toまたはhrefで遷移先を指定。hrefはtoのエイリアスで、両方指定するとtoが優先される。prefetchでリンク先のデータやコードを事前取得可能。prefetchOnでプリフェッチのタイミングを細かく制御できる。externalを使うとVue Routerを介さず、通常の<a>タグとしてレンダリングされる。activeClassやexactActiveClassでアクティブリンクのスタイルをカスタマイズ可能。noRelで外部リンクのrel属性を無効化できる。nuxt.configのexperimental.defaults.nuxtLinkで全体のデフォルト設定を上書き可能。defineNuxtLinkを使えば独自のリンクコンポーネントを作成し、プロジェクト固有の要件に対応できる。
3. いつ使うべきか / 使わない方がよいケース
使うべきケース
-
内部ページ間の遷移
SPAの利点を活かし、ページ遷移を高速化したいとき。NuxtLinkはVue Routerを利用し、クライアントサイドでの遷移をスムーズにします。 -
プリフェッチを活用したいとき
ユーザーの操作を予測して先読みし、UXを向上させたい場合。 -
アクセシビリティを考慮したいとき
アクティブリンクの状態管理やaria-current属性の自動付与で、スクリーンリーダー対応を強化したい場合。 -
プロジェクト全体でリンクの挙動を統一したいとき
デフォルトのクラス名やプリフェッチ設定を一括管理したい場合。
使わない方がよいケース
-
外部サイトへのリンクでVue Routerの制御が不要な場合
externalプロップを使い、通常の<a>タグとして扱うほうが適切。 -
プリフェッチが不要、またはパフォーマンスに悪影響を与える場合
大量のリンクがあるページでプリフェッチを無効化したいときはnoPrefetchを使う。 -
動的に生成されるリンクでプリフェッチの制御が難しい場合
過剰なプリフェッチは帯域やリソースの無駄遣いになるため注意。
4. 実務でよくあるユースケースとサンプルコード
ユースケース1:プリフェッチを活用した高速ページ遷移
<template>
<NuxtLink to="/about" prefetch>
Aboutページへ
</NuxtLink>
</template>
- ビューポート内にリンクが表示されると自動的にプリフェッチが始まるため、ユーザーがクリックした際の遷移が高速化されます。
ユースケース2:外部リンクを安全に扱う
<template>
<NuxtLink href="https://example.com" external target="_blank" rel="noopener noreferrer">
外部サイトへ
</NuxtLink>
</template>
externalを指定することでVue Routerを介さず、通常の<a>タグとしてレンダリングされます。rel属性はデフォルトで"noopener noreferrer"が付与され、セキュリティを強化。
ユースケース3:デフォルトのクラス名をプロジェクト全体で変更
// nuxt.config.ts
export default defineNuxtConfig({
experimental: {
defaults: {
nuxtLink: {
activeClass: 'my-active-link',
exactActiveClass: 'my-exact-active-link',
prefetch: true,
prefetchOn: { visibility: true, interaction: true }
}
}
}
})
- これにより、すべての
NuxtLinkで指定したクラス名が適用され、スタイルの一貫性を保てます。
5. よくある落とし穴・注意点
SSRとHydrationの観点
NuxtLinkはサーバーサイドレンダリング(SSR)時に正しいhrefを生成しますが、クライアント側でのHydration時にプリフェッチやクラスの付与が動的に変わることがあります。- そのため、カスタムクラスやプリフェッチの挙動を変更した場合は、SSRとCSRでの差異に注意し、意図しないUIのズレが起きないか確認が必要です。
パフォーマンスへの影響
- プリフェッチはUX向上に有効ですが、リンクが多いページで無制限に有効化するとネットワーク負荷が増大し、逆にパフォーマンス低下を招くことがあります。
prefetchOnでinteraction(ユーザーがリンクにフォーカスやホバーしたときのみプリフェッチ)を指定するなど、適切な制御が推奨されます。
外部リンクのrel属性
- デフォルトで
noopener noreferrerが付与されますが、noRelを使ってこれを無効化するとセキュリティリスクが高まるため、必要な場合以外は変更しないほうが安全です。
カスタムリンクコンポーネントの作成時の注意
defineNuxtLinkで独自コンポーネントを作る際は、Vue Routerの挙動やNuxtのプリフェッチ機能を正しく引き継ぐように実装する必要があります。- 公式のシグネチャをよく理解し、必要なプロップを適切に渡すことが重要です。
6. まとめ
NuxtLinkはNuxt.jsにおけるページ遷移の中核を担うコンポーネントであり、プリフェッチやアクセシビリティ対応など多彩な機能を備えています。
プロジェクトの要件に応じてデフォルト設定をカスタマイズし、適切なタイミングでプリフェッチを制御することで、ユーザー体験を大幅に向上させられます。
一方で、SSRとCSRの差異やパフォーマンスへの影響を理解し、外部リンクのセキュリティにも注意を払うことが重要です。
これらのポイントを押さえ、NuxtLinkを効果的に活用して快適なNuxtアプリケーションを構築しましょう。
プリフェッチの挙動はプロジェクトの規模やユーザーの利用環境によって最適解が異なります。実際のパフォーマンスを計測しながら調整することをおすすめします。
defineNuxtLinkで独自コンポーネントを作成する際は、公式ドキュメントのシグネチャを参照し、Vue Routerの仕様変更にも注意してください。
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/api/components/nuxt-link