跳至內容
Fumadocs

產生頁面

從 AsyncAPI schema 產生頁面。

staticSource() 與 dynamicSource() 會為您的 loader() 產生頁面,而 generateFiles() 則會將頁面以 MDX 檔案的形式寫入您的內容目錄。這幾個函式接受相同的選項。

頁面內容仍由 <AsyncAPIPage /> 負責算繪,產生器只負責編排每個頁面中的 operation。

選項

per

自訂每個頁面包含的內容,預設為 operation。

Operation 指的是具有特定動作的 AsyncAPI operation,例如 receiveLightMeasurement:receive。

模式內容檔案路徑
tag具有相同標籤的 operation{tag_name}.mdx
file位於同一個 schema 檔案中的 operation{file_name}.mdx
operation每個 operation{operationId}.mdx
custom請參閱下方說明不適用
import { asyncapi } from '@/lib/asyncapi';

await asyncapi.staticSource({
  per: 'tag',
});

設為 custom 時,您可以傳入一個函式,完全自訂產生流程:

Example
import { asyncapi } from '@/lib/asyncapi';

await asyncapi.staticSource({
  per: 'custom',
  toPages(builder) {
    for (const [id, item] of Object.entries(builder.document.operations ?? {})) {
      const operation = builder.dereferenceShallow(item);

      builder.create({
        type: 'operation',
        schemaId: builder.id,
        item: { id, action: operation.action },
        path: `${id}.mdx`,
        info: {
          title: operation.title ?? id,
          description: operation.description,
        },
      });
    }
  },
});

設為 tag 時,會依名稱比對標籤。您可以在 info.tags 中定義標籤,為對應頁面加上描述,並透過 x-displayName 控制標題。沒有標籤的 operation 會歸類在 unknown 之下。

asyncapi.yaml
info:
  tags:
    - name: lighting
      description: Operations related to streetlights.
      x-displayName: Lighting

groupBy

在 operation 模式下,您可以用資料夾將輸出檔案分組。

值輸出
tag{tag}/{operationId}.mdx
channel{channel key}/{operationId}.mdx
none (預設){operationId}.mdx
import { asyncapi } from '@/lib/asyncapi';

await asyncapi.staticSource({
  per: 'operation',
  groupBy: 'tag',
});

name

用來控制所產生頁面檔案名稱的函式。

import { asyncapi } from '@/lib/asyncapi';

await asyncapi.staticSource({
  name(output) {
    if (output.type === 'operation') {
      const operation = this.dereferenceShallow(this.document.operations?.[output.item.id]);
      console.log(operation);

      return `my-dir/${output.item.id}`;
    }

    return 'my-dir/filename';
  },
});

您也可以使用 algorithm 選項:

import { asyncapi } from '@/lib/asyncapi';

await asyncapi.staticSource({
  // v2(預設):使用 operation ID
  // v1:使用 `{operationId}/{action}`
  name: { algorithm: 'v1' },
});

meta

自動產生 meta.json 檔案。

您隨時都可以手動定義 meta.json 檔案,以保有最大的彈性。

import { asyncapi } from '@/lib/asyncapi';

await asyncapi.staticSource({
  meta: true,
});

或是自訂資料夾的呈現方式:

import { asyncapi } from '@/lib/asyncapi';

await asyncapi.staticSource({
  meta: {
    folderStyle: 'separator',
  },
});

MDX 檔案

若要將頁面輸出為 MDX 檔案,請建立一個指令碼:

scripts/generate-docs.ts
import { generateFiles } from '@fumadocs/asyncapi';
import { asyncapi } from '@/lib/asyncapi';

void generateFiles({
  input: asyncapi,
  output: './content/docs',
  // 建議啟用此選項
  // 請確保 operation 的描述不會破壞 MDX 語法。
  includeDescription: true,
});

使用指令碼產生文件:

bun ./scripts/generate-docs.ts

將 AsyncAPIPage 元件加入您的 MDX 元件中。產生的檔案會使用 <AsyncAPIPage /> 標籤。

app/docs/[[...slug]]/page.tsx
import { asyncapi } from '@/lib/asyncapi';
import { AsyncAPIPage } from '@/components/api-page';

export default async function Page(props: PageProps<'/docs/[[...slug]]'>) {
  // ...
  <MDX
    components={getMDXComponents({
      AsyncAPIPage: async (props) => (
        <AsyncAPIPage {...await asyncapi.preloadAsyncAPIPage(page)} {...props} />
      ),
    })}
  />;
}

將外掛加入您的 loader():

lib/source.ts
import { asyncapi } from '@/lib/asyncapi';
import { loader } from 'fumadocs-core/source';

export const source = loader({
  // 選用:在頁面樹的每個頁面項目上加上訊息的傳遞方向
  plugins: [asyncapi.loaderPlugin()],
});

generateFiles() 也支援下列選項。

index

產生索引檔案,以卡片形式連結至各個產生的頁面。

import { generateFiles } from '@fumadocs/asyncapi';

void generateFiles({
  index: {
    // 用於產生 `href`
    url: {
      baseUrl: '/docs',
      contentDir: './content/docs',
    },
    items: [
      {
        // 輸出路徑
        path: 'index.mdx',
        // 選用:限制輸入檔案(與伺服器端的 `input` 欄位相同)
        only: ['streetlights.yaml'],
        // 選用:設定 frontmatter
        description: 'All available pages',
      },
    ],
  },
});

imports

在產生的 MDX 檔案中加入自訂匯入。若要在產生的文件中引入元件、工具函式或其他相依套件,這個選項就很實用。

import { generateFiles } from '@fumadocs/asyncapi';

void generateFiles({
  imports: [
    {
      names: ['API_BASE_URL'],
      from: '@/constants',
    },
  ],
});

這會在所有產生的 MDX 檔案中加入以下匯入語句:

import { API_BASE_URL } from '@/constants';

frontmatter

自訂 MDX 檔案的 frontmatter。

預設包含以下欄位:

屬性說明
title頁面標題
description頁面描述
full一律為 true,專為 Fumadocs UI 加入
_asyncapi內部屬性
import { generateFiles } from '@fumadocs/asyncapi';

void generateFiles({
  frontmatter: (title, description) => ({
    myProperty: 'hello',
  }),
});

addGeneratedComment

在產生的檔案開頭加入註解,標示該檔案為自動產生。

import { generateFiles } from '@fumadocs/asyncapi';

void generateFiles({
  // 加入預設註解
  addGeneratedComment: true,

  // 或提供自訂註解
  addGeneratedComment: 'Custom auto-generated comment',

  // 或停用註解
  addGeneratedComment: false,
});

How is this guide?

最後更新於