ブログをこねこね

作成日: 2026/3/29

更新日: 2026/3/29

ryu-reu.me 構成メモ

ディレクトリ構成

mypageOnNext/
├── app/
│   ├── _sections/         # トップページ用のセクションコンポーネント(About等)
│   ├── api/
│   │   ├── posts/         # 記事 CRUD API(GET/POST + slug別取得)
│   │   └── upload/        # 画像アップロード API
│   ├── blog/              # ブログ一覧ページ(ページング付き)
│   ├── components/        # 共通コンポーネント群
│   ├── contexts/          # React Context(PostsCache等)
│   ├── generated/         # Prisma Client 自動生成ファイル
│   ├── login/             # ログインページ
│   ├── posts/[slug]/      # 記事詳細ページ(slug ベースのルーティング)
│   ├── upload/            # 記事エディタページ(認証必須)
│   ├── layout.tsx         # ルートレイアウト(OGP/メタデータ含む)
│   ├── page.tsx           # トップページ
│   ├── robots.ts          # クローラー制御
│   └── sitemap.ts         # サイトマップ動的生成
├── lib/
│   ├── csrf.ts            # CSRF 対策ヘルパー
│   ├── prisma.ts          # Prisma クライアント
│   └── supabase/          # Supabase クライアント
├── middleware.ts           # 認証ミドルウェア(/upload保護)
├── prisma/
│   ├── schema.prisma      # DBスキーマ(User, Post, Image)
│   └── migrations/        # マイグレーション履歴
├── public/                # 静的ファイル
├── types/                 # TypeScript 型定義
├── .claude/               # Claude Code 設定
├── .github/workflows/     # CI/CD
└── .storybook/            # Storybook 設定

過剰な気もするな


ブログ機能が多少盛った

ちゃんとしたCMSっぽく

  • 記事エディタ — Markdown エディタ + リアルタイムプレビュー。画像はドラッグ&ドロップで Supabase Storage にアップロードして本文に自動挿入される。下書きは localStorage に自動保存されるので、うっかりタブ閉じても大丈夫。
  • ブログ一覧 — ページング付き。Server Component で Prisma から直接取得してるので速いらしい。
  • 記事詳細 (/posts/[slug]) — cuid じゃなくて slug ベースの URL になった。人間が読めるURLは正義。シェアボタン付き(X、LINE、コピー)。

認証が入った

Supabase Auth

仕組みとしては cookie ベースのセッション管理で、Supabase クライアントを ブラウザ用・サーバー用・ミドルウェア用 に3分割してる。これは Next.js の実行環境ごとに cookie の読み書き方法が違うから。詳しくは lib/supabase/ を見てもらえれば。

SEO 対策した

  • layout.tsx にサイト全体のOGP設定
  • 記事詳細ページは generateMetadata() で記事ごとに動的にOGPを生成
  • robots.tssitemap.ts を追加。サイトマップは記事の追加・更新に応じて自動生成

DB スキーマ

User  ──< Post ──< Image
  • User: id, email。Supabase Auth のユーザーと同じメアドで紐付け。
  • Post: title, slug, content, published, authorId。slug はタイトルから自動生成。
  • Image: url, path, postId。Supabase Storage にアップした画像のメタ情報。

slugの扱いこれでいいのかは納得いってない


技術スタック

カテゴリ採用技術
フレームワークNext.js 16 (App Router)
言語TypeScript
スタイリングTailwind CSS
DB/ORMSupabase (PostgreSQL) + Prisma
ストレージSupabase Storage
認証Supabase Auth
アニメーションframer-motion
テストVitest
UIカタログStorybook
CI/CDGitHub Actions + Vercel

まとめ

ボイラープレートの域を超えて実際に使えるブログになったと思う。画像アップロード、認証、SEO まで一通り揃ったのでとりあえず記事を書いて運用できそう