Aan de slag
Deze handleiding helpt u een documentatiesite met Onedocs op te zetten vanuit een lege map. Hebt u al een Next.js-project, sla dan de bestanden over die u al hebt en vergelijk de rest.
Vereisten
- Node.js 20.9 of hoger (vereist door Next.js 16)
- Next.js 16 met de App Router, React 19.2 of hoger
- Tailwind CSS v4 (de preset Onedocs CSS importeert
tailwindcss)
Fumadocs UI 16 ondersteunt alleen Next.js 16 en React 19.2. Oudere versies van Next.js of React werken dus niet, ook al vermeldt de pakketmetadata van onedocs ze nog (#5).
Installeren
Onedocs bevat Next.js of Fumadocs niet. Dit zijn peer dependencies, dus u installeert ze ernaast:
npm install onedocs fumadocs-core fumadocs-mdx fumadocs-ui lucide-react@0.562 next react react-dom
npm install -D tailwindcss @tailwindcss/postcss typescript @types/react @types/react-dom @types/node
Behoud de lucide-react@0.562-vastzetting. onedocs 0.1.27 declareert lucide-react ^0.562.0 als peer dependency. Zonder de vastzetting installeert npm lucide-react 1.x en stopt het met een foutmelding ERESOLVE (#1).
Dezelfde pakketten werken met pnpm, yarn of bun.
Voeg de scripts Next.js toe aan package.json:
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
}
}
Projectstructuur
Dit is het resultaat:
your-project/
├── content/
│ └── docs/
│ ├── index.mdx
│ └── meta.json
├── public/
│ └── fonts/
│ └── InterVariable.woff2
├── src/
│ ├── app/
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ ├── globals.css
│ │ └── docs/
│ │ ├── layout.tsx
│ │ └── [[...slug]]/
│ │ └── page.tsx
│ └── lib/
│ └── source.ts
├── onedocs.config.ts
├── source.config.ts
├── next.config.mjs
├── postcss.config.mjs
├── tsconfig.json
└── package.json
Laten we elk bestand maken.
Configuratiebestanden
onedocs.config.ts
Uw hoofdconfiguratiebestand. Alleen title is vereist; zie Configuratie voor de rest.
import { defineConfig } from "onedocs/config";
export default defineConfig({
title: "My Docs",
description: "Documentation for my project",
nav: {
github: "username/repo",
},
});
source.config.ts
Geeft aan Fumadocs MDX waar uw content staat. Dit is de enige plek waar de contentmap wordt ingesteld:
import { defineDocs } from "fumadocs-mdx/config";
export const docs = defineDocs({
dir: "content/docs",
});
next.config.mjs
Schakelt de verwerking van MDX in:
import { createMDX } from "fumadocs-mdx/next";
const withMDX = createMDX();
/** @type {import('next').NextConfig} */
const config = {};
export default withMDX(config);
Fumadocs MDX genereert bij het starten van Next.js een map .source/ vanuit source.config.ts. Voeg .source toe aan .gitignore.
postcss.config.mjs
Voert Tailwind CSS v4 uit, waarop de preset Onedocs CSS is gebaseerd:
export default {
plugins: {
"@tailwindcss/postcss": {},
},
};
tsconfig.json
De voorbeelden hieronder importeren uit @/; koppel dit daarom aan src/:
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
}
}
De eerste keer dat u next dev of next build uitvoert, voegt Next.js de overige compileropties die het nodig heeft aan dit bestand toe.
Bron instellen
src/lib/source.ts
Laadt uw documentatiecontent:
import { loader } from "fumadocs-core/source";
import { docs } from "../../.source/server";
export const source = loader({
baseUrl: "/docs",
source: docs.toFumadocsSource(),
});
App-bestanden
src/app/layout.tsx
Uw hoofdlayout:
import type { Metadata } from "next";
import { RootProvider } from "fumadocs-ui/provider/next";
import { FontHead } from "onedocs";
import "./globals.css";
export const metadata: Metadata = {
title: "My Docs",
description: "Documentation for my project",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en" suppressHydrationWarning>
<head>
<FontHead />
</head>
<body className="antialiased">
<RootProvider>{children}</RootProvider>
</body>
</html>
);
}
RootProvider uit Fumadocs UI levert het zoekvenster en het lichte en donkere thema. FontHead laadt vooraf het lettertype Inter Variable van /fonts/InterVariable.woff2 en stelt het in als paginalettertype. Onedocs levert het lettertypebestand niet mee: download InterVariable.woff2 via Inter-releases en plaats het in public/fonts/. Zonder dit bestand valt de tekst terug op het systeemlettertype zonder schreef.
Zie createMetadata in de API-referentie als u deze metadata liever op basis van uw configuratie opbouwt.
src/app/globals.css
Importeer de preset CSS:
@import "onedocs/css/preset.css";
@source "./**/*.tsx";
@source "../../content/**/*.mdx";
De preset laadt Tailwind CSS, de stijlen van Fumadocs UI en de layoutstijlen van Onedocs. Paden @source zijn relatief aan globals.css; deze twee regels verwijzen dus naar src/app/ en naar de map content/ in de hoofdmap van het project.
src/app/page.tsx
De startpagina. HomePage geeft de hero, functies en voettekst uit uw configuratie weer:
import { HomePage } from "onedocs";
import config from "../../onedocs.config";
export default function Home() {
return <HomePage config={config} packageName="my-package" />;
}
packageName voegt installatieopdrachten voor npm, yarn, pnpm en bun toe aan de hero. Laat dit weg als uw project geen pakket is.
src/app/docs/layout.tsx
Documentatielayout met zijbalk:
import { DocsLayout } from "onedocs";
import type { ReactNode } from "react";
import { source } from "@/lib/source";
import config from "../../../onedocs.config";
export default function Layout({ children }: { children: ReactNode }) {
return (
<DocsLayout config={config} pageTree={source.pageTree}>
{children}
</DocsLayout>
);
}
src/app/docs/[[...slug]]/page.tsx
Afzonderlijke documentatiepagina's:
import { source } from "@/lib/source";
import { DocsPage, mdxComponents } from "onedocs";
import { notFound } from "next/navigation";
export default async function Page(props: {
params: Promise<{ slug?: string[] }>;
}) {
const params = await props.params;
const page = source.getPage(params.slug);
if (!page) notFound();
const MDX = page.data.body;
return (
<DocsPage toc={page.data.toc}>
<MDX components={mdxComponents} />
</DocsPage>
);
}
export async function generateStaticParams() {
return source.generateParams();
}
export async function generateMetadata(props: {
params: Promise<{ slug?: string[] }>;
}) {
const params = await props.params;
const page = source.getPage(params.slug);
if (!page) notFound();
return {
title: page.data.title,
description: page.data.description,
};
}
Inhoud
content/docs/index.mdx
Elke pagina heeft een title nodig in de frontmatter. De description is optioneel:
---
title: Introduction
description: What this project does.
---
Welcome to the docs. Components such as `<Callout>` work without imports; see [Components](/docs/components).
content/docs/meta.json
Bepaalt de volgorde van de zijbalk:
{
"pages": ["index"]
}
Voeg een pagina toe door nog een bestand .mdx aan te maken en de naam ervan in pages te vermelden.
Uitvoeren
Start de ontwikkelserver:
npm run dev
De startpagina staat op http://localhost:3000 en de documentatie op http://localhost:3000/docs.
Bouw voor productie:
npm run build
Voeg vervolgens zoeken, een sitemap en llms.txt toe in SEO en zoeken.