MDX:串聯開發、設計、內容與 AI 的超強文件

Written by Mark Hong
Last updated November 30, 2025
MDX:串聯開發、設計、內容與 AI 的超強文件

MDX Markdown for the component era

摘要

在現代 Web 開發的演進歷程中,內容(Content)與邏輯(Logic)的融合始終是一個核心議題。

MDX(Markdown for the Component Era)作為一種將 JSX(JavaScript XML)語法嵌入 Markdown 文檔的技術規範,已經超越了單純的「文檔格式」範疇,演變為連接開發者、設計師、內容創作者以及人工智慧(AI)代理的關鍵基礎設施。本報告旨在對 MDX 進行詳盡的剖析,從其解決 Storybook 文檔斷裂問題的誕生背景,到如今在 Next.js App Router 架構下作為 React Server Components (RSC) 的核心載體,再到其在 Vercel AI SDK 中作為生成式使用者介面(Generative UI)標準格式的戰略地位。

本文將深入探討 MDX 的技術架構演進、在 npm 生態系中的統治級數據表現、以及它如何通過 TinaCMS 和 Content Collections 等工具重塑團隊協作流程。我們將特別關注 MDX 如何打破開發者與非技術人員之間的藩籬,並分析在 AI 驅動的軟體開發新時代,MDX 如何成為 LLM(大型語言模型)輸出結構化 UI 的首選協議。


第一章:MDX 的誕生背景與解決的核心問題

1.1 前 MDX 時代的二元對立與開發痛點

在 MDX 出現之前,Web 開發領域存在著一種顯著的「二元對立」:內容與組件的割裂。

MDX 前時代的二元對立:內容與組件的割裂

一方面,Markdown 因其簡潔、易讀、與 HTML 的直接映射關係,成為了技術文件、部落格文章和論壇評論的標準撰寫格式。Markdown 的哲學是「內容至上」,它刻意限制了 HTML 的複雜性,以確保文檔的可移植性和閱讀體驗。

另一方面,隨著 React、Vue 等現代前端框架的興起,組件化(Component-based) 開發成為主流。開發者習慣於將 UI 拆解為可重用的模塊(如 <Button /><Alert /><Chart />)。

然而,當開發者試圖在 Markdown 撰寫的長篇內容中嵌入這些豐富的交互式組件時,遭遇了巨大的技術摩擦。傳統的解決方案存在嚴重缺陷:

  1. HTML 注入(Raw HTML Injection): 開發者被迫在 Markdown 中混寫原始 HTML 標籤。這不僅破壞了 React 的虛擬 DOM(Virtual DOM)機制,還需要使用 dangerouslySetInnerHTML,這帶來了跨站腳本攻擊(XSS)的安全隱患,且無法傳遞複雜的 JavaScript 對象作為屬性(Props)。
  2. Shortcodes(短代碼): WordPress 或 Hugo 等靜態站點生成器引入了特定語法的 Shortcodes(如 {{< youtube id >}})。這種語法是專有的、非標準的,且將開發者鎖定在特定的構建工具中,無法享受現代 JavaScript 模塊系統的優勢。
  3. Iframe 隔離: 將交互式小部件(Widget)放入 Iframe 中雖然實現了隔離,但導致了性能下降、樣式不一致以及通訊困難。

這種割裂在 Storybook 等設計系統工具中表現得尤為劇烈。Storybook 旨在展示 UI 組件的狀態和文檔,但早期的 Storybook 難以在同一個文件中既展示組件的代碼示例,又渲染組件本身,同時還保持文檔的可讀性。這導致了所謂的「Storybook Predicate」問題,即構建工具難以區分哪些 Markdown 文件是純文檔,哪些是包含組件邏輯的「故事(Story)」,開發者被迫使用複雜的文件命名約定(如 .stories.mdx)來繞過構建系統的限制。

1.2 MDX 的核心哲學:內容即代碼(Content as Code)

MDX 的誕生正是為了彌合這一鴻溝。它的核心哲學可以概括為「內容即程式」。在 MDX 的範式中,Markdown 不再僅僅被編譯為靜態的 HTML 字串,而是被編譯為一個 JavaScript 函數(通常是 React 組件)。

