toMedia
功能

懒加载

Fumadocs MDX 异步和动态加载模式

Fumadocs MDX 支持两种懒加载模式,以提升大型文档站点的开发服务器性能。

Async 模式

Async 模式使用异步导入生成集合输出,显著减少编译时间。

Docs 集合配置:

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

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

Doc 集合配置:

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

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

注意:Turbopack 目前不支持懒打包,async 模式仅在使用 Next.js 时改善服务器性能。

Dynamic 模式

Dynamic 模式使用 MDX Remote 进行按需编译,实现最大性能优化。

依赖安装:

npm i @fumadocs/mdx-remote shiki

配置:

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

// Doc 集合
export const doc = defineCollections({
  type: 'doc',
  dir: 'content/docs',
  dynamic: true,
});

使用模式

使用 async 或 dynamic 模式时,frontmatter 数据立即可用,但编译后的内容需要 await load() 函数:

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

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

if (page) {
  console.log(page.data); // Frontmatter 立即可用

  const { body: MdxContent, toc } = await page.data.load();
  return <MdxContent components={getMDXComponents()} />;
}

Dynamic 模式限制

  1. MDX 文件中不允许 import/export 语句 — 通过 components prop 传递组件
  2. 图片必须使用 URL 引用(如 /images/test.png),不能使用文件路径 ./image.png;将图片存放在 public 文件夹中

搜索建议

使用 async 或 dynamic 模式时,强烈建议使用第三方搜索服务,它们通常更擅长处理大量内容索引。

On this page