hafuture
Back to Blog

Next.jsとMDXで技術ブログを構築する

Next.js 16 App RouterとMDXを使用して技術ブログを構築する方法。

nextjsmdxweb-development

Next.jsとMDXで技術ブログを構築する

今回の記事では、Next.js 16とMDXを使用して技術ブログを構築する方法について説明します。

技術スタック

  • Next.js 16: App Routerベース
  • MDX: Markdown + JSX
  • gray-matter: Frontmatter解析
  • next-mdx-remote: サーバーサイドMDXレンダリング

プロジェクト構造

hafuture-app/
├── content/posts/       # MDX記事
│   ├── hello-world.mdx
│   └── vibe-coding-blog.mdx
├── src/
│   ├── app/[locale]/
│   │   └── blog/
│   │       ├── page.tsx           # ブログ一覧
│   │       └── [slug]/page.tsx    # 個別の記事
│   ├── components/mdx/
│   │   └── mdx-content.tsx       # MDXレンダラー
│   └── lib/
│       └── posts.ts             # 記事データローダー

記事データの読み込み

gray-matterを使用して、frontmatterとコンテンツを分離します:

import matter from "gray-matter";

const { data, content } = matter(fileContents);

// data: frontmatter (title, date, tagsなど)
// content: Markdown本文

MDXレンダリング

next-mdx-remoteを使用して、サーバーサイドでMDXをレンダリングします:

import { MDXRemote } from "next-mdx-remote/rsc";

<MDXRemote
  source={content}
  options={{
    mdxOptions: {
      rehypePlugins: [
        rehypeHighlight,   // コードハイライト
        rehypeSlug,       // 見出しスラッグ
        rehypeAutolinkHeadings, // 見出しリンク
      ],
    },
  }}
/>

SEO最適化

Next.jsのMetadata APIを使用して、各記事のメタデータを設定します:

export async function generateMetadata({ params }) {
  const { slug } = await params;
  const post = await getPostBySlug(slug);

  return {
    title: post.title,
    description: post.description,
  };
}

結論

Next.jsとMDXを組み合わせることで、CMSなしでGitベースのシンプルかつ強力なブログシステムを構築できます。これにより、開発者に優しく、保守が容易なブログを運営できます。

次の記事では、ブログに追加する機能についてお話しします。お楽しみに!