Cloudflare Pages×Next.jsで実装するmicroCMSのプレビュー画面
「CloudflareのEdge RuntimeとmicroCMSのqパラメータを使ってキーワード検索結果ページを作る」で作成した検索ページをもとにmicroCMSのプレビュー画面を作成しました。
バージョン:Next.js v13.5.4(Pages Router)、@cloudflare/next-on-pages CLI v.1.8.6、microcms-js-sdk v2.7.0
microCMSに画面プレビューボタンを表示する

- API設定>画面プレビューを開く
- 遷移先URLを設定
https://プレビュー表示させるドメイン/プレビュー用のページ/?id={CONTENT_ID}&draftKey={DRAFT_KEY} - 画面プレビューボタンの表示をONにする
- 変更する
- 編集画面に「画面プレビュー」ボタンが表示される
💬余談
ローカルで開発してるときは遷移先URLに「http://localhost:3000/」を設定してすぐ確認できるようにしてました。
プレビュー用ページ
src/プレビュー用ページ/index.tsx
import type {
GetServerSideProps,
InferGetServerSidePropsType,
NextPage,
} from "next";
import { getBlogDetail, getAllCategoryList } from "@/libs/microcms";
import type { Blog, Category } from "@/libs/microcms";
import { NextSeo } from "next-seo";
import { CategoryList } from "@/components/CategoryList";
import { Article } from "@/components/Article";
export const runtime = "experimental-edge";
type Props = {
post: Blog;
categories?: Category[];
} & InferGetServerSidePropsType<typeof getServerSideProps>;
const Page: NextPage<Props> = ({ post, categories }) => {
if (post)
return (
<>
<NextSeo noindex={true} />
<Article post={post} />
<CategoryList categories={categories} />
</>
);
};
export default Page;
export const getServerSideProps: GetServerSideProps = async (context) => {
const postId = context.query.id;
const draftKey = context.query.draftKey;
const post = postId
? await getBlogDetail(`${postId}`, {
draftKey: `${draftKey}`,
})
: null;
const categories = await getAllCategoryList({ fields: "title,slug" });
if (!post) {
return {
notFound: true,
};
}
const data = {
post,
categories,
};
return {
props: data,
};
};
エッジランタイムの設定
Ensure all server-rendered routes use the Edge Runtime
Cloudflare PagesでSSRするときに必要な設定をプレビューページに設定します。
export const runtime = "experimental-edge";
コンテントIDと下書き状態を取得するdraftKeyのクエリ文字列を取得
const postId = context.query.id;
const draftKey = context.query.draftKey;
const post = postId
? await getBlogDetail(`${postId}`, {
draftKey: `${draftKey}`,
})
: null;
getBlogDetail()はmicroCMS SDKのgetListDetail()を使って記事を取得するようにしています。
これで終わりです。
あとはほぼ検索結果ページと同じ仕組みにしているので、簡単に実装ができました。