React製フレームワークのGatsby.jsで動的にページを生成する方法は、gatsby-node.jsファイルを使う方法と、src/pagesディレクトリ内のファイル名で設定する方法の2種類あります。バージョン2以降の主流は後者の方法で、ほとんどの場合でgatsby-node.jsファイルを扱う必要はありません

ファイルの命名規則

他の主要なフレームワークと比較すると、Gatsby.jsの「ファイル名によるページ生成のルール」は若干ややこしく、GraphQLのタイプ名とフィールド名がベースになっています。

例えば、CMSがWordPressの場合、サイト側でWPGatsbyWPGraphQLをインストールすることになり、Gatsby.js専用のタイプが追加されます。

以下は主要なタイプ名です。

ページの種類タイプ名
記事ページwpPost
固定ページwpPage
カテゴリーwpCategory
タグwpTag

これらのタイプは「id」や「slug」などのフィールドを持っていて、{タイプ名.フィールド名}.拡張子または{タイプ名.フィールド名__下層フィールド名}.拡張子の形でファイルを作ることで、そのフィールドの値を取得できます。拡張子は、jsxまたはtsxです。

ファイル名取得できる値
{wpPost.slug}.jsx記事ページのスラッグ
{wpPost.databaseId}.jsx記事ページのID

取得した値はクエリの引数になるため、それを使って特定のページのデータを取得します。

記事ページを生成する場合

例として、通常の記事ページを生成するとします。パーマリンク(URL)はhttps://yoursite.com/slug/の形にするとします。つまり、スラッグがtestなら、https://yoursite.com/test/になります。

この場合、ファイル名は{wpPost.slug}.tsxまたは{wpPost.slug}.tsxとなります。

クエリの引数には各ページのスラッグが入るため、それを元にクエリを実行します。

以下はサンプルコードです。

export const query = graphql`
  query Post($slug: String) {
    wpPost(slug: { eq: $slug }) { # $slugにページのスラッグが入る
      title
      content
      author {
        node {
          name
        }
      }
    }
  }
`;

その後は通常の流れと同じで、ページコンポーネント側の引数であるdataに実行結果が入ります。

以下はページタイトルを表示する例です。

const Post = ({ data }: PageProps) => {
  const { title } = data.wpPost;

  return <>Title: {title}</>;
};

export default Post;