どのページを開いても、ブラウザのタブ名が変わらない理由
Next.jsで複数ページを作ったのに、ブラウザのタブに表示される名前がどのページでも同じ、というつまずきに出会ったことはないでしょうか。AIに「商品詳細ページを作って」と頼むと、こんな構成が返ってくることがあります。
// app/layout.tsx(全ページ共通)
export const metadata = {
title: "My Shop",
};
// app/products/[id]/page.tsx(商品詳細ページ)
export default function ProductPage({ params }) {
return <div>{/* 商品情報の表示 */}</div>;
}
このコード自体は動きます。商品詳細ページは問題なく表示されます。ただし、ブラウザのタブを見ると、トップページを開いていても、商品詳細ページを開いていても、ずっと「My Shop」のままです。
【何が起きているか】
Next.jsでは、ページごとにタブの名前(タイトル)を変えたい場合、そのページ自身にmetadataを書く必要があります。layout.tsxに書いたtitleは、あくまで「そのページが自分のtitleを用意していないときのデフォルト」でしかありません。商品詳細ページのファイルにmetadataが一切書かれていなければ、Next.jsは常にレイアウト側のタイトルを使い続けます。
見た目上のページの中身は正しく作れているので、動作確認をしていても気づきにくいポイントです。タブの名前は画面の外側にあるので、意識して確認しないと見落とします。
【直し方】
// app/products/[id]/page.tsx
export async function generateMetadata({ params }) {
const { id } = await params;
const product = await getProduct(id);
return {
title: `${product.name} | My Shop`,
};
}
export default async function ProductPage({ params }) {
const { id } = await params;
return <div>{/* 商品情報の表示 */}</div>;
}
商品名のように、ページを開いてみないと分からない値をタイトルに使いたい場合は、generateMetadataという関数を使います。ここで取得したデータを使ってタイトルを組み立てれば、商品ごとに違うタブ名を表示できます。固定の文字列でよいページ(お問い合わせページなど)であれば、export const metadata = { title: "..." }をそのページのファイルに書くだけで足ります。
【AIに確認するときの聞き方】
新しいページを作ってもらったら、「このページ専用のタイトルは設定されていますか?」と一言確認するだけで、この種の見落としはその場で気づけます。タブの名前はブックマークや検索結果にも影響する部分なので、ページを増やすたびに確認しておくと安心です。
面談なしで、今日から始められます
この講座は 未経験から Next.js + Supabase + Claude Code で Webアプリを公開するまで を全20セッションで体系化した教材付きプランです。無料相談を挟まず、申し込んだその日から教材で学習を始められます。AIが学習パートナーになって何度でも質問でき、つまずいた所だけチャットで直接サポートします。
プログラミングの知識だけでなく、AIへの指示の出し方や、AIが出してきたコードを自分の言葉で確認する目も、教材を進める中で自然に身についていきます。
- 今日から始める(教材完全版+月5,500円・チャット質問し放題・いつでも解約OK)→ https://menta.work/plan/20251?ref=menta-knowledge
- いきなりは不安な方へ:無料の教材体験版もあります(最初の数セッション分)→ プラン詳細をご覧ください

