React、Next.js、microCMS、APIって?? 初心者向けにそれぞれの役割と関係をやさしく解説
Next.jsとmicroCMSを勉強し始めると、
React、API、コンポーネント、データ取得など、
さまざまな言葉が一度に出てきます。
それぞれの説明を読んでも、
「結局、どれとどれがどうつながっているの?」と
頭の中で整理できないことがありました。
今回は、一つの記事がブラウザーへ表示されるまでの流れを使って、
4つの役割をやさしく整理します。
4つの言葉が一度に出てきて混乱した
Next.jsとmicroCMSを使ったブログ制作を始めると、 次のような言葉が何度も登場します。
画面をコンポーネントで作る
ページやデータ取得をまとめる
記事や画像を管理する
サービス間でデータを渡す
一つずつ説明を読むと、 何となく役割は分かります。
ところが、実際のコードではすべてが一緒に登場します。
import ArticleList
from "@/components/ArticleList";
import { getArticles }
from "@/libs/microcms";
export default async function BlogPage() {
const data = await getArticles();
return (
<main>
<ArticleList
articles={data.contents}
/>
</main>
);
}
このコードのどこがReactで、どこがNext.js?
microCMSはどの部分にいるのでしょうか。
APIはどこで使われているのでしょうか。
dataは、どこから届いたのでしょうか。
これらは別々に動いているのではなく、 それぞれが違う役割を担当しながら 一つのWebページを作っています。
最初に全体像を見てみる
まずは細かいコードを読む前に、 記事が表示されるまでの全体像を見てみます。
管理画面に記事を保存する
記事データを取得する
記事を画面の形にする
ユーザーが記事を読む
この流れの中で、 APIは独立した画面やサービスではありません。
microCMSとNext.jsの間で、 記事データを受け渡すための窓口として働きます。
Reactは画面を部品から作る
Reactは、Webページの見た目を 小さな部品に分けて作るために使います。
この小さな画面部品を、 コンポーネントと呼びます。
- ヘッダー
- 記事カード
- 検索フォーム
- フッター
例えば、記事カードは次のようなReactコンポーネントとして作れます。
type Props = {
title: string;
description: string;
};
export default function ArticleCard({
title,
description,
}: Props) {
return (
<article>
<h2>{title}</h2>
<p>{description}</p>
</article>
);
}
Reactは、このコンポーネントへ渡されたデータを使い、 画面に表示する形を作ります。
Reactは、記事を保存する場所ではありません。 受け取った記事データを、 見出しや文章などのUIとして表示する役割を担当します。
Next.jsはWebサイト全体を動かす
Next.jsは、Reactを使って WebサイトやWebアプリを作るためのフレームワークです。
Reactだけでも画面は作れますが、 実際のWebサイトには画面以外の仕組みも必要です。
App Routerでは、
フォルダとpage.tsxを使ってページを作ります。
src
├── app
│ ├── page.tsx
│ └── blog
│ ├── page.tsx
│ └── [id]
│ └── page.tsx
├── components
│ ├── ArticleCard.tsx
│ └── ArticleList.tsx
└── libs
└── microcms.ts
app
ページを作る
components
Reactの画面部品
libs
API接続などの共通処理
Next.jsは、microCMSからデータを取得し、 どのURLで、どのReactコンポーネントを表示するかをまとめます。
microCMSはコンテンツを管理する
microCMSは、 記事やお知らせなどの内容を管理するための ヘッドレスCMSです。
管理画面では、記事タイトルや本文、 画像、カテゴリなどを登録します。
一般的なWordPressテーマのように、 microCMS自身がWebページのデザインを表示するわけではありません。
microCMSはコンテンツを保存し、 外部から要求されたときにAPIでデータを返します。
- 記事を保存する
- 画像を管理する
- カテゴリを管理する
- APIでデータを返す
- サイト全体のHTMLを作る
- Next.jsのページを作る
- Reactコンポーネントを表示する
- サイトのCSSを決める
APIはデータの受け渡し窓口
APIは、 異なるサービスやプログラム同士が 情報をやり取りするための窓口です。
今回の場合は、 Next.jsがmicroCMSへ記事データを要求し、 microCMSがJSON形式で記事を返します。
GET /api/v1/blogs
{ contents: [...] }
Next.jsからmicroCMSへのお願い
microCMSからNext.jsへの返事
記事情報を構造化して渡す形式
APIはデータそのものではなく、 データを要求したり受け取ったりするための仕組みです。
APIは、microCMSの管理画面とNext.jsを直接合体させるものではありません。 決められた方法でデータを受け渡す橋のような役割です。
4つがつながる順番
ここまでの役割を、 一つの記事が表示される順番で整理します。
-
1
microCMSに記事を登録する
タイトル、本文、画像などを管理画面へ入力します。
-
2
Next.jsがAPIを呼び出す
microCMSへ記事データを要求します。
-
3
microCMSがJSONを返す
記事タイトルや本文がデータとして返ります。
-
4
Next.jsがデータを受け取る
APIのレスポンスをdataなどの変数へ入れます。
-
5
Reactコンポーネントへ渡す
Propsを使って記事カードや一覧へ渡します。
-
6
ブラウザーへ画面を表示する
Reactが見出しや文章の形に組み立てます。
コードでつながりを確認する
ここからは、実際のコードを3つに分けて確認します。
1.microCMSへ接続する処理
import {
createClient,
} from "microcms-js-sdk";
export type Article = {
id: string;
title: string;
description: string;
};
const client = createClient({
serviceDomain:
process.env.MICROCMS_SERVICE_DOMAIN!,
apiKey:
process.env.MICROCMS_API_KEY!,
});
export const getArticles = async () => {
return client.getList<Article>({
endpoint: "blogs",
});
};
このファイルでは、 microCMSへ接続するためのクライアントと、 記事一覧を取得する関数を作っています。
2.Next.jsのページでデータを取得する
import ArticleList
from "@/components/ArticleList";
import { getArticles }
from "@/libs/microcms";
export default async function BlogPage() {
const data = await getArticles();
return (
<main>
<h1>ブログ記事一覧</h1>
<ArticleList
articles={data.contents}
/>
</main>
);
}
getArticles()を実行すると、
microCMSのAPIから記事一覧が返ります。
3.Reactコンポーネントで表示する
import type {
Article,
} from "@/libs/microcms";
type Props = {
articles: Article[];
};
export default function ArticleList({
articles,
}: Props) {
return (
<div>
{articles.map((article) => (
<article key={article.id}>
<h2>{article.title}</h2>
<p>{article.description}</p>
</article>
))}
</div>
);
}
getArticles()
const data = await getArticles()
articles={data.contents}
articles.map(...)
APIから返るデータの中身
microCMSのリストAPIからは、 記事配列だけでなく、件数などの情報も返ります。
{
"contents": [
{
"id": "article01",
"title": "Reactの基本",
"description":
"コンポーネントについて解説します"
},
{
"id": "article02",
"title": "Next.jsの基本",
"description":
"ルーティングについて解説します"
}
],
"totalCount": 2,
"offset": 0,
"limit": 10
}
このレスポンス全体が、
先ほどのコードではdataへ入っています。
data
APIレスポンス全体
data.contents
記事データの配列
data.totalCount
記事の総件数
data.contents[0]
最初の記事
そのため、記事一覧をReactコンポーネントへ渡すときは、
data.contentsを使用しています。
取得したデータをPropsで渡す
Next.jsのページで取得した記事データは、 Propsを使ってReactコンポーネントへ渡せます。
子コンポーネントでは、 関数の引数としてarticlesを受け取ります。
export default function ArticleList({
articles,
}: Props) {
return (
<div>
{articles.map((article) => (
<p key={article.id}>
{article.title}
</p>
))}
</div>
);
}
Next.jsで取得したデータがReactへ自動的に移動するのではありません。 JSXでPropsとして明示的に渡しています。
ブラウザーへ表示されるまで
ユーザーがブログ一覧ページへアクセスすると、 内部では次のような流れが進みます。
/blog
BlogPage()
getArticles()
data.contents
<ArticleList />
<article>...</article>
ブログ記事一覧
コンポーネントについて解説します。
ルーティングについて解説します。
microCMSの記事を更新するとどうなる?
microCMSの管理画面で記事タイトルを変更すると、 保存されているコンテンツデータが更新されます。
次にNext.jsがAPIからデータを取得したときは、 更新後の記事タイトルが返ります。
ただし、実際にいつサイトへ反映されるかは、 Next.js側のキャッシュや再検証の設定によって変わります。
microCMSで更新した内容をAPIが返し、 Next.jsが新しいデータを取得できたときに Reactの表示内容も新しくなります。
APIキーはどこに書く?
microCMSのAPIへ接続するには、 サービスドメインやAPIキーを使用します。
これらはコードへ直接書かず、 環境変数として管理します。
MICROCMS_SERVICE_DOMAIN=your-service
MICROCMS_API_KEY=your-api-key
const client = createClient({
serviceDomain:
process.env.MICROCMS_SERVICE_DOMAIN!,
apiKey:
process.env.MICROCMS_API_KEY!,
});
apiKey: "abc123..."
process.env.MICROCMS_API_KEY
また、秘密にする必要があるAPIキーには、 ブラウザーへ公開される環境変数用の接頭辞を付けません。
よくあるつまずき
ReactはUIを作るライブラリで、 Next.jsはReactを使ったWebサイト制作を支えるフレームワークです。
microCMSは記事を保存してAPIで返します。 実際の画面はNext.jsとReact側で作ります。
APIは保存場所ではなく、 保存されたデータを要求・取得するための窓口です。
取得したデータは、 JSXでPropsとしてコンポーネントへ渡します。
<ArticleList
articles={data.contents}
/>
秘密にするAPIキーは、 Server Componentなどサーバー側の処理で使用します。
リストAPIでは、
記事配列は通常data.contentsに入ります。
非同期の取得関数は、
awaitして結果を受け取ります。
const data = await getArticles();
どこで問題が起きているか調べる方法
記事が表示されないときは、 処理を小さく分けて確認します。
記事が公開されているか
レスポンスが返っているか
dataを取得できているか
子へ正しく渡しているか
正しいプロパティを表示しているか
const data = await getArticles();
console.log(data);
console.log(data.contents);
console.log(data.totalCount);
最初から「すべてが壊れている」と考えず、 どの段階までは正常かを確認することが大切です。
まとめ:4つは役割分担してつながっている
React、Next.js、microCMS、APIは、 似たものが4つ並んでいるわけではありません。
それぞれが異なる役割を担当しながら、 一つのWebサイトを作っています。
今回覚えておきたいこと
- Reactはコンポーネントを使って画面を作る
- Next.jsはページ、ルーティング、データ取得をまとめる
- microCMSは記事や画像などのコンテンツを管理する
- APIはmicroCMSとNext.jsの間でデータを受け渡す
- Next.jsはAPIから返ったJSONを受け取る
- 取得結果はdataなどの変数へ入る
- ReactコンポーネントへはPropsでデータを渡す
- Reactが受け取ったデータを画面として表示する
コードの中でdataがどこから来たのか分からなくなったときは、 microCMSからAPIを通り、Next.jsで取得され、 PropsとしてReactへ渡されたという順番を思い出します。
Next.jsが受け取り、Reactが画面にします。