這一架構轉變解決了以下關鍵問題:

  • 原生交互性(Native Interactivity): 開發者可以直接在 Markdown 中 import { Chart } from './components',然後像在普通 React 文件中一樣使用 <Chart year={2024} />。這使得靜態內容瞬間轉變為動態應用。
  • 上下文感知(Context Awareness): 由於 MDX 被編譯為組件,它可以訪問應用程序的上下文(Context)。這意味著文檔中的組件可以感知當前的主題(深色/淺色模式)、用戶的登錄狀態或全局配置。
  • 組件複用與標準化: MDX 允許團隊建立一套標準的「內容組件庫」。例如,一個 <Callout type="warning"> 組件可以在數百篇文檔中重複使用,確保了設計的一致性,並允許一處修改、處處更新。

通過解決這些問題,MDX 成為了「應用現代化(App Modernization)」的推手,特別是在將傳統的靜態文檔站點遷移到交互式學習平台(如 React 官方文檔、Stripe 文檔)的過程中發揮了決定性作用。


第二章:技術架構與編譯原理

MDX 的強大並非來自單一的解析器,而是建立在龐大的 Unified 生態系統之上。理解 MDX 的運作機制,必須深入分析其編譯管線(Pipeline)。

2.1 Unified、Remark 與 Rehype 的協同工作

MDX 的編譯過程是一個標準的 AST(抽象語法樹)轉換流程,主要分為三個階段:

MDX 編譯管線:解析、轉換與生成
  1. 解析(Parse): MDX 處理器首先將原始文本解析為語法樹。這裡使用的是 mdast(Markdown Abstract Syntax Tree)。MDX 的創新之處在於它擴展了標準的 Markdown 解析器,使其能夠識別 JSX 語法(如 <Component />)和 ESM(ECMAScript Modules)語法(如 import/export)。這意味著在 AST 層面,Markdown 的段落節點(Paragraph Node)和 JSX 的組件節點(JSX Element Node)是並存的。

  2. 轉換(Transform)—— Remark 與 Rehype 的接力: 這是 MDX 最具擴展性的環節。

    • Remark 階段: 對 mdast 進行操作。開發者可以在此階段使用插件,例如 remark-gfm 來支持 GitHub 風格的表格和刪除線,或者 remark-toc 來自動生成目錄。
    • 橋接(Bridge): 通過 remark-rehype,mdast 被轉換為 hast(HTML Abstract Syntax Tree)。
    • Rehype 階段: 對 hast 進行操作。這通常涉及 HTML 結構的處理,例如使用 rehype-slug 為標題添加 id 以支持錨點跳轉,或使用 rehype-prism-plus 進行代碼塊的語法高亮。
  3. 生成(Codegen): 最後,hast 被編譯為 JavaScript Code。這段程式通常導出一個 React 組件(或 Vue/Svelte 組件)。這個組件接收 components prop,允許使用者在運行時動態替換 Markdown 元素(例如,將所有的 h1 替換為自定義的 <Heading1 /> 組件)。

2.2 從 Contentlayer 到 Content Collections 的數據層演進

隨著 MDX 在 Next.js 等框架中的普及,如何管理大量的 MDX 文件成為了新的挑戰。這引發了數據層工具的劇烈演進。

Contentlayer 的興衰: 在 2022-2023 年間,Contentlayer 是管理本地 MDX 內容的標準。它能夠將 MDX 文件轉換為類型安全(Type-safe)的 JSON 數據,解決了手動解析 Frontmatter 的痛苦。然而,隨著其主要贊助商 Stackbit 被 Netlify 收購,Contentlayer 的維護陷入停滯,且與 Next.js 的新特性(如 Turbopack)兼容性出現問題。

Content Collections 的崛起(2024-2025): 為了填補這一真空,Content Collections 應運而生。它被視為 Contentlayer 的現代化繼承者,提供了更優越的開發者體驗:

  • 類型安全與驗證: Content Collections 集成了 Zod 驗證庫,允許開發者定義嚴格的 Schema。例如,強制要求每篇部落格文章必須有 title(字串)和 publishedAt(日期)。如果 MDX 文件的 Frontmatter 不符合 Schema,構建過程將直接報錯,從而避免了運行時錯誤。
  • 轉換 API: 它提供了一個顯式的 transform 函數,允許開發者在構建時預處理數據,例如自動計算閱讀時間或生成模糊預加載圖像(Blur placeholder),並將這些計算結果直接注入到生成的類型定義中。
  • 架構兼容性: 與 Contentlayer 不同,Content Collections 設計之初就考慮了與 Vite、Next.js App Router 的深度集成,解決了模塊解析和熱重載(HMR)的痛點。

第三章:市場數據與生態系分析

