首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau
百百 BLOG
首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau

Kurau Blog

「隨心而寫,真真假假,都是我」

一個記錄生活、輸出興趣的個人空間。
遊戲、影視、閱讀、學習……每一段體驗都值得留下文字。

頁面導覽

  • 學習紀錄
  • 遊戲心得
  • 影視Life
  • 書單
  • 委託作品與二創
  • Kurau
  • 合作邀請

找到我

歡迎來 Discord 找我聊天!

“曾經發生的事不可能忘記,只是暫時想不起來而已。”-《神隱少女》

© 2026 Kurau All rights reserved

前端框架

Mdx Next.js

By Kurau·2024-02-15·Updated 2026-05-09·3 分鐘閱讀

Next.js + MDX 部落格

TL;DR
Next.js + MDX 兩條路:官方 @next/mdx(輕量、純 file-based)vs Contentlayer(較重、有 type-safe metadata 但 2024 中已停更)。2026 年推薦走官方 @next/mdx 或 next-mdx-remote。

三種主流做法對比

做法安裝難度type 支援維護狀態適合
@next/mdx⭐ 簡單手動✅ 官方維護文件站、簡單部落格
next-mdx-remote⭐⭐ 中手動✅ Vercel 維護動態載入 MDX(CMS / DB)
Contentlayer⭐⭐⭐ 較重自動產生⚠️ 2024 停更(已不推薦新專案)

方法 1:@next/mdx(官方推薦)

npm install @next/mdx @mdx-js/loader @mdx-js/react
bash
// next.config.mjs
import nextMDX from '@next/mdx';

const withMDX = nextMDX({
  extension: /\.mdx?$/,
});

export default withMDX({
  pageExtensions: ['js', 'jsx', 'mdx', 'ts', 'tsx'],
});
javascript

然後 app/blog/my-post.mdx 就會自動變成 /blog/my-post 路由。

# Hello MDX

可以混 React 元件:

import { Counter } from '@/components/Counter';

<Counter />
mdx
適合誰
部落格 / 文件站 / 內容寫死在 repo 裡的場景。簡單、零依賴,但要資料庫驅動的內容就用方法 2。

方法 2:next-mdx-remote(動態載入)

npm install next-mdx-remote
bash
import { MDXRemote } from 'next-mdx-remote/rsc';
import { compileMDX } from 'next-mdx-remote/rsc';

async function getPost(slug: string) {
  // 從 DB / CMS / API 拿 markdown 字串
  const source = await fetchFromCMS(slug);
  return source;
}

export default async function Page({ params }) {
  const source = await getPost(params.slug);
  return <MDXRemote source={source} components={{ Counter }} />;
}
tsx

適合內容存 DB / CMS / Notion 的情境,RSC 模式直接 server 端編譯。


方法 3:Contentlayer(已停更,不推薦新專案)

維護狀態
Contentlayer 在 2024 年中起停止維護,有相容性問題。原 fork: contentlayer2 由社群繼續維護,但生態已分裂,新專案請避免。

舊專案如果還在用,可以考慮遷移到 @next/mdx。


frontmatter 處理

MDX 不原生支援 frontmatter,要加 gray-matter:

import matter from 'gray-matter';
import fs from 'fs';

const source = fs.readFileSync('post.mdx', 'utf-8');
const { content, data } = matter(source);
// data.title / data.date / data.tags 等
typescript

常見需求:語法高亮

npm install rehype-pretty-code shiki
bash
// next.config.mjs
import nextMDX from '@next/mdx';
import rehypePrettyCode from 'rehype-pretty-code';

const withMDX = nextMDX({
  extension: /\.mdx?$/,
  options: {
    rehypePlugins: rehypePrettyCode, { theme: 'github-dark' },
  },
});
javascript

shiki 是現代首選(VS Code 同款引擎、壓縮後體積小、build time 渲染)。

參考資料
  • Aldi Pranata — How to build a blog with Next.js and MDX
  • @next/mdx 官方文件

目錄

    ◆ 相關文章

    • Next.js Add Font Awesome

      2026-05-09
    • 語言切換

      2026-05-09
    • 從現在開始改用Next.js

      從現在開始改用Next.js

      2026-05-09
    • Ladle 前端測試工具

      Ladle 前端測試工具

      2026-05-09
    ← 上一篇Webpack介紹下一篇 →Next.js Add Font Awesome

    ◆ 關於作者

    Kurau

    個人寫作 / 創作的 SoT,記錄遊戲、影視、學習與生活。

    更多 Kurau 的文章