



WithCodeMedia-1-pc
WithCodeMedia-2-pc
WithCodeMedia-3-pc
WithCodeMedia-4-pc




WithCodeMedia-1-sp
WithCodeMedia-2-sp
WithCodeMedia-3-sp
WithCodeMedia-4-sp









生徒ヘッドレスCMSで記事を書いているんですけど、公開前にプレビューで確認する方法が分かりません…どうやって実装すればいいですか?



よーく聞くんだぞ。今日はヘッドレスCMSのプレビュー環境構築について詳しく解説するぞい!実装方法は複数あるから、プロジェクトに合った方法を選ぶことが重要じゃ!



そうなんですね!ぜひ教えてください!
ヘッドレスCMSを使ったWebサイト開発では、公開前にコンテンツをプレビューできる環境が不可欠です。従来のWordPressなどのCMSでは標準でプレビュー機能が搭載されていますが、ヘッドレスCMSではフロントエンドとバックエンドが分離しているため、独自にプレビュー環境を構築する必要があります。
本記事では、Next.js App RouterとmicroCMSを使ったプレビュー環境の構築方法を、4つの実装パターンとともに詳しく解説します。実案件での選定基準、セキュリティ対策、トラブルシューティングまで網羅しています。
「学習→案件獲得」につなげた受講生のリアルな体験談も公開中!
働き方を変えたい方にも響くストーリーです。
片山さん
妊娠をきっかけに、子どものためにもどこでも働けるスキルを身に付けたいと考える。そこで、オンラインスクールのfammで1ヶ月間Web制作の勉強を開始。その後、独学で勉強に励むも限界を感じ、案件保証が魅力のWithCodeへ入学し、稼げる力を身に付けることができた。現在は副業として稼ぐ力を身に付け、10件以上の案件を担当するまでに成長した。
詳しくはこちらの記事をご覧ください。


片山さんの主な制作実績はこちら


ヘッドレスCMS(Headless CMS)は、コンテンツ管理機能とフロントエンド(表示部分)が分離されたCMSです。従来のCMS(WordPress、Drupalなど)では、管理画面とフロントエンドが一体化していましたが、ヘッドレスCMSではAPIを介してコンテンツを配信します。





なぜプレビュー環境が必要なんですか?



コンテンツを公開前に確認することで、レイアウト崩れや誤字脱字を事前に防げるんじゃ!クライアントの確認作業にも必須じゃぞ!
実際のWebサイト上でコンテンツがどう表示されるかを確認できます。画像サイズ、テキストの長さ、改行位置など、CMS管理画面だけでは分からない表示を事前にチェックできます。
CMSの管理画面では、入力フォーム内のテキストしか見えません。
しかし、実際のサイトでは、
といった問題が発生することがあります。
特にレスポンシブデザインでは、
PCでは問題なくても、スマホで崩れるケースが非常に多いです。
プレビュー環境があれば、
という大きなメリットがあります。
制作会社がWebサイトを納品する際、クライアントが公開前にコンテンツを確認する必要があります。
しかし、本番環境に直接反映してしまうと、
といったリスクがあります。
プレビュー環境があれば、
という安全なワークフローが実現できます。
これは特に、
では非常に重要です。
複数の編集者が同時に記事を作成する場合、下書き状態のコンテンツを個別に確認できると便利です。
例えば、
という流れでは、下書き段階での共有が不可欠です。
プレビューがないと、
といった非効率が発生します。
プレビュー環境があれば、
ため、編集体制が整ったチーム運用が可能になります。
メタディスクリプション、OGP画像、構造化データなど、SEO関連の設定が正しく反映されているかをプレビューで確認できます。
プレビュー機能があることで、
を事前に確認できます。
特にOGPは、
といったトラブルが起きやすいため、
プレビュー確認は必須レベルです。
SEOは公開後に修正すると再クロール待ちになるため、
公開前のチェックが検索パフォーマンスに直結します。





ヘッドレスCMSの実装方法を知りたいです!



