Chapter 04

第4章 ブログプロジェクトの設計

Hiromichi NOMATA
Hiromichi NOMATA
2025.03.16に更新

1. ブログに必要な機能の洗い出し

霊夢:「まずは、ブログに必要な機能を洗い出してみましょう!」
魔理沙:「そうだな。最低限は投稿一覧、詳細ページ、タグやカテゴリ、そしてコメント機能くらいは欲しいぜ。」

  • 投稿一覧ページ: ブログ記事の一覧表示
  • 詳細ページ: 各記事の内容を表示
  • タグ・カテゴリ機能: 記事を分類、フィルタリングできるように
  • コメント機能: 読者からのフィードバックを受け付ける

魔理沙:「さらに、検索機能やアーカイブ機能なんかを追加すれば、ユーザーの利便性がグンとアップするぜ!」

// 例: 投稿一覧コンポーネント(仮想的なサンプル)
import React from 'react';

interface Post {
  id: number;
  title: string;
  excerpt: string;
  tags: string[];
}

interface PostListProps {
  posts: Post[];
}

export const PostList: React.FC<PostListProps> = ({ posts }) => {
  return (
    <div>
      <h2>投稿一覧</h2>
      {posts.map((post) => (
        <div key={post.id}>
          <h3>{post.title}</h3>
          <p>{post.excerpt}</p>
          <div>
            {post.tags.map((tag, index) => (
              <span key={index} className="tag">{tag}</span>
            ))}
          </div>
        </div>
      ))}
    </div>
  );
};

2. 使用するデータソースの選定

霊夢:「次は、どのデータソースを使うかを考えましょう。」
魔理沙:「Markdown や MDX を使う方法、Headless CMS(Contentful, MicroCMS, Sanity など)、または GitHub リポジトリをデータソースとして活用する方法があるな。」

  • Markdown / MDX
    • 軽量でファイル管理がシンプル
    • 静的サイト生成(SSG)と相性が良い
# 例: Markdown ファイルを管理するためのディレクトリ構成
my-next-app/
└── posts/
    ├── post-1.md
    └── post-2.md
  • Headless CMS
    • コンテンツ管理が容易で、非エンジニアでも更新可能
    • API 経由でデータを取得
// 例: Contentful API を使って記事データを取得する(fetcher の一部)
import { createClient } from 'contentful';

const client = createClient({
  space: process.env.CONTENTFUL_SPACE_ID!,
  accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,
});

export async function getPosts() {
  const entries = await client.getEntries({ content_type: 'blogPost' });
  return entries.items;
}
  • GitHub リポジトリ
    • Markdown ファイルを GitHub 上で管理し、CI/CD で自動ビルドも可能

魔理沙:「どれを選ぶかは、プロジェクトの規模や運用体制次第だな!」


3. ディレクトリ設計・コンポーネント構成

霊夢:「次はディレクトリ設計とコンポーネントの分離について考えるわね。」
魔理沙:「再利用性を意識して、ページコンポーネントと UI コンポーネントは分けると管理が楽になるぜ!」

サンプルディレクトリ構成

my-next-app/
├── components/      // UIコンポーネント(共通部品)
│   ├── Header.tsx
│   ├── Footer.tsx
│   └── PostCard.tsx
├── lib/             // API クライアントやユーティリティ関数
│   └── contentful.ts
├── pages/           // Next.js のページコンポーネント
│   ├── index.tsx    // 投稿一覧ページ
│   ├── posts/       
│   │   └── [id].tsx // 動的な投稿詳細ページ
│   └── about.tsx
├── posts/           // Markdown/MDX ファイル(記事データ)
├── public/          // 画像や静的ファイル
└── styles/          // グローバル CSS やモジュール CSS

霊夢:「例えば、PostCard コンポーネントは投稿一覧ページやその他の場所で再利用できるわね。」
魔理沙:「ページ固有の処理は pages に、共通の UI は components に分けると後でメンテナンスがしやすいぜ!」


4. UI/UX のデザイン指針

魔理沙:「最後は UI/UX のデザイン指針だ。ユーザーが使いやすく、見やすいデザインが大事だぜ!」
霊夢:「レスポンシブ対応や、ダークモードの実装、そして Chakra UI、MUI、Tailwind CSS などのフレームワークを利用すれば、開発がぐっと楽になるわ。」

レスポンシブ対応とダークモード(Tailwind CSS の例)

// pages/_app.tsx
import '../styles/globals.css';
import type { AppProps } from 'next/app';

function MyApp({ Component, pageProps }: AppProps) {
  return (
    <div className="min-h-screen bg-gray-100 dark:bg-gray-900 text-gray-800 dark:text-gray-200">
      <Component {...pageProps} />
    </div>
  );
}

export default MyApp;
/* styles/globals.css */
/* Tailwind CSS の基本設定(tailwind.config.js との連携が必要) */
@tailwind base;
@tailwind components;
@tailwind utilities;
  • 霊夢:「Tailwind CSS を使えば、レスポンシブクラスやダークモードのクラスが用意されているから、すぐに使えるのよ!」
  • 魔理沙:「もちろん、Chakra UI や MUI もコンポーネントのカスタマイズがしやすいから、好みに合わせて選べるな!」

まとめ・次回予告

霊夢:「今回は、ブログプロジェクトの設計について全体像を掴んだわね。」
魔理沙:「必要な機能の洗い出しから、データソースの選定、ディレクトリ設計、そして UI/UX の指針まで、しっかり計画を立てるのが成功の鍵だぜ!」

  • 必要な機能の洗い出し: 投稿一覧、詳細、タグ・カテゴリ、コメント、検索・アーカイブなど
  • データソースの選定: Markdown/MDX、Headless CMS、GitHub など、プロジェクトに合った方法を選ぶ
  • ディレクトリ設計とコンポーネント構成: 再利用性を意識してページと UI を分離する
  • UI/UX のデザイン指針: レスポンシブ、ダークモード、そしてデザインフレームワークの活用

霊夢:「この設計がしっかりしていれば、実際の実装もスムーズに進むはずよ!」
魔理沙:「次は実際の実装フェーズに突入して、ここで計画した設計をコードに落とし込んでいくぜ!」