Next.jsで外部リンクにはaタグを使うべき理由

公開日:
目次

Next.jsで外部リンクを書くとき、<Link> コンポーネントと <a> タグのどちらを使うべきでしょうか。

結論から言うと、外部リンクには通常の <a> タグを使ったほうが良いです。この記事では、その理由と実装方法を解説します。

Next.jsの <Link> コンポーネントは、アプリケーション内のページ間を移動するためのコンポーネントです。

通常のページ遷移とは異なり、ページ全体をリロードせずに移動できるため、高速でスムーズなユーザー体験を提供します。

<Link> の主な特徴は以下の2つです。

  • クライアントサイドナビゲーション:JavaScriptでページを切り替えるため、ブラウザのリロードが発生しない
  • プリフェッチ:リンク先のページを事前に読み込み、クリック時の表示を高速化する

これらの機能は、同じNext.jsアプリケーション内のページ間移動において威力を発揮します。

外部URLに <Link> を使うと、以下の問題が発生します。

プリフェッチが無駄になる

<Link> はデフォルトでリンク先を事前に取得しようとします。しかし、外部URLへのプリフェッチは同一オリジンポリシーにより制限されます[1]。結果として、不要なネットワークリクエストが発生し、オーバーヘッドになります。

クライアントサイドナビゲーションが機能しない

<Link> のクライアントサイドナビゲーションは、同一オリジン内のルート間でのみ機能します[2]。外部URLに移動する場合、結局ブラウザの通常のナビゲーションが発生するため、 <Link> を使うメリットがありません。

セキュリティ属性を明示しにくい

外部リンクには rel="noopener noreferrer" を付けることが推奨されています[3]<a> タグであれば、これらの属性を自然に追加できます。

実装例

以下に、Before/Afterの実装例を示します。

Before

import Link from 'next/link'

// 外部リンクにLinkを使っている(非推奨)
<Link href="https://twitter.com/example">
  Twitterをフォロー
</Link>

After

// 外部リンクにはaタグを使う(推奨)
<a
  href="https://twitter.com/example"
  target="_blank"
  rel="noopener noreferrer"
>
  Twitterをフォロー
</a>

target="_blank"rel="noopener noreferrer" を付けることで、リンクを新しいタブで開き、セキュリティも確保できます。

使い分けの判断基準

リンクの種類によって、どちらを使うかを判断します。

リンクの種類 使うべきもの
内部リンク <Link> /about, /posts/hello
外部リンク <a> https://example.com

判断の基準は「同じNext.jsアプリケーション内のページかどうか」です。同一アプリ内であれば <Link> を使い、外部サイトへのリンクは <a> を使います。

脚注
  1. Next.js公式ドキュメント - Link prefetch ↩︎

  2. Next.js公式ドキュメント - onNavigate では「External URLs won't trigger onNavigate since it's only for client-side and same-origin navigations」と記載されています。 ↩︎

  3. MDN Web Docs - aタグのセキュリティとプライバシー ↩︎