Kom godt i gang
Denne vejledning opsætter et dokumentationswebsted med Onedocs fra en tom mappe. Hvis du allerede har et Next.js-projekt, kan du springe de filer over, du har, og sammenligne resten.
Forudsætninger
- Node.js 20.9 eller nyere (kræves af Next.js 16)
- Next.js 16 med App Router, React 19.2 eller nyere
- Tailwind CSS v4 (forudindstillingen Onedocs CSS importerer
tailwindcss)
Fumadocs UI 16 understøtter kun Next.js 16 og React 19.2, så ældre versioner af Next.js eller React virker ikke, selvom pakkens metadata for onedocs stadig angiver dem (#5).
Installation
Onedocs inkluderer ikke Next.js eller Fumadocs. De er peer-afhængigheder, så du installerer dem ved siden af:
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
Behold lucide-react@0.562-fastlåsningen. onedocs 0.1.27 angiver lucide-react ^0.562.0 som en peer-afhængighed, og uden fastlåsningen installerer npm lucide-react 1.x og stopper med en ERESOLVE-fejl (#1).
De samme pakker fungerer med pnpm, yarn eller bun.
Tilføj scripts Next.js til package.json:
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
}
}
Projektstruktur
Sådan ser resultatet ud:
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
Lad os oprette hver fil.
Konfigurationsfiler
onedocs.config.ts
Din primære konfigurationsfil. Kun title er påkrævet; se Konfiguration for resten.
import { defineConfig } from "onedocs/config";
export default defineConfig({
title: "My Docs",
description: "Documentation for my project",
nav: {
github: "username/repo",
},
});
source.config.ts
Fortæller Fumadocs MDX, hvor dit indhold ligger. Dette er det eneste sted, hvor indholdsmappen angives:
import { defineDocs } from "fumadocs-mdx/config";
export const docs = defineDocs({
dir: "content/docs",
});
next.config.mjs
Aktiverer behandling af MDX:
import { createMDX } from "fumadocs-mdx/next";
const withMDX = createMDX();
/** @type {import('next').NextConfig} */
const config = {};
export default withMDX(config);
Fumadocs MDX genererer en mappe .source/ fra source.config.ts, når Next.js starter. Tilføj .source til .gitignore.
postcss.config.mjs
Kører Tailwind CSS v4, som forudindstillingen Onedocs CSS er bygget på:
export default {
plugins: {
"@tailwindcss/postcss": {},
},
};
tsconfig.json
Eksemplerne nedenfor importerer fra @/, så tilknyt det til src/:
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
}
}
Next.js føjer de resterende compilerindstillinger til denne fil, første gang du kører next dev eller next build.
Kildeopsætning
src/lib/source.ts
Indlæser dit dokumentationsindhold:
import { loader } from "fumadocs-core/source";
import { docs } from "../../.source/server";
export const source = loader({
baseUrl: "/docs",
source: docs.toFumadocsSource(),
});
Appfiler
src/app/layout.tsx
Dit rodlayout:
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 fra Fumadocs UI leverer søgedialogen samt det lyse og mørke tema. FontHead forudindlæser Inter Variable-skrifttypen fra /fonts/InterVariable.woff2 og angiver den som sidens skrifttype. Onedocs leverer ikke skrifttypefilen: download InterVariable.woff2 fra Inter-udgivelser, og læg den i public/fonts/. Uden den bruger teksten systemets sans-serif-skrifttype.
Hvis du vil opbygge disse metadata ud fra din konfiguration i stedet, kan du se createMetadata i API-referencen.
src/app/globals.css
Importér forudindstillingen CSS:
@import "onedocs/css/preset.css";
@source "./**/*.tsx";
@source "../../content/**/*.mdx";
Forudindstillingen indlæser Tailwind CSS, typografierne Fumadocs UI og layouttypografierne Onedocs. Stierne @source er relative til globals.css, så disse to linjer peger på src/app/ og på mappen content/ i projektets rod.
src/app/page.tsx
Startsiden. HomePage gengiver hero-sektionen, funktionerne og sidefoden fra din konfiguration:
import { HomePage } from "onedocs";
import config from "../../onedocs.config";
export default function Home() {
return <HomePage config={config} packageName="my-package" />;
}
packageName føjer installationskommandoer til npm, yarn, pnpm og bun til hero-sektionen. Udelad den, hvis dit projekt ikke er en pakke.
src/app/docs/layout.tsx
Dokumentationslayout med sidepanel:
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
Individuelle dokumentationssider:
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,
};
}
Indhold
content/docs/index.mdx
Hver side skal have en title i sine frontmatter-data. description er valgfri:
---
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
Angiver rækkefølgen i sidepanelet:
{
"pages": ["index"]
}
Tilføj en side ved at oprette en anden fil af typen .mdx og angive dens navn i pages.
Kør det
Start udviklingsserveren:
npm run dev
Startsiden findes på http://localhost:3000 og dokumentationen på http://localhost:3000/docs.
Byg til produktion:
npm run build
Tilføj derefter søgning, et sitemap og llms.txt i SEO og søgning.