TL;DR

next/link が提供するコンポーネント。<a> と同じように href 属性に遷移先の URL を指定する。DOM 上では <a> 要素として展開されるが、クリックすると Soft navigation が起きる。

仕組み

公式ドキュメントによると、<Link> は <a> 要素を拡張し、プリフェッチとクライアントサイドでのルート間の移動を提供する。Next.js でルート間を移動する主な方法である。

<Link> がビューポートに入ると、Next.js はリンク先のルートとそのデータを裏で読み込む(プリフェッチ)。プリフェッチは本番環境でだけ有効になる。prefetch の既定値("auto" または null)では、静的なルートは全体を、動的なルートは最も近い loading.js の境界までをプリフェッチする。false にするとプリフェッチしない。

ほかに、履歴を追加せずに置き換える replace、移動後のスクロールを制御する scroll などの props がある。className のような <a> の属性は、そのまま <a> 要素に渡される。

例

import Link from "next/link"
import styles from "./styles.module.css"
 
export function Nav() {
  return (
    <nav className={styles.nav}>
      <ul>
        <li>
          <Link href="/">トップ</Link>
        </li>
        <li>
          <Link href="/categories">カテゴリー一覧</Link>
        </li>
      </ul>
    </nav>
  )
}

Dynamic Routes へのリンクは次のように書ける。

export default function Page() {
  return (
    <div>
      <h1>カテゴリー一覧画面</h1>
      <ul>
        <li>
          <Link href="/categories/flower">花</Link>
        </li>
        <li>
          <Link href="/categories/animal">動物</Link>
        </li>
        <li>
          <Link href="/categories/landscape">風景</Link>
        </li>
      </ul>
    </div>
  )
}

このとき、遷移先の Dynamic Routes は次のように定義されている。

type Props = {
  // パスパラメータ
  params: { categoryName: string }
  // クエリパラメータ
  searchParams: { [key: string]: string | string[] | undefined }
}
 
export default function Page({ params, searchParams }: Props) {
  const page = typeof searchParams.page === "string" ? searchParams.page : "1"
 
  return (
    <div>
      <h1>カテゴリー別一覧画面</h1>
      <h2>カテゴリー「{params.categoryName}」</h2>
      <p>ページ番号:「{page}」</p>
    </div>
  )
}

注意点

以前のバージョンでは、子要素として <a> を置く必要があったが、今は不要である。公式ドキュメントによると、v13.0.0 から不要になった。

関連

出典