Next.jsでMDXブログをゼロから作る - このブログの作り方
CMSなしでマークダウンファイルだけで動くブログをNext.js 16 App Routerで作った過程。フォルダ構成、MDX設定、SEOまで実際のコードの流れでまとめました。
要点まとめ
記事をsrc/content/posts配下の.mdxファイルとして置き、@next/mdxでレンダーすればCMSなしでもブログは動く。ファイルがそのままURLになり、frontmatterの代わりにmeta exportで一覧とメタデータを作る。
目次
今読んでいただいているこのブログには、データベースも管理画面もありません。記事はすべてマークダウンファイル1枚です。どうやって作ったのか、そのまま公開します。
なぜファイルベースなのか
ブログツールはたくさんありますが、個人開発者にはほとんどが過剰です。
- CMS: 管理画面・連携・料金がついてきます
- Notion連携: 便利ですが、レンダリング・速度・カスタマイズで詰まります
- マークダウンファイル: 記事がコードと一緒にバージョン管理でき、無料で、
git pushがそのまま公開です
私は3番目を選びました。摩擦が一番少ないからです。
フォルダ構成
核心だけ見るとこんな形です。
src/
├── app/
│ ├── page.tsx # 홈 - 글 목록
│ ├── posts/[slug]/page.tsx # 글 상세
│ └── sitemap.ts # /sitemap.xml
├── content/posts/*.mdx # ← 글은 여기에만 추가
└── lib/posts.ts # 목록·메타 로딩
ファイル名がそのままURLになります。hello.mdx は /posts/hello で開けます。
MDX設定
App RouterでMDXを使うには @next/mdx を組み込みます。Next 16はTurbopackがデフォルトなので、remark/rehypeプラグインを文字列の名前で渡す必要があります(関数の参照は渡せません)。
const withMDX = createMDX({
options: {
remarkPlugins: ["remark-gfm"], // 표·취소선 지원
rehypePlugins: ["rehype-slug"], // 제목 앵커
},
})
frontmatterの代わりにmeta export
普通はマークダウン冒頭の --- ブロック(frontmatter)にタイトルや日付を書きますが、MDXはJavaScriptを中に持てるので、もっとすっきりした方法があります。そのままオブジェクトをexportするんです。
export const meta = {
title: "글 제목",
date: "2026-07-06",
category: "dev",
}
## 본문 시작
一覧ページでは各ファイルを動的importして、この meta だけを読みます。
const mod = await import(`@/content/posts/${slug}.mdx`)
return mod.meta // 본문 렌더 없이 메타만
パース用ライブラリも、別途のインデックスも必要ありません。
SEOは最初から
ブログの目的が流入なら、SEOは後回しではなく最初に入れるべきです。私は記事ごとのメタデータ・Open Graph・JSON-LD構造化データに加えて、sitemap.xml・robots.txt・rss.xml まで最初から敷いておきました。この話は次の記事で詳しく扱います。
まとめ
- 記事は
.mdxファイル1枚、ファイル名がURL @next/mdx+ 文字列プラグイン(Turbopack)- frontmatterの代わりに
export const meta - SEOは最初のコミットから
この構成そのままなら、皆さんのブログも30分で立ち上げられます。私はこの方式で今日の波のようなプロダクトの話を積み重ねています。
よくある質問
なぜCMSの代わりにMDXファイルを使うのですか?
記事がコードと一緒にバージョン管理でき、無料で、デプロイがそのまま公開になるため、個人開発者にとって摩擦が一番少ないからです。画像・コード・コンポーネントも自由に入れられます。
frontmatterなしでどうやって一覧を作るのですか?
各.mdxの冒頭でmetaオブジェクトをexportし、一覧ページでファイルを動的importしてそのmetaだけを読めばOKです。別途パース用ライブラリは必要ありません。
関連記事
- 💻 開発
アプリ5個を1つのリポジトリで - 個人開発者のTurborepoモノレポ
複数のアプリとWebを1つのリポジトリで管理するTurborepoモノレポの構成法。共通設定の共有、キャッシュでビルドを節約、アプリごとのデプロイまで実践目線でまとめました。
- 💻 開発
ミニPCにDocker + Cloudflare Tunnelでセルフホスティング
自宅のミニPC 1台で複数のWebサービスを安全に公開する方法。ポート開放なしでCloudflare TunnelでHTTPSをつなぎ、Docker Composeで運用します。
- 📚 学び
英語の単語は暗記せず「自分の文」に変えるべき理由
単語帳をいくら覚えても言葉が出てこない本当の理由と、今日目にしたものを自分の文に変えて記憶に残す方法をまとめました。