Primii pași
Acest ghid configurează un site de documentație cu Onedocs pornind de la un dosar gol. Dacă aveți deja un proiect Next.js, omiteți fișierele existente și comparați restul.
Cerințe preliminare
- Node.js 20.9 sau o versiune ulterioară (necesară pentru Next.js 16)
- Next.js 16 cu App Router, React 19.2 sau o versiune ulterioară
- Tailwind CSS v4 (presetarea Onedocs CSS importă
tailwindcss)
Fumadocs UI 16 acceptă doar Next.js 16 și React 19.2, așadar versiunile mai vechi de Next.js sau React nu funcționează, chiar dacă metadatele pachetului onedocs încă le enumeră (Problema #5).
Instalare
Onedocs nu include Next.js sau Fumadocs. Acestea sunt dependențe peer, deci trebuie instalate alături de acesta:
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
Păstrați fixarea lucide-react@0.562. onedocs 0.1.27 declară lucide-react ^0.562.0 drept dependență peer, iar fără fixare npm instalează lucide-react 1.x și se oprește cu o eroare ERESOLVE (Problema #1).
Aceleași pachete funcționează cu pnpm, yarn sau bun.
Adăugați scripturile Next.js la package.json:
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
}
}
Structura proiectului
Iată ce veți obține la final:
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
Să creăm fiecare fișier.
Fișiere de configurare
onedocs.config.ts
Fișierul principal de configurare. Este necesar doar title; consultați Configurare pentru restul.
import { defineConfig } from "onedocs/config";
export default defineConfig({
title: "My Docs",
description: "Documentation for my project",
nav: {
github: "username/repo",
},
});
source.config.ts
Îi indică lui Fumadocs MDX unde se află conținutul. Acesta este singurul loc în care se setează dosarul de conținut:
import { defineDocs } from "fumadocs-mdx/config";
export const docs = defineDocs({
dir: "content/docs",
});
next.config.mjs
Activează procesarea MDX:
import { createMDX } from "fumadocs-mdx/next";
const withMDX = createMDX();
/** @type {import('next').NextConfig} */
const config = {};
export default withMDX(config);
Fumadocs MDX generează un dosar .source/ din source.config.ts la pornirea lui Next.js. Adăugați .source la .gitignore.
postcss.config.mjs
Rulează Tailwind CSS v4, pe care se bazează presetarea Onedocs CSS:
export default {
plugins: {
"@tailwindcss/postcss": {},
},
};
tsconfig.json
Exemplele de mai jos importă din @/, așadar mapați-l la src/:
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
}
}
Next.js adaugă la acest fișier opțiunile de compilare rămase de care are nevoie, la prima rulare a next dev sau next build.
Configurarea sursei
src/lib/source.ts
Încarcă conținutul documentației:
import { loader } from "fumadocs-core/source";
import { docs } from "../../.source/server";
export const source = loader({
baseUrl: "/docs",
source: docs.toFumadocsSource(),
});
Fișierele aplicației
src/app/layout.tsx
Layoutul rădăcină:
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 din Fumadocs UI furnizează dialogul de căutare și temele luminoasă și întunecată. FontHead preîncarcă fontul Inter Variable din /fonts/InterVariable.woff2 și îl setează ca font al paginii. Onedocs nu include fișierul fontului: descărcați InterVariable.woff2 din Versiuni Inter și plasați-l în public/fonts/. Fără acesta, textul folosește fontul sans-serif implicit al sistemului.
Pentru a genera aceste metadate în schimb din configurația voastră, consultați createMetadata din APIReferință.
src/app/globals.css
Importați presetarea CSS:
@import "onedocs/css/preset.css";
@source "./**/*.tsx";
@source "../../content/**/*.mdx";
Presetarea încarcă Tailwind CSS, stilurile Fumadocs UI și stilurile de layout Onedocs. Căile @source sunt relative la globals.css, așadar aceste două linii indică spre src/app/ și spre dosarul content/ din rădăcina proiectului.
src/app/page.tsx
Pagina principală. HomePage randează secțiunea principală, funcționalitățile și subsolul din configurația voastră:
import { HomePage } from "onedocs";
import config from "../../onedocs.config";
export default function Home() {
return <HomePage config={config} packageName="my-package" />;
}
packageName adaugă la secțiunea principală comenzi de instalare pentru npm, yarn, pnpm și bun. Omiteți-l dacă proiectul vostru nu este un pachet.
src/app/docs/layout.tsx
Layoutul documentației cu bara laterală:
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
Pagini individuale de documentație:
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,
};
}
Conținut
content/docs/index.mdx
Fiecare pagină are nevoie de un title în frontmatter. description este opțional:
---
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
Stabilește ordinea barei laterale:
{
"pages": ["index"]
}
Adăugați o pagină creând un alt fișier .mdx și enumerându-i numele în pages.
Rulare
Porniți serverul de dezvoltare:
npm run dev
Pagina principală se află la http://localhost:3000, iar documentația la http://localhost:3000/docs.
Creați versiunea pentru producție:
npm run build
Apoi adăugați căutarea, o hartă a site-ului și llms.txt în SEO și căutare.