返回文章列表
MDXReactNext.js技術選型

為什麼我需要 MDX?從靜態文檔到互動應用

by Ian

這篇文章本身就是由 MDX 渲染的。

我們常問:「如果 Markdown 已經能做很多事,為什麼還要引入 MDX?」

答案在於:Markdown 是為了「閱讀」,MDX 是為了「互動」。

以下我將直接在這個頁面上展示它們的區別。


1. 靜態 vs 動態

普通 Markdown(靜態)

普通的 Markdown 很適合展示程式碼、列表和文字。它是死的,讀者只能看。

// 這只是一段靜態程式碼
const greet = "Hello World";
console.log(greet);

MDX(動態)

但在 MDX 裡,我可以嵌入一個 活生生的 React 組件。試試看點擊下面的按鈕:

這是 React 組件:計數器

0

👆 剛剛發生了什麼?

這不是 GIF,也不是嵌入的 iframe。這是直接在這個頁面運行的 React 程式碼(State)。普通的 .md 檔案永遠做不到這一點。


2. 傳遞參數(Props)

MDX 最強大的地方在於我們可以像寫 HTML 一樣傳遞資料給組件。這讓維護重複性的 UI 變得非常簡單。

例如,我定義了一個 <Callout /> 組件,我可以隨意改變它的標題和樣式:

💡核心觀念

MDX 把文章視為 資料(Data),但也把文章視為 組件樹(Component Tree)

⚠️警告:複雜度提醒

雖然功能強大,但請記得:如果不需要互動,盡量使用普通 Markdown,以保持構建速度輕量化。

小技巧

你可以在 MDX 中混用 Markdown 語法和 React 組件,兩者完美共存。


3. 資料驅動的內容

假設我正在寫一份團隊介紹文件。在普通 Markdown 裡,我得手寫 HTML 表格。但在 MDX 裡,我可以複用組件:

A
Alice
Frontend Engineer
B
Bob
Product Designer
C
Charlie
DevOps
D
Diana
Backend Engineer

這意味著你的 設計系統(Design System) 可以直接在你的部落格文章中生效。


4. 動態計算

MDX 還能執行 JavaScript 邏輯。例如,顯示距離某個日期還有多少天:

距離 2030 年1489

這個數字是即時計算的,每次你重新載入頁面都會更新。這在普通 Markdown 中是完全不可能的。


什麼時候該用 MDX?

讓我們回到最初的決策點:

需求建議
純文字 + 圖片 + 程式碼✅ 用 .md
Mermaid 流程圖✅ 用 .md + remark 插件
Chart.js / ECharts✅ 用 .md + 全局腳本
嵌入互動組件🔥 用 .mdx
傳遞 Props 給組件🔥 用 .mdx
動態計算內容🔥 用 .mdx

比喻總結

「用 Markdown 時,你在寫文章;用 MDX 時,你在寫應用。」

  • Markdown 是「印刷書」——資訊靜態、一次寫好
  • MDX 是「互動電子書」——讀者可以操作、體驗

如果你只是想「展示」——那就安心回到 Markdown,它更輕、更快、更單純。

只有當你真的需要「讓文章的一部分動起來、連 API、接狀態」,才打開 MDX 這扇門。


結語

這篇文章本身就是最好的證明:

  1. ✅ 你看到了互動計數器
  2. ✅ 你看到了可配置的提示框
  3. ✅ 你看到了資料驅動的用戶卡片
  4. ✅ 你看到了動態計算的日期

這些都是 只有 MDX 才能做到 的事情。

但請記住:能力越大,責任越大。不要為了炫技而使用 MDX——只在真正需要互動的時候才使用它。