HTMLのaタグとNext.jsのLinkは何が違う? 初心者向けにページ遷移の仕組みをやさしく解説
HTMLでは、別のページへ移動するリンクを
aタグで作ります。
ところがNext.jsのコードでは、
Linkという見慣れないコンポーネントが登場します。
どちらもクリックするとページが変わりますが、
内部の動きや適した使用場面には違いがあります。
今回は、その違いを初心者目線で一つずつ整理します。
aタグがあるのに、なぜLinkを使うの?
HTMLで別のページへのリンクを作るときは、
aタグを使います。
<a href="/blog/">
ブログを見る
</a>
ところが、Next.jsのサンプルコードでは 次のように書かれています。
import Link from "next/link";
<Link href="/blog">
ブログを見る
</Link>
見た目も動きも同じように見えるけれど……
どちらも「ブログを見る」という文字をクリックすると、
ブログ一覧ページへ移動します。
それなら、使い慣れたaタグだけでもよいのでしょうか。
画面上ではよく似ていますが、
Next.jsのサイト内でページを移動するときは、
Linkを使うことで
Next.jsのナビゲーション機能を利用できます。
HTMLのaタグとは?
aタグは、
HTMLでリンクを作るための要素です。
aは「anchor」の頭文字で、 別のページやWebサイト、メールアドレス、 電話番号、ページ内の位置などへリンクできます。
ブラウザーが標準で理解できる、 HTML本来のリンク機能です。
基本的な書き方
<a href="/about/">
私たちについて
</a>
hrefには、
クリックしたときの移動先を指定します。
href="/about/"
href="https://example.com"
href="mailto:info@example.com"
href="tel:0312345678"
aタグはNext.js専用ではありません。 通常のHTMLでも、WordPressでも、 ほとんどのWebサイトで使える標準的なリンク要素です。
Next.jsのLinkとは?
Linkは、
Next.jsが提供するReactコンポーネントです。
HTMLのaタグの働きをもとにしながら、 Next.jsのルーティングと連携したページ移動を提供します。
クライアントサイド遷移やプリフェッチなど、 Next.js独自の機能を利用できます。
最初にimportする
import Link from "next/link";
JSX内にLinkを書く
export default function Navigation() {
return (
<nav>
<Link href="/">
トップ
</Link>
<Link href="/blog">
ブログ
</Link>
</nav>
);
}
App Routerでは、
Linkの中へ別のaタグを追加する必要はありません。
<Link href="/blog">
<a>ブログ</a>
</Link>
<Link href="/blog">
ブログ
</Link>
aタグとLinkの大きな違い
どちらも最終的にはリンクとして表示されますが、 Next.jsのサイト内を移動するときの処理に違いがあります。
next/linkから必要指定されたURLへ通常の方法で移動します。
高速なページ移動を助ける機能が追加されています。
ページ全体の再読み込みとは?
通常のaタグで別ページへ移動すると、 ブラウザーは移動先のURLへ新しくアクセスします。
その結果、 ページのHTMLや必要なファイルを読み込み直します。
別のWebサイトへ移動する場合は、 この通常のナビゲーションが自然です。
一方、同じNext.jsサイト内での移動では、 毎回すべてを読み直さずに済む仕組みが用意されています。
Linkのプリフェッチとは?
プリフェッチとは、 ユーザーが移動する可能性のあるページを あらかじめ準備しておく仕組みです。
Linkが画面に近づいたときなどに、 Next.jsが移動先のルートを先に読み込んでおくことで、 クリック後の待ち時間を短くできます。
<Link href="/blog">ブログを見る</Link>
基本的な使用では、 開発者がプリフェッチ用の処理を毎回書く必要はありません。
「Linkを使えば必ずすべての移動先が即座に読み込まれる」 という意味ではありません。 ルートの種類や設定、表示位置などに応じて動作します。
サイト内リンクではLinkを使う
同じNext.jsサイト内の別ページへ移動するときは、 基本的にLinkを使用します。
/
/company
/blog
/contact
import Link from "next/link";
export default function Header() {
return (
<header>
<nav>
<Link href="/">
トップ
</Link>
<Link href="/company">
会社情報
</Link>
<Link href="/blog">
ブログ
</Link>
<Link href="/contact">
お問い合わせ
</Link>
</nav>
</header>
);
}
ヘッダー、パンくずリスト、記事カード、 前後の記事リンクなど、 サイト内の多くの場所で使用できます。
動的な記事URLへリンクする
microCMSの記事一覧では、 記事ごとに異なるIDやslugを使って 詳細ページへのURLを作ります。
import Link from "next/link";
type Props = {
article: {
id: string;
title: string;
};
};
export default function ArticleCard({
article,
}: Props) {
return (
<article>
<h2>{article.title}</h2>
<Link href={`/blog/${article.id}`}>
記事を読む
</Link>
</article>
);
}
テンプレートリテラルを使い、
article.idをURLへ組み込んでいます。
/blog/
固定部分
${article.id}
記事ごとに変わる部分
外部サイトではどちらを使う?
自分のNext.jsサイトとは別のWebサイトへ移動する場合は、 通常のaタグを使うと目的が分かりやすくなります。
<a
href="https://example.com"
target="_blank"
rel="noopener noreferrer"
>
外部サイトを見る
</a>
target="_blank"
新しいタブで開く
rel="noopener noreferrer"
安全性や参照情報に配慮する
href="/blog"
href="https://..."
同じNext.jsアプリ内のページ移動ならLink、 外部サイトやNext.jsのルーターを使わないリンクなら aタグと考えると整理しやすくなります。
メール・電話・ページ内リンク
すべてのリンクをLinkへ置き換える必要はありません。
メールアプリや電話アプリを開くリンクには、 HTMLのaタグを使います。
メールリンク
<a href="mailto:info@example.com">
メールで問い合わせる
</a>
電話リンク
<a href="tel:0312345678">
03-1234-5678
</a>
同じページ内の見出しへ移動
<a href="#summary">
まとめへ移動
</a>
<section id="summary">
<h2>まとめ</h2>
</section>
リンクを作るときの注意点
リンク先が分かる文字にする
<Link href="/blog">
こちら
</Link>
<Link href="/blog">
ブログ記事一覧を見る
</Link>
「こちら」だけでは、 リンクだけを読んだときに移動先を判断しにくくなります。
新しいタブで開くことが分かるようにする
<a
href="https://example.com"
target="_blank"
rel="noopener noreferrer"
>
公式サイトを見る
<span>(新しいタブで開きます)</span>
</a>
画像だけのリンクには意味を持たせる
<Link href={`/blog/${article.id}`}>
<Image
src={article.eyecatch.url}
alt={`${article.title}の記事を読む`}
width={800}
height={500}
/>
</Link>
よくあるつまずき
import Link from "next/link";
src="/blog"
→
href="/blog"
// 基本はLinkだけで書く
<Link href="/blog">
ブログを見る
</Link>
外部サイト、メール、電話などは、 通常のaタグを使うと役割が明確になります。
href="blog"
→
href="/blog"
相対URLとして意図している場合を除き、 サイトのルートから始めるときは 先頭へスラッシュを付けます。
href="/blog/${article.id}"
href={`/blog/${article.id}`}
移動先が決まっている通常のナビゲーションでは、 Linkを使用するほうが役割を正しく表せます。
まとめ:サイト内はLink、外部はaタグが基本
HTMLのaタグとNext.jsのLinkは、 どちらもリンクを作るために使います。
ただし、同じNext.jsサイト内を移動する場合は、 Linkを使うことでNext.jsのナビゲーション機能を利用できます。
今回覚えておきたいこと
- aタグはHTML標準のリンク要素
- LinkはNext.jsが提供するReactコンポーネント
- LinkはHTMLのaタグをもとに機能を拡張している
- 同じNext.jsサイト内の移動ではLinkを使う
- Linkではクライアントサイド遷移を利用できる
- 移動先のルートを事前に準備するプリフェッチがある
- 外部サイト、メール、電話にはaタグを使う
- ページ移動はLink、処理の実行はbuttonで考える
<Link href="/blog">
<a href="https://...">
最初は、aタグとLinkの見た目がほとんど同じため、 なぜ別の書き方が必要なのか分かりませんでした。
けれど、Linkは単にリンクの文字を表示するだけではなく、 Next.jsのルーティングと連携して、 サイト内のページ移動を快適にする役割を持っています。
外部へのリンクならaタグから考えます。