少し前にCloudflare PagesとHonoで愛猫「らて」のLGTM画像サイトを作成したのですが、画像のメンテナンスコストが高すぎたのでCMSへ移行しました。
ヘッドレスCMSを試したことがなかったのと、Nextのアプリをちゃんと作ったことがなかったので、単純に試したかった気持ちもあります。
Cloudflare PagesとHonoで愛猫のLGTM画像集めたサイトを作った🐈|mooriii354字 · 3枚の画像sizu.me
このブログがCloudflareなので、今回はホスティング先をVercelにしました。
構成は以下のような感じで、Contentfulへの画像アップロードをトリガーにして、VercelでのSSGビルドを走らせるようにしています。
今回作成したサイトはこちらです。
Lgtlatte - らてのLGTM画像飼い猫らてのLGTM画像を集めましたlgtlatte.vercel.app
Nextアプリケーションの作成とVercelの連携
Nextアプリケーションの作成
まずはNextのアプリケーションを作成します。
これでアプリケーションが作られたら、GitHub上でリポジトリを作成してpushします。
Vercelでリポジトリを連携
続いてVercelにログインして、リポジトリをImportします。
アカウントが連携されていれば、Importできるリポジトリの候補が出てきますのでImportをクリックします。
Importが成功すると以下のような画面が開くので、Deployをクリックします
デプロイが完了してこんな感じの画面が出ればOKです。
Contentfulの設定
今回はヘッドレスCMSとしてContentfulを使用します。
Contentfulの全体像はこちらの記事が参考になります。
[初心者向け]Contentfulの全体像・記事投稿の流れ・便利な機能をまとめてみた | DevelopersIOdev.classmethod.jp
アカウントを作成するとBlankという名前のSpaceが作られているのでそれを使います。
Space Nameは画面右上の[Settings]→[General settings]で変更できます。
Mediaの追加
今回は画像を一覧で返してほしいだけなのでContent modelの定義はせずにMediaの追加のみ行います。
ヘッダーのMediaタブからアセットを追加します。
Tokenの取得
Tokenは画面右上の[Settings]→[API Keys]から生成できます。
Tokenが生成されたら以下のような画面が表示されるので、APIKeyをコピーしておきましょう。
Brunoで実際に叩いてみると以下のようなレスポンスが返ってきます。
NextからContentfulのAPIを叩く
queryを定義する
Assetを一覧で取得するためのSchemaを定義します。
GraphQL-CodegenでContentfulのSchemaから型を自動生成する
上で定義したSchemaとContentfulのSchemaを利用して形を自動生成します。
プロジェクトルートに codegen.ts
が作られるので、以下に書き換えます。
npx graphql-code-generator init
を実行した時に、 package.json
に codegen
のスクリプトが追加されるので以下のように変更してください。
(実行時に.env
からContentfulのSpaceIdとTokenを取得するようにしています。)
実行するとsrc/generated
配下に型定義ファイルが自動生成されます。
ApolloClientの追加
パッケージが追加できたら以下のファイルを追加します。
page.tsxを修正
定義したapolloClientを用いて画像を取得して表示するために、page.tsx
を以下のように編集します。
ここまで来たら一度pushしてみます。
Vercelの環境変数を設定しないとビルドが失敗するので、.env
に定義している変数を忘れずに追加しましょう。
ContentfulにAssetが追加されたらビルドされるようにする
ContentfulはEntryやAssetなどの追加や変更時にトリガーをセットして、Webhookを発火させることができます。
それを利用して、今回はAssetの追加・更新時にVercelのWebhookを発火させるようにします。
VercelでWebhookのURLを生成する
Vercelのプロジェクトの設定画面からWebhookのURLを生成し、コピーしておきます。
ContentfulでWebhookの設定を追加する
画面右上の[Setting]→[Webhooks]から設定を追加します。
この状態でMediaを追加してPublishするとVercel上でビルドが走るようになります。
今回はVercel上でビルドを走らせましたが、Github ActionsでCDを回したい場合もContentful側の変更をトリガーにしてWebhook経由で実行できるみたいです。
Running static site builds with GitHub Actions and ContentfulLearn how to combine Github Actions with Contentful’s webhook features so you can trigger static site builds every time your team publishes content.www.contentful.com
今回作成したサイトとGitHubのリポジトリはこちらです。
Lgtlatte - らてのLGTM画像飼い猫らてのLGTM画像を集めましたlgtlatte.vercel.app
GitHub - mr04vv/lgtlatteContribute to mr04vv/lgtlatte development by creating an account on GitHub.github.com
おわりに
ヘッドレスCMS初挑戦だったんですが、かなり便利でした。
特にWebhook経由でコンテンツの更新時にSSGのビルドを自動で走らせることができるので、更新の手間が省けてとても楽になりました。
NextはgenerateMetadata
がとても便利で、ContentfulからOgpの情報を取得してmetadataを生成するようできました。後からOgpを変更したくなってもコードをいじらなくて済むのは体験良きです。
GraphQLもかなり久しぶりに触ったので知識があやふやでした。また時間をとって復習します。
フロントエンダーのはずなのにフロントエンドの知識が浅くて恥ずかしくなってくるので、色々試しつつ基礎もしっかり勉強していかないとな〜となっているところです。
ではまた次回お会いしましょう。