Vite
Waku
Use Fumadocs MDX with Waku
Setup
Installation
npm i fumadocs-mdx fumadocs-core @types/mdxCreate the configuration file:
import { defineConfig, defineDocs } from 'fumadocs-mdx/config';
export const docs = defineDocs({
  dir: 'content/docs',
});
export default defineConfig();Add the Vite plugin:
import { defineConfig } from 'waku/config';
import mdx from 'fumadocs-mdx/vite';
import * as MdxConfig from './source.config.js';
import tailwindcss from '@tailwindcss/vite';
import tsconfigPaths from 'vite-tsconfig-paths';
export default defineConfig({
  vite: {
    plugins: [tailwindcss(), mdx(MdxConfig), tsconfigPaths()],
  },
});Setup an import alias (optional):
{
  "compilerOptions": {
    "paths": {
      "@/.source": [".source"]
    }
  }
}Integrate with Fumadocs
Create a lib/source.ts file:
import { loader } from 'fumadocs-core/source';
import { create, docs } from '@/.source';
export const source = loader({
  source: await create.sourceAsync(docs.doc, docs.meta),
  baseUrl: '/docs',
});The .source folder will be generated when you run development server or production build.
Done
You can now write content in content/docs folder.
Examples
Rendering Pages
Since Waku supports RSC, you can use the exported default component directly.
import { source } from '@/lib/source';
import type { PageProps } from 'waku/router';
import defaultMdxComponents from 'fumadocs-ui/mdx';
import {
  DocsBody,
  DocsDescription,
  DocsPage,
  DocsTitle,
} from 'fumadocs-ui/page';
export default async function DocPage({
  slugs,
}: PageProps<'/docs/[...slugs]'>) {
  const page = source.getPage(slugs);
  if (!page) {
    // ...
  }
  const MDX = page.data.default;
  return (
    <DocsPage toc={page.data.toc}>
      <DocsTitle>{page.data.title}</DocsTitle>
      <DocsDescription>{page.data.description}</DocsDescription>
      <DocsBody>
        <MDX
          components={{
            ...defaultMdxComponents,
          }}
        />
      </DocsBody>
    </DocsPage>
  );
}How is this guide?
Last updated on