3.1 npm 下載量與開發者採用率

數據顯示,MDX 已經從一個小眾的文檔工具成長為 Web 開發的基礎設施。 根據 npm 統計數據:

  • 核心編譯包 @mdx-js/mdx 的年下載量已超過 1.35 億次。
  • React 集成包 @mdx-js/react 的週下載量穩定在 900 萬次以上。這一數字極為驚人,考慮到 React 本身的普及度,這意味著很大一部分 React 項目都直接或間接地依賴了 MDX 技術。

此外,周邊生態的活躍度也印證了其廣泛的採用。例如,處理 MDX 內部導入導出的工具 mdast-util-mdxjs-esm 也擁有數百萬的下載量,這表明開發者不僅僅是使用基礎功能,還在深入利用 MDX 的 AST 能力進行定製化開發。儘管有觀點指出 npm 下載量可能受到 CI/CD 自動化構建的影響而虛高,但 MDX 在 GitHub 上的 19k+ Stars 以及在 Storybook、Next.js 官方文檔等頂級項目中的核心地位,足以證明其真實的市場滲透率。

3.2 框架支持與「State of JS」趨勢

MDX 的流行與現代 Meta-Framework(元框架)的崛起密不可分。根據 2024-2025 年的技術趨勢觀察,MDX 已成為以下框架的「標配」:

表 1:主流框架對 MDX 的支持對比

框架 MDX 集成方式 特點與優勢 適用場景
Next.js (App Router) @next/mdx / next-mdx-remote 支持 RSC (Server Components),零客戶端 JavaScript 負擔 動態應用、AI 聊天介面、大型企業官網
Astro 內建 Content Collections 「靜態優先」,提供最佳的構建性能和類型安全,支持混合渲染 內容驅動型網站、部落格、行銷頁面
Remix mdx-bundler 強大的服務端加載器(Loader)模式,支持動態編譯 SaaS 儀表板、需要即時編譯內容的平台

Astro 尤其值得關注。Astro 5.0 進一步強化了 Content Layer API,將 MDX 視為一等公民,其「零 JS 默認」的理念與 MDX 的靜態內容特性完美契合,使得 Astro 正在迅速蠶食 Next.js 在純內容站點(如文檔、部落格)的市場份額。


第四章:開發者體驗與性能優化

4.1 React Server Components (RSC) 的性能革命

在 Next.js 的 Pages Router 時代,使用 MDX 往往意味著將大量的解析庫和組件代碼打包發送到客戶端,這導致了 Bundle Size 的膨脹,影響了頁面加載速度(Time to Interactive)。 隨著 React Server Components (RSC) 的引入,MDX 迎來了性能的巨大飛躍。

在 App Router 架構下:

  • 服務端編譯: MDX 文件在服務器端(或構建時)被編譯和渲染。這意味著如果你的 MDX 中使用了高亮的代碼塊(例如使用 Shiki),這幾百 KB 的語法高亮庫完全不會被發送到用戶的瀏覽器。用戶接收到的只是渲染好的 HTML 和樣式。
  • 組件隔離: 只有當 MDX 中顯式引入了客戶端交互組件(如 <Counter />,標記為 'use client')時,這部分 JavaScript 才會被發送。這種「島嶼架構」的思想極大地減少了網絡傳輸量。
  • 遠程加載: 使用 next-mdx-remote/rsc,開發者可以安全地從資料庫或 CMS 獲取 MDX 字串,並在服務端將其序列化為 RSC Payload,傳輸給客戶端。這解決了以往在客戶端動態編譯 MDX 帶來的性能瓶頸和安全風險。

4.2 Josh Comeau 與 Kent C. Dodds 的工作流範式

MDX 社區的兩位領軍人物 Josh Comeau 和 Kent C. Dodds 定義了 MDX 的高級工作流,成為了許多開發者的效仿對象。

  • Josh Comeau 的「奇思妙想」工作流: Josh 的部落格以其高度互動性聞名。他利用 MDX 在文章中嵌入了自定義的「代碼遊樂場」和動態圖表。他的工作流強調 自定義組件的深度集成,例如在 MDX 中直接使用 <ScrollyTelling> 組件來製作滾動敘事效果。他證明了 MDX 不僅僅是文檔,更是一種創造沉浸式網頁體驗的媒介。
  • Kent C. Dodds 的 mdx-bundler: Kent 創建的 mdx-bundler 解決了 MDX 文件依賴管理的問題。與普通的解析器不同,mdx-bundler 使用 esbuild 來打包 MDX 文件及其所有導入的依賴(甚至支持 TypeScript)。這使得 MDX 文件可以像一個獨立的微型應用一樣,擁有完整的模塊依賴樹,極大提升了編譯速度和開發靈活性。

