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 のデザイン指針: レスポンシブ、ダークモード、そしてデザインフレームワークの活用
霊夢:「この設計がしっかりしていれば、実際の実装もスムーズに進むはずよ!」
魔理沙:「次は実際の実装フェーズに突入して、ここで計画した設計をコードに落とし込んでいくぜ!」