Next.jsで作成したWebサイトのサイトマップ sitemap.xml を自動生成する

はじめに

当サイトはNext.jsを利用しています
当サイトのサイトマップ作成にnext-sitemapというライブラリを利用することで自動生成が可能となりました。
細かい設定が不要なこのライブラリはサイトマップ作成の自動化に非常に有用だったので、その手順を記載していきます。

当サイトの構築時の手順はこちらから。

① 基本編

インストール

next-sitemapをnpm経由でインストールします。

npm add next-sitemap

設定ファイルの作成

プロジェクトルートに next-sitemap.config.js というファイルを作成します。ファイルの内容を設定します。

next-sitemap.config.js

/** @type {import('next-sitemap').IConfig} */
module.exports = {
  siteUrl: 'https://entools.tona-h.com',
  generateRobotsTxt: true, 
}

ビルドスクリプトの設定

package.json に下記を追加します。これでNext.jsのビルド後に自動でサイトマップが生成されます。

package.json

{
  ~~~
  "scripts": {
    ~~~,
    "build": "next build",
    "postbuild": "next-sitemap",
    ~~~
  },
  ~~~
}

サイトマップの確認

{ドメイン}/sitemap.xml を表示するとサイトマップが生成されている事がわかります!

画像

➁ 応用(ヘッドレスCMS)編

動的にページが増減するヘッドレスCMSではひと工夫が必要です。

sitemap.tsの作成

Next.jsの機能を利用し、下記のようなコードを書くことで動的にサイトマップを生成することが可能になります。ビルドした際は {ドメイン}/sample/sitemap.xml というパスにサイトマップが生成されます。

app/sample/sitemp.ts

import { MetadataRoute } from 'next';

async function getPostsInParentCategory(parentCategorySlug: string) {
  const query = `
    query NewQuery {
      category(id: "${parentCategorySlug}", idType: SLUG) {
        id
        children {
          nodes {
            slug
            uri
            posts(last: 10, where: {status: PUBLISH}) {
              nodes {
                uri
                title
                date
                modified
                status
                featuredImage {
                  node {
                    uri
                    altText
                    sourceUrl
                  }
                }
              }
            }
          }
        }
      }
    }
  `
  
  const { data } = await get(query)

  const posts = []
  data.category.children.nodes.forEach((node) => {
    node.posts.nodes.forEach((n) => {
      posts.push(n)
    })
  })

  return posts
}

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const posts = await getPostsInParentCategory("entools")

  return posts.map((post) => {
    return {
      url: `${process.env.NEXT_PUBLIC_BASE_URL}/${post.uri}`,
      lastModified: `${post.modified}.000Z`,
      changeFrequency: 'daily',
      priority: 0.7,
    }
  })
}

設定ファイル(next-sitemap.config.js)の更新

設定ファイル(next-sitemap.config.js)に “exclude“・”robotsTxtOptions“ブロックを追加します。

next-sitemap.config.js

module.exports = {
  siteUrl: process.env.NEXT_PUBLIC_BASE_URL,
  generateRobotsTxt: true,
  exclude: [
    '/sample/sitemap.xml'
  ],
  robotsTxtOptions: {
    additionalSitemaps: [
      (process.env.NEXT_PUBLIC_BASE_URL) + '/sample/sitemap.xml',
    ],
  },
}

サイトマップの確認

{ドメイン}/sitemap.xml を表示するとサイトマップが生成されている事がわかります!