跳至內容
Fumadocs

延遲載入

為集合的輸出設定延遲載入。

簡介

預設情況下,所有 Markdown 與 MDX 檔案都必須先經過預先編譯,開發伺服器也同樣受此限制。

對於大型文件網站而言,這可能會拉長開發伺服器的啟動時間。您可以在 doc 集合上啟用 Async 或 Dynamic 模式來改善這個問題。

Async 模式

Async 模式會透過非同步匯入來產生集合的輸出。

import { defineDocs } from 'fumadocs-mdx/config';

export const docs = defineDocs({
  dir: 'content/docs',
  docs: {
    async: true,
  },
});

視您使用的打包工具而定,這可能會大幅縮短開發伺服器的編譯時間。

Next.js 使用者

Turbopack 目前不支援延遲打包,因此 Async 模式只會提升伺服器 效能。

Dynamic 模式

Dynamic 模式會進行隨需編譯,並在執行階段執行編譯後的輸出結果。

建議您安裝 shiki 並將其設為外部相依套件 (externalize) :

npm i shiki

在集合中啟用 Dynamic 模式,方式如下:

import { defineDocs } from 'fumadocs-mdx/config';

export const docs = defineDocs({
  dir: 'content/docs',
  docs: {
    dynamic: true,
  },
});

接著,請依照 Dynamic Entry 的說明,改從 dynamic entry 存取集合。

限制

Dynamic 模式對部分 MDX 功能有所限制。

  • MDX 檔案中不可使用 import/export。 若要使用 MDX 元件,請改由 components prop 傳入。
  • 圖片必須以 URL 參照 (例如 /images/test.png) 。 請勿使用 ./image.png 這類檔案路徑。請將圖片放在 public 資料夾中,並以 URL 參照。

使用方式

您仍可在 page 物件上存取 frontmatter 屬性,但必須呼叫非同步函式 load(),才能載入編譯後的內容 (及其匯出項目) 。

例如:

page.tsx
import { source } from '@/lib/source';
import { getMDXComponents } from '@/components/mdx';

const page = source.getPage(['...']);

if (page) {
  // 可直接使用 frontmatter 屬性
  console.log(page.data);

  // Markdown 內容需要使用 await 載入
  const { body: MdxContent, toc } = await page.data.load();

  console.log(toc);

  return <MdxContent components={getMDXComponents()} />;
}

使用 Async 或 Dynamic 模式時,強烈建議您改用第三方服務實作搜尋功能,這類服務通常更擅長為大量內容建立索引。

How is this guide?

最後更新於