Next.js Server Componentsだけでブログを作る方法を初心者向けに完全解説
生徒
「Next.jsでブログを作りたいんですけど、Server Componentsだけで作ることはできますか?」
先生
「できます。Server Componentsを使うと、サーバー側でHTMLを生成してページを高速に表示できます。」
生徒
「サーバー側でHTMLを作るって、普通のWebページとどう違うんですか?」
先生
「普通のReactはブラウザでHTMLを作りますが、Server ComponentsはサーバーでHTMLを作って送るので、ページの読み込みが速くてSEOにも有利です。」
生徒
「なるほど!じゃあ、実際にブログを作る手順を教えてください。」
先生
「では順番に、初心者でもわかるように解説していきます!」
1. Next.js Server Componentsとは?
Next.jsのServer Componentsは、サーバーでだけ動くReactコンポーネントです。サーバー上でHTMLを生成し、そのままブラウザに送信するので、ページの表示が速くなります。Reactのクライアントコンポーネントと違い、ブラウザでJavaScriptを使わなくても初期表示が可能です。
Server ComponentsはデータベースやAPIからデータを直接取得して、サーバーでレンダリングできるため、ブログの記事一覧や詳細ページの表示に適しています。
2. Next.jsのプロジェクトを作成する
まずはNext.jsの新しいプロジェクトを作ります。ターミナルで以下のコマンドを入力します。
npx create-next-app@latest my-blog
cd my-blog
npm run dev
これでNext.jsの開発環境が整いました。
3. Server Componentsでブログ記事一覧を作る
Server Componentsを使って、ブログの記事一覧を表示します。まずはサーバーで記事データを取得する関数を作ります。
import fs from "fs";
import path from "path";
export default function BlogList() {
const filePath = path.join(process.cwd(), "data", "posts.json");
const jsonData = fs.readFileSync(filePath, "utf-8");
const posts = JSON.parse(jsonData);
return (
<div>
<h1>ブログ記事一覧</h1>
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
}
4. 個別記事ページをServer Componentsで作成
次に、記事をクリックすると詳細ページが表示されるようにします。
import fs from "fs";
import path from "path";
export default function BlogPost({ params }) {
const filePath = path.join(process.cwd(), "data", "posts.json");
const jsonData = fs.readFileSync(filePath, "utf-8");
const posts = JSON.parse(jsonData);
const post = posts.find((p) => p.id === params.id);
return (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
);
}
5. サーバーコンポーネントで動的ルーティングを使う
Next.jsのServer Componentsでは、ファイル名に角括弧を使って動的ルートを作成できます。例えば、app/blog/[id]/page.jsのようにします。
export default function Page({ params }) {
return <BlogPost params={params} />;
}
これにより、/blog/1や/blog/2のように、URLに応じて記事を切り替えることができます。
6. データベースから記事を取得する方法
Server Componentsはサーバー上で動くので、直接データベースから記事データを取得できます。例えば、Prismaを使って記事を取得する場合は以下のようになります。
import { prisma } from "@/lib/prisma";
export default async function BlogList() {
const posts = await prisma.post.findMany();
return (
<div>
<h1>ブログ記事一覧(データベース版)</h1>
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
}
7. サーバーコンポーネントの利点と注意点
Server Componentsを使うと、初期表示が速くSEOにも強くなります。ただし、ブラウザで動くJavaScriptは使用できないので、ボタンを押してデータを変更するような機能はクライアントコンポーネントと組み合わせる必要があります。
ブログでは記事一覧や詳細ページの表示、コメントの初期読み込みなどにServer Componentsを活用し、動的な操作部分だけクライアントコンポーネントに分けるのが理想です。
8. サンプルブログ全体の構成例
簡単な構成例としては以下のようになります。
- app/blog/page.js:記事一覧ページ(Server Components)
- app/blog/[id]/page.js:個別記事ページ(Server Components)
- components/CommentForm.js:コメントフォーム(Client Components)
- data/posts.json:記事データ(サンプル用)
これでNext.js Server Componentsだけでブログの基本構成が完成します。
まとめ
ここまででNextjsのServerComponentsだけを使ってブログを作成する流れを一通り学びました。ServerComponentsはサーバー上で実行されるReactコンポーネントであり、データ取得とHTML生成を同時に行える点が大きな特徴です。従来のクライアント中心のReact開発と比べて、初期表示が速くなり、検索エンジンに正しく内容が伝わりやすい構造を自然に作ることができます。ブログのように文章コンテンツが中心となるWebサイトでは、記事一覧ページや記事詳細ページをServerComponentsで構築することで、表示速度と保守性の両方を高めることができます。
またNextjsのAppRouterとServerComponentsを組み合わせることで、ファイル構成そのものがURL構造と一致し、初心者でも理解しやすい設計になります。角括弧を使った動的ルーティングにより、記事IDごとのページ生成も直感的に行えました。JSONファイルやデータベースから直接データを取得できる点も、サーバー専用で動作するServerComponentsならではの利点です。
実際のブログ開発では、すべてをServerComponentsだけで完結させるのではなく、必要に応じてClientComponentsと組み合わせることが重要です。例えばコメント投稿やボタン操作など、ブラウザ側でのインタラクションが必要な部分はClientComponentsに切り分けることで、全体としてバランスの取れた構成になります。今回学んだ内容は、Nextjsを使った実践的なブログ制作の土台となる知識です。
import fs from "fs";
import path from "path";
export default function BlogList() {
const filePath = path.join(process.cwd(), "data", "posts.json");
const jsonData = fs.readFileSync(filePath, "utf-8");
const posts = JSON.parse(jsonData);
return (
<div>
<h1>最新ブログ記事一覧</h1>
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
}
このようにServerComponentsではデータ取得の処理と表示ロジックを同じ場所に書くことができます。コードの見通しが良くなり、ブログ運用時の修正や拡張も行いやすくなります。記事数が増えても構成が破綻しにくく、長期的な運用にも向いています。
生徒
NextjsのServerComponentsだけでブログを作れる理由がよく分かりました。特にサーバーでHTMLを作るという考え方が新鮮でした。
先生
それは大事なポイントですね。ServerComponentsは表示速度だけでなく、設計の分かりやすさも魅力です。ブログのような情報発信サイトと相性が良いです。
生徒
JSONファイルやデータベースから直接データを取得できるのも便利だと感じました。APIを作らなくても良い場面が多そうですね。
先生
その通りです。小規模から中規模のブログであれば、ServerComponentsだけで十分に実用的な構成を作れます。
生徒
動的ルーティングもファイル名だけで設定できるので、URL設計が分かりやすかったです。
先生
AppRouterの考え方に慣れると、ページ構成を考えるのが楽になります。ブログ運営を続けるうえで大きな助けになりますよ。
生徒
次はClientComponentsと組み合わせた使い分けにも挑戦してみたいです。
先生
とても良い流れですね。今回の内容を土台にすれば、より実践的なNextjsブログ開発に進めます。