第五章:賦能非開發者角色——設計師與內容創作者的協作

儘管 MDX 為開發者提供了無窮的靈活性,但其「代碼與內容混合」的特性對於非技術人員(設計師、行銷人員、內容編輯)來說卻是一道高牆。一個遺漏的閉合標籤 /> 或錯誤的引號就可能導致整個構建崩潰。MDX 的成功不僅在於技術本身,更在於圍繞它建立的協作工具鏈。

5.1 設計師:Storybook 與設計系統的「真理之源」

對於 UI/UX 設計師而言,MDX 是連接設計稿(Figma)與生產代碼的橋樑。在 Storybook 中,MDX 發揮了至關重要的作用:

  • 文檔即組件(Docs as Components): 設計師和工程師使用 .mdx 文件來編寫設計系統文檔。不同於靜態的 PDF 指南,Storybook 中的 MDX 文檔直接導入了實際的 React 組件(如 <Button />)。這意味著文檔中展示的按鈕與生產環境中的按鈕完全一致,實現了「所見即所得」的設計驗證。
  • ArgsTable 自動化: MDX 可以自動解析組件的屬性(Props)並生成參數表(ArgsTable)。設計師可以在文檔頁面直接調整組件參數(例如將 primary 改為 secondary),實時觀察組件外觀的變化,而無需修改代碼。
  • 協作摩擦的消除: 通過 MDX,設計規範(Typography, Spacing)不再是死板的規則,而是可交互的代碼塊。這極大減少了「開發還原度」的問題,因為開發者和設計師參考的是同一個「真理之源(Source of Truth)」。

5.2 內容創作者:TinaCMS 與視覺化編輯的革命

對於行銷人員和文案作者,直接編寫 MDX 是不切實際的。TinaCMS 是一個改變遊戲規則的工具,它為 MDX 提供了「視覺化編輯」層。

  • Git-Backed 內容管理: 傳統 CMS(如 WordPress)將內容存儲在數據庫中,而 MDX 通常存儲在 Git 倉庫中。TinaCMS 巧妙地結合了兩者。它提供了一個側邊欄或覆蓋層,讓編輯者可以像操作 Wix 或 Squarespace 一樣,通過圖形界面修改標題、更換圖片或重新排列頁面區塊。
  • 實時水合(Real-time Hydration): 當編輯者在 TinaCMS 的界面中修改內容時,Tina 會在後台實時更新 Git 中的 .mdx 文件,並觸發 React 的熱重載。這意味著編輯者可以立即看到修改後的組件效果(例如修改了 <HeroSection /> 的標題),而無需等待構建。
  • 解決「脆弱性」問題: 通過限制編輯者只能操作預定義的字段(Field),TinaCMS 有效防止了非技術人員破壞 MDX 語法結構(例如誤刪組件標籤),從而保證了代碼庫的穩定性。

5.3 Decap CMS 與其他選擇

除了 TinaCMS,Decap CMS(前身為 Netlify CMS)也提供了解決方案,但其對 MDX 的支持相對有限,通常需要將 MDX 視為純文本處理或進行複雜的配置。相比之下,TinaCMS 對 MDX 的深度集成使其成為當前「MDX 視覺化編輯」的首選。


第六章:MDX 在 AI 時代的應用——生成式 UI 與 RAG

人工智慧(AI)的爆發性增長為 MDX 開闢了全新的應用場景。MDX 正在從「人類編寫的文檔格式」演變為「AI 生成的 UI 協議」。

AI 驅動的 UI 生成

6.1 RAG(檢索增強生成)的知識庫標準

在構建 RAG 系統時,知識庫的格式至關重要。MDX 由於其結構化特性,正在取代純 Markdown 或 PDF 成為優選的知識源。

  • 元數據豐富: MDX 的 Frontmatter 包含標題、日期、標籤等結構化數據,有利於向量數據庫的過濾和檢索。
  • 語義分塊(Chunking): 專門的 MDX 分割器(如 crewai_tools 中的工具)可以智能地剝離 JSX 代碼,只索引文本內容,或者保留特定的組件信息以保留上下文。這使得 AI 在檢索技術文檔時,能夠更精準地定位到相關的代碼示例或 API 說明。
  • 可組合提示詞(Composable Prompts): 開發者甚至開始使用 MDX 來編寫 Prompt。通過組件化的 Prompt(例如 <Persona role="expert" /> <Task desc={task} />),實現了 Prompt Engineering 的模組化和復用。

