Next.js + microCMS の型周りどうしてるか暴露する

33537 ワード

弊社コーポレートサイトは Next.js + TypeScript + microCMS で作られています。getStaticProps でデータフェッチするわけですが、microCMS から取得するデータの型定義を自動化したく試行錯誤したので私がやっているやり方をご紹介します。

まずはどんな手順なのか

  1. microCMS のスキーマをダウンロードする
  2. スキーマから型定義を生成する
  3. aspida の Methods を生成する
  4. aspida で axios の型定義済みメソッドを生成する

上記の順番で生成をします。とはいえ、3 についてはコマンドを叩けばできますし、2,4 については自動で生成されます。次に各手順を一つ一つ解説します。

ディレクトリ構成について

まずは前段階としてディレクトリの構成について解説をします。私の環境では Next.js のプロジェクトルートに src ディレクトリを作成し、その中に cmsディレクトリを配置して管理しています。
ディレクトリ

cms ディレクトリ配下の解説をします。

api ディレクトリ

aspida の型定義ファイルの生成物をここに格納します

schema ディレクトリ

microCMS のスキーマをここに格納します。

types ディレクトリ

スキーマから生成する各エンドポイントのレスポンス、リクエストパラメータの型定義をここに格納します。

utils ディレクトリ

実際に getStaticProps などで使うデータフェッチを行うメソッドをここで定義しています。

microCMS のスキーマをダウンロードする

API 設定 > API スキーマ > ページ下部の この設定をエクスポートする をクリックします。

API-スキーマ-microCMS

エクスポートした json データを見てみると下記のようになっています。

{
	"apiFields":[
		{
			"idValue":"MNNbwT-Gyt",
			"fieldId":"title",
			"name":"タイトル",
			"kind":"text",
			"required":true,
			"isUnique":false
		},
		{
			"fieldId":"image",
			"name":"アイキャッチ",
			"kind":"media"
		},
		{
			"fieldId":"body",
			"name":"本文",
			"kind":"repeater",
			"required":false,
			"customFieldCreatedAtList":[
				"2021-07-12T05:51:14.785Z",
				"2021-07-12T05:51:43.122Z"
			]
		},
		{
			"fieldId":"tags",
			"name":"タグ",
			"kind":"relationList"
		}
	],
	"customFields":[
		{
			"createdAt":"2021-07-12T05:51:14.785Z",
			"fieldId":"html",
			"name":"HTML",
			"fields":[
				{
					"idValue":"S_ECb4fI0Y",
					"fieldId":"content",
					"name":"HTML",
					"kind":"textArea"
				}
			],
			"position":[["S_ECb4fI0Y"]],
			"updatedAt":"2021-07-12T05:51:14.785Z",
			"viewerGroup":"LfC"
		},
		{
			"createdAt":"2021-07-12T05:51:43.122Z",
			"fieldId":"editor",
			"name":"エディター",
			"fields":[
				{
					"idValue":"5oQL7u3qSg",
					"fieldId":"content",
					"name":"Editor",
					"kind":"richEditor"
				}
			],
			"position":[["5oQL7u3qSg"]],
			"updatedAt":"2021-07-12T05:51:43.122Z",
			"viewerGroup":"LfC"
		}
	]
}

次に先ほど解説をしたディレクトリ構成のsrc/cms/schema に json データを入れます。

スキーマから型定義を生成する

microcms-typescript というライブラリを使ってスキーマから型定義を生成します。