Nextjs,AppRouterでhead情報を実装する

今回はこのブログでNextjsのMetadataを用いてhead情報を記載したので備忘として残しておこうと思います。

現時点でのNextjsのVersionは14.2.3です。

ルートファイルの設定

まずはサイト全体のベースを作ります。

ここではルートのlayout.tsxstaticなpage.tsxのどちらかに設定を入れますが、私はlayout.tsx側へ設定したためその前提で記載します。

ポイントとしてmetadataは必ずexportしてください!

import type { Metadata } from 'next';

export const metadata: Metadata = {
  title: 'Blog',
  description: 'description',
};

export default function RootLayout() {...}

これでページ全体に適用できたかと思いますが、すべてのページで同じmetadataというのはちょっと物足りないと思いますので、

動的に設定することとしました。

動的なMetadataの設定方法

ページごとに動的にmetadataを設定することにしました。

私の場合は記事のタイトルを入れる形で実際のコードは以下のようにしています。

ポイントとしてgenerateMetadataをexportして使ってください!

ページのパラメータを受け取り、記事データをフェッチしてタイトルと説明を取得したのちにmetadataの設定をしています。

export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const { id } = params;

  const post = await getPost(id);

  return {
    title: post.title,
    description: post.description,
  };
}

export default function PostPage(...) {

テンプレートを設定する

例えばRootのMetadataにテンプレートを設定することで子要素のMetadataの値を利用することができます。

以下のようなtitle.templateを設定することで%sへ子のmeta titleを表示します。

例えば子のMetadataがPost TitleならばPost Title | Blogとして設定されます。

これによりページごとに動的にhead情報を設定することができました!

export const metadata: Metadata = {
  title: {
    template: '%s | Blog',
    default: 'Blog',
  },
};

おわりに

もしまだmetadataを設定していないのであれば設定してみてはいかがでしょうか?

参考にした記事

https://nextjs.org/docs/app/building-your-application/optimizing/metadata