跳至內容
Fumadocs

Markdown 算繪

將 React 元素算繪為 Markdown。

概覽

fumadocs-core/server 會將 React 伺服器元件算繪為 Markdown 文件:

import { renderToMarkdown } from 'fumadocs-core/server';

const text = await renderToMarkdown(
  <div>
    <h2>Hello World</h2>
    <p>
      Some <b>rich</b> content.
    </p>
  </div>,
);

Remark LLMs 所匯出的元件即以它為基礎運作;凡是您想以 Markdown 形式提供的伺服器端算繪內容,也都能使用它。

renderToMarkdown() 僅能在伺服器端使用。

asMarkdown

元件會自行定義其 Markdown 形式。在算繪期間呼叫 asMarkdown() 即代表選擇啟用此功能:當元件正被算繪為 Markdown 時,它會回傳對應的目標,且元件回傳的 HTML 元素會一併轉換。

import { asMarkdown, md } from 'fumadocs-core/server';

function Callout({ title, children }) {
  if (asMarkdown()) return md.linePrefix('> ')`**${title}**\n${children}`;

  return <div className="...">...</div>;
}

未呼叫它的元件會以 JSX 語法連同其 props 一併保留,例如:

<Tabs items={['a', 'b']}>...</Tabs>

這也包括不會在伺服器上執行的用戶端元件。

目標

樹會針對某個目標進行算繪,也就是 renderToMarkdown() 的 target 選項:

  • markdown (預設) :提供給 AI 代理的文件。
  • search:搜尋紀錄的文字。其中保留連結的文字,但不含圖片與程式碼區塊;沒有 Markdown 形式的元件會輸出為 HTML 標籤,並附上其文字 props。

這些規則適用於元件回傳的元素,例如 <a href>。若在 md 範本中以純文字撰寫連結,搜尋結果仍會保留其連結目標,因此請回傳元素,或自行檢查目標。

asMarkdown() 會回傳目前的目標,因此元件可以提供給 AI 代理比搜尋索引更多的內容:

import { asMarkdown, md } from 'fumadocs-core/server';

function Version({ name, released }) {
  const target = asMarkdown();
  if (target === 'search') return name;
  if (target) return md`${name} (released ${released})`;

  return <span title={released}>{name}</span>;
}

md

用於輸出 Markdown 的標籤樣板 (tagged template) ,插值可以是字串、React 節點、Promise,或由它們組成的陣列。您可以先用它將 children 轉為字串,再進行處理。

以下兩種變體會以區塊形式回傳內容:

  • md.linePrefix(prefix):為每一行加上前綴,例如以 '> ' 建立引用區塊。
  • md.indent(size):將每一行縮排。

renderRoute

將頁面元素算繪為 Markdown;若其元件未呼叫 asMarkdown(),則回傳 undefined。

import { renderRoute } from 'fumadocs-core/server';

const text = await renderRoute(<Page params={params} />);

適合用來提供路由的 Markdown 版本:有選擇啟用的頁面會產生 Markdown,其他頁面則回傳 undefined,讓您可以改為回傳 404 或改用其他來源。

How is this guide?

最後更新於