gatsbyでsitemapを自動作成

今回はgatsbyでseo対策をしていきます、デフォルトでsitemap作成機能がないので自作する必要があります。

sitemapとは

sitemapとは、ウェブサイト内のページを構造化したものです。これは、検索エンジンにウェブサイト内のページを把握してもらうためのもので、検索エンジンがサイト内をスキャンしやすくなるとともに、ユーザーがサイト内を探索する際にも役立ちます。

サイトマップはXMLフォーマットで記述され、通常は次のようなURLでアクセスできます。

http://example.com/sitemap.xml

このXMLファイルには、サイト内のページや画像、ビデオなどが構造化されて記述されます。検索エンジンはこのXMLファイルを読み込み、サイト内をスキャンします。

サイトマップを作成することで、検索エンジンによりよくサイト内を把握されるようになり、検索結果に表示されるようになるとともに、サイト内を探索する際にも便利になります。

Gatsbyでの実装方法

gatsby-plugin-sitemapを使用することで、にsitemapを作成することができます。まず、gatsby-config.jsに次のようにプラグインを追加します。

インストール

npm install gatsby-plugin-sitemap

または

node 16だったので5.3.0を入れます

yarn add 'gatsby-plugin-sitemap@^5.3.0' 

[gatsby-config.js]

siteMetadata: {
  siteUrl: `https://www.example.com`,
},
plugins: [
  {
    resolve: `gatsby-plugin-sitemap`,
    options: {
      output: '/' // 生成先をルートディレクトリに変更
    }
  }
]
yarn build
yarn serve

gatsbyが起動した時点でsitemapが自動的に生成されます。生成されたsitemapは、次のURLでアクセスできます。

http://localhost:9000/sitemap-index.xml
http://localhost:9000/sitemap-0.xml

もし、特定のページを除外したい場合は、gatsby-plugin-sitemapの設定オプションを使用することで、除外することができます。詳しくは、gatsby-plugin-sitemapのドキュメントを参照してください。

strapiとの連携

Gatsby.jsとStrapiを連携することで、サイトマップを作成することができます。

gatsbyとstrapiの連携はすでにできているものと考えてサンプルコードを記載します。

[gatsby-config.js]

siteMetadata: {
  siteUrl: `https://www.example.com`,
},
plugins: [
  {
      resolve: `gatsby-plugin-sitemap`,
      options: {
        query: `
          {
            site {
              siteMetadata {
                siteUrl
              }
            }
            allStrapiArticle {
              edges {
                node {
                  slug
                  updatedAt(formatString: "YYYY-MM-DD")
                }
              }
            }
            allSitePage {
              nodes {
                path
              }
            }
          }
        `,
        output: "/",
        entryLimit: 45000,
        resolvePages: ({
          allSitePage: { nodes: allPages },
          allStrapiArticle: { edges: posts },
        }) => {
          const blogPosts = posts.reduce((acc, edge) => {
            const { slug, updatedAt } = edge.node
            acc[`/article/${slug}`] = { updatedAt }
            return acc
          }, {})
          return allPages.map((page) => {
            const { path } = page
            const base = { path }
            return { ...base, ...blogPosts[path] }
          })
        },
        excludes: ["/404?(.*)", "/contact", "/thanks", "/**/privacy"],
        serialize: ({ path, updatedAt }) => {
          const site = {
            url: path,
            changefreq: `weekly`,
            priority: updatedAt ? 0.7 : 0.5,
          }
          if (!updatedAt) return site

          const lastmod = { lastmod: updatedAt }
          return { ...site, ...lastmod }
        },
      },
  }
]

上記のコードはあくまでサンプルで実際に使う際にはいじる必要があると思います。

Nakano
Nakano
Back-end engineer

AWS,Rails,UE4,vue.js,hugo,その他なんでもやりたい

関連項目