6.2 幻覺問題與 Zod 驗證

AI 生成 MDX 的一個主要風險是「幻覺」(Hallucination)。LLM 可能會生成一個不存在的組件或屬性(例如 <Button variant="super-cool" />),這會導致 React 運行時崩潰。 為了解決這個問題,Zod 再次發揮了關鍵作用。開發者會為 AI 定義嚴格的組件 Schema(工具定義)。在 AI 生成 MDX 之前或期間,Vercel AI SDK 會利用這些 Schema 進行驗證。如果 AI 試圖使用未定義的屬性,驗證層會攔截並要求 AI 修正,從而確保生成的 UI 是類型安全且可渲染的。


第七章:戰略比較與選擇——MDX vs Markdoc

儘管 MDX 功能強大,但在企業級應用中,安全性是一個不可忽視的考量。Markdoc 作為 Stripe 推出的競爭方案,代表了另一種哲學。

表 2:MDX 與 Markdoc 的深度對比

特性 MDX Markdoc
核心哲學 內容即代碼 (Turing-complete) 數據驅動,代碼與內容分離
語法風格 import { Alert } from './ui'; <Alert /> {% callout %} (類似 Liquid 標籤)
安全性 (RCE) 低。如果內容來源不可信,可能執行惡意 JS 代碼。 高。完全聲明式,無法執行任意代碼,只能渲染白名單內的標籤。
靈活性 極高。可定義變量、循環、複雜邏輯。 中等。邏輯受限,適合嚴格管控的文檔。
適用場景 開發者部落格、AI 生成 UI、內部信任團隊的文檔 大型開放平台(如 Stripe)、允許用戶提交內容的社區、非技術團隊眾多的企業

戰略建議

  • 如果你的團隊由開發者主導,或者內容來源是完全可信的(內部 Git 倉庫),且你需要極致的交互性和靈活性(如 AI 生成 UI),MDX 是不二之選。
  • 如果你的內容來自不受信的第三方(如用戶評論),或者你有數百名非技術作者,且極度擔心他們寫出破壞頁面的代碼,那麼 Markdoc 提供了更好的安全邊界和錯誤隔離。

第八章:未來展望與結論

MDX 的發展軌跡清晰地表明,它已經完成了從「工具」到「協議」的轉變。

  1. 服務端島嶼(Server Islands)與混合渲染: 隨著 Astro 和 Next.js 對 RSC 的進一步探索,MDX 的渲染將更加細粒度化。未來,一個 MDX 頁面可能由靜態的 HTML 骨架(由服務端生成)和動態的個性化島嶼(如「為您推薦」組件,由客戶端水合)組成。這將在保持 SEO 和首屏速度的同時,提供高度動態的用戶體驗。
  2. AI 的標準輸出語言: 隨著 Agentic Workflow(代理工作流)的普及,MDX 將鞏固其作為 AI 與前端交互標準格式的地位。我們將看到更多專為 AI 設計的 MDX 組件庫(Headless UI for AI),這些組件不僅考慮人類視覺,還考慮 AI 的調用便利性。
  3. 協作的無縫化: TinaCMS 等工具將繼續進化,最終可能讓 MDX 對於內容創作者來說完全透明。創作者只需關注內容,而底層的 Git 版本控制和 MDX 代碼生成將完全自動化,實現真正的「Headless」內容管理體驗。

結論

MDX 的出現解決了 Web 開發中長期存在的內容與組件割裂問題。它不僅極大提升了開發者的生產力,使得構建像 React 官方文檔那樣的世界級文檔站點成為可能,更在 AI 時代找到了新的戰略錨點。通過正確的工具鏈(如 Next.js, Content Collections, TinaCMS),MDX 能夠串聯起開發、設計、內容與 AI 四個維度,成為現代軟體構建的核心支柱。

訂閱資訊儲存失敗,請稍後再試
您已成功完成訂閱 🎉 🎉

電子報

除了創作本站內容以外,我也關注科技、商業、行銷等議題,我會把一些好資訊、酷東西寫成電子報跟你分享,歡迎免費訂閱。

  • 每月最多兩封信
  • 隨時可取消訂閱