ヘッドレスCMSのプレビュー環境には、複数の実装パターンがある。それぞれメリット・デメリットがあるため、プロジェクトの要件に応じて選択するのじゃ!
クライアント側(ブラウザ)で、URLのクエリパラメータを基にAPIからデータを取得し、プレビュー表示する方法です。
// app/preview/[slug]/page.tsx
'use client';
import { useEffect, useState } from 'react';
import { useSearchParams } from 'next/navigation';
export default function PreviewPage({ params }: { params: { slug: string } }) {
const searchParams = useSearchParams();
const draftKey = searchParams.get('draftKey');
const [article, setArticle] = useState(null);
useEffect(() => {
if (!draftKey) return;
// クライアント側でAPIからデータ取得
fetch(`https://your-service.microcms.io/api/v1/articles/${params.slug}?draftKey=${draftKey}`, {
headers: {
'X-MICROCMS-API-KEY': process.env.NEXT_PUBLIC_MICROCMS_API_KEY || '',
},
})
.then((res) => res.json())
.then((data) => setArticle(data));
}, [params.slug, draftKey]);
if (!article) return Loading...;
return (
{article.title}
);
}社内プレビューのみで、外部に公開しない場合。セキュリティ要件が低いプロジェクト。
ステージング環境と本番環境で異なる環境変数を使い分け、ステージング環境ではキャッシュを無効化してプレビュー表示する方法です。
// app/articles/[slug]/page.tsx
import { getArticle } from '@/lib/microcms';
export const revalidate = process.env.NODE_ENV === 'production' ? 3600 : 0; // ステージングではキャッシュ無効
export default async function ArticlePage({ params }: { params: { slug: string } }) {
// ステージング環境では下書きを含むデータを取得
const article = await getArticle(params.slug, {
draftKey: process.env.MICROCMS_DRAFT_KEY,
});
return (
{article.title}
);
}// lib/microcms.ts
import { createClient } from 'microcms-js-sdk';
const client = createClient({
serviceDomain: process.env.MICROCMS_SERVICE_DOMAIN || '',
apiKey: process.env.MICROCMS_API_KEY || '',
});
export async function getArticle(slug: string, options?: { draftKey?: string }) {
return await client.get({
endpoint: 'articles',
contentId: slug,
queries: options?.draftKey ? { draftKey: options.draftKey } : {},
});
}# 本番環境(.env.production)
MICROCMS_API_KEY=your-production-api-key
NODE_ENV=production
# ステージング環境(.env.staging)
MICROCMS_API_KEY=your-staging-api-key
MICROCMS_DRAFT_KEY=your-draft-key
NODE_ENV=developmentすでにステージング環境が存在するプロジェクト。一覧ページのプレビューも必要な場合。
Next.js 13以降で提供されるdraftMode機能を使い、Cookieベースでプレビューモードを切り替える方法です。Next.js公式で推奨されている標準的な実装方法です。
ステップ1:プレビューAPIルートの作成
// app/api/draft/route.ts
import { draftMode } from 'next/headers';
import { redirect } from 'next/navigation';
export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const slug = searchParams.get('slug');
const secret = searchParams.get('secret');
// シークレットトークンの検証
if (secret !== process.env.PREVIEW_SECRET) {
return new Response('Invalid token', { status: 401 });
}
if (!slug) {
return new Response('Slug is required', { status: 400 });
}
// draftModeを有効化
draftMode().enable();
// プレビューページにリダイレクト
redirect(`/articles/${slug}`);
}ステップ2:記事ページでdraftModeを判定
// app/articles/[slug]/page.tsx
import { draftMode } from 'next/headers';
import { getArticle } from '@/lib/microcms';
export default async function ArticlePage({ params }: { params: { slug: string } }) {
const { isEnabled } = draftMode();
// draftMode有効時は下書きデータを取得
const article = await getArticle(params.slug, {
draftKey: isEnabled ? process.env.MICROCMS_DRAFT_KEY : undefined,
});
return (
{isEnabled && (
プレビューモード中
)}
{article.title}
);
}ステップ3:プレビュー解除APIの作成
// app/api/disable-draft/route.ts
import { draftMode } from 'next/headers';
import { redirect } from 'next/navigation';
export async function GET() {
draftMode().disable();
redirect('/');
}microCMSの管理画面で、プレビューURLを設定します。
https://your-site.com/api/draft?secret=YOUR_SECRET&slug={CONTENT_ID}最も推奨される方法。Next.jsを使った新規プロジェクトや、1環境で運用したい場合。
URLのクエリパラメータにdraftKeyを含め、サーバー側でAPIからデータを取得してプレビュー表示する方法です。microCMSの公式テンプレートでも採用されています。
// app/articles/[slug]/page.tsx
import { getArticle } from '@/lib/microcms';
export default async function ArticlePage({
params,
searchParams,
}: {
params: { slug: string };
searchParams: { draftKey?: string };
}) {
// draftKeyがある場合は下書きを取得
const article = await getArticle(params.slug, {
draftKey: searchParams.draftKey,
});
return (
{searchParams.draftKey && (
プレビューモード中
)}
{article.title}
);
}https://your-site.com/articles/{CONTENT_ID}?draftKey={DRAFT_KEY}シンプルな実装を優先したい場合。microCMS公式テンプレートをベースにしたい場合。
| 項目 | 方式A(CSR) | 方式B(環境変数SSR) | 方式C(draftMode) | 方式D(クエリSSR) |
|---|---|---|---|---|
| レンダリング | クライアント側 | サーバー側 | サーバー側 | サーバー側 |
| セキュリティ | 低い | 高い | 高い | 中程度 |
| 環境数 | 1環境 | 2環境 | 1環境 | 1環境 |
| 実装難易度 | 簡単 | 簡単 | やや複雑 | 簡単 |
| 運用コスト | 低い | 高い | 低い | 低い |
| 一覧プレビュー | △ | ◯ | △ | △ |
| 推奨度 | ★☆☆☆☆ | ★★★☆☆ | ★★★★★ | ★★★★☆ |





どの方式を選べばいいか迷います…



プロジェクトの要件に応じて選ぶんじゃ!選定のポイントを教えるぞい!
推奨:方式C(draftMode)
Next.js公式推奨の方法で、1環境で完結し、セキュリティも高い。
推奨:方式B(環境変数SSR)
既存のステージング環境を活用でき、一覧ページのプレビューも可能。
推奨:方式D(クエリストリングSSR)
実装が簡単で、microCMSの公式テンプレートでも採用されている。
推奨:方式A(CSR)または別途サーバーを用意
SSRが使えない環境では、CSRを使うか、Vercelなどサーバー機能がある環境に移行。





実装するにあたりセキュリティ面がう不安なんですけど、
具体的に何をすれば良いですか?



良い質問じゃ!主に4つの方法がある。今から解説するぞい!
プレビューAPIには必ずシークレットトークンを設定し、不正アクセスを防ぎます。
// 環境変数
PREVIEW_SECRET=your-random-secret-string-here
// APIルートで検証
if (secret !== process.env.PREVIEW_SECRET) {
return new Response('Invalid token', { status: 401 });
}microCMSのAPIキーはサーバー側のみで使用し、クライアント側に露出させません。
// 悪い例:クライアント側でAPIキーを使用
const response = await fetch(`https://api.microcms.io/articles`, {
headers: {
'X-MICROCMS-API-KEY': 'your-api-key', // 露出してしまう
},
});
// 良い例:サーバー側でAPIキーを使用
// app/api/articles/route.ts
export async function GET() {
const response = await fetch(`https://api.microcms.io/articles`, {
headers: {
'X-MICROCMS-API-KEY': process.env.MICROCMS_API_KEY, // 安全
},
});
return response;
}
microCMS側で、draftKeyに有効期限を設定できます。長期間有効なキーは避けましょう。
プレビュー環境へのアクセスを特定のIPアドレスのみに制限することも有効です。





ヘッドレスCMSのプレビュー環境構築するにあたってトラブルシューティングのことも知りたいです!



うむ。ここでは、主なトラブルシューティングを3つ紹介するぞい!
原因と解決法:
MICROCMS_API_KEY、PREVIEW_SECRETを確認原因と解決法:
/api/disable-draftにアクセス原因と解決法:
MICROCMS_DRAFT_KEYを設定していないか確認


プレビュー環境の構築方法がよく分かりました!プロジェクトに合った方法を選んで実装してみます!



その通りじゃ!まずはdraftModeから始めて、Next.jsの標準的な実装方法を学ぶのがおすすめじゃぞ!セキュリティにも気をつけるんじゃ!



はい!次のプロジェクトでdraftModeを使ったプレビュー環境を構築してみます!ありがとうございました!
本記事では、ヘッドレスCMSのプレビュー環境構築方法について、4つの実装パターンを詳しく解説しました。
重要なポイントは以下の通りです。
・プレビュー環境の必要性:レイアウト確認、クライアント確認、SEO最適化に不可欠
・4つの実装方法:CSR、環境変数SSR、draftMode、クエリストリングSSR
・推奨方法:Next.jsプロジェクトではdraftModeが最適
・セキュリティ対策:シークレットトークン、APIキー管理、有効期限設定が重要
・選定基準:プロジェクトの要件、環境、予算に応じて最適な方法を選択
WithCodeで学んだNext.js・React・TypeScriptの基礎知識に、ヘッドレスCMSのプレビュー環境構築技術を組み合わせれば、どんな実案件でも対応できます。
ヘッドレスCMSのプレビュー環境は、クライアントワークに必須の機能です。ぜひ実際のプロジェクトで活用し、高品質なWebサイトを納品してください。


副業・フリーランスが主流になっている今こそ、自らのスキルで稼げる人材を目指してみませんか?
未経験でも心配することはありません。初級コースを受講される方の大多数はプログラミング未経験です。まずは無料カウンセリングで、悩みや不安をお聞かせください!
公式サイト より
今すぐ
無料カウンセリング
を予約!