Darbo pradžia
Šiame vadove nuo tuščio aplanko nustatoma dokumentacijos svetainė su Onedocs. Jei jau turite Next.js projektą, praleiskite jau sukurtus failus ir palyginkite likusius.
Būtinosios sąlygos
- Node.js 20.9 arba naujesnė versija (reikalinga Next.js 16)
- Next.js 16 su App Router, React 19.2 arba naujesnė versija
- Tailwind CSS v4 (Onedocs CSS išankstinis nustatymas importuoja
tailwindcss)
Fumadocs UI 16 palaiko tik Next.js 16 ir React 19.2, todėl senesnės Next.js arba React versijos neveikia, nors paketo onedocs metaduomenyse jos vis dar nurodytos (#5).
Diegimas
Onedocs neapima Next.js ar Fumadocs. Tai bendrai naudojamos priklausomybės, todėl įdiekite jas greta:
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
Palikite prisegtą lucide-react@0.562 versiją. onedocs 0.1.27 nurodo lucide-react ^0.562.0 kaip bendrą priklausomybę, o be prisegtos versijos npm įdiegia lucide-react 1.x ir sustoja su ERESOLVE klaida (#1).
Tie patys paketai veikia su pnpm, yarn arba bun.
Pridėkite Next.js scenarijus į package.json:
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
}
}
Projekto struktūra
Štai ką turėsite pabaigę:
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
Sukurkime kiekvieną failą.
Konfigūracijos failai
onedocs.config.ts
Pagrindinis konfigūracijos failas. Privalomas tik title; apie kitus skaitykite skiltyje Konfigūracija.
import { defineConfig } from "onedocs/config";
export default defineConfig({
title: "My Docs",
description: "Documentation for my project",
nav: {
github: "username/repo",
},
});
source.config.ts
Nurodo Fumadocs MDX, kur yra jūsų turinys. Tai vienintelė vieta, kurioje nustatomas turinio aplankas:
import { defineDocs } from "fumadocs-mdx/config";
export const docs = defineDocs({
dir: "content/docs",
});
next.config.mjs
Įgalina MDX apdorojimą:
import { createMDX } from "fumadocs-mdx/next";
const withMDX = createMDX();
/** @type {import('next').NextConfig} */
const config = {};
export default withMDX(config);
Fumadocs MDX paleidžiant Next.js iš source.config.ts sukuria aplanką .source/. Pridėkite .source prie .gitignore.
postcss.config.mjs
Paleidžia Tailwind CSS v4, kuriuo pagrįstas išankstinis nustatymas Onedocs CSS:
export default {
plugins: {
"@tailwindcss/postcss": {},
},
};
tsconfig.json
Toliau pateiktuose pavyzdžiuose importuojama iš @/, todėl susiekite jį su src/:
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
}
}
Next.js pirmą kartą paleidus next dev arba next build prie šio failo prideda likusias reikalingas kompiliatoriaus parinktis.
Šaltinio sąranka
src/lib/source.ts
Įkelia dokumentacijos turinį:
import { loader } from "fumadocs-core/source";
import { docs } from "../../.source/server";
export const source = loader({
baseUrl: "/docs",
source: docs.toFumadocsSource(),
});
Programos failai
src/app/layout.tsx
Jūsų šakninis išdėstymas:
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>
);
}
Fumadocs UI esantis RootProvider pateikia paieškos dialogo langą, šviesią ir tamsią temas. FontHead iš anksto įkelia Inter Variable šriftą iš /fonts/InterVariable.woff2 ir nustato jį kaip puslapio šriftą. Onedocs šrifto failo netiekia: atsisiųskite InterVariable.woff2 iš Inter leidimų ir įdėkite į public/fonts/. Jei jo nėra, tekstui naudojamas atsarginis sistemos sans-serif šriftas.
Kaip vietoj to generuoti šiuos metaduomenis iš konfigūracijos, žr. createMetadata skiltyje API nuoroda.
src/app/globals.css
Importuokite CSS išankstinį nustatymą:
@import "onedocs/css/preset.css";
@source "./**/*.tsx";
@source "../../content/**/*.mdx";
Išankstinis nustatymas įkelia Tailwind CSS, Fumadocs UI stilius ir Onedocs išdėstymo stilius. @source keliai nurodomi globals.css atžvilgiu, todėl šios dvi eilutės nurodo src/app/ ir projekto šakniniame aplanke esantį aplanką content/.
src/app/page.tsx
Pradžios puslapis. HomePage iš jūsų konfigūracijos atvaizduoja pagrindinę sritį, funkcijas ir poraštę:
import { HomePage } from "onedocs";
import config from "../../onedocs.config";
export default function Home() {
return <HomePage config={config} packageName="my-package" />;
}
packageName pagrindinėje srityje prideda npm, yarn, pnpm ir bun diegimo komandas. Praleiskite, jei jūsų projektas nėra paketas.
src/app/docs/layout.tsx
Dokumentacijos išdėstymas su šonine juosta:
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
Atskiri dokumentacijos puslapiai:
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,
};
}
Turinys
content/docs/index.mdx
Kiekvieno puslapio metaduomenyse būtinas title. description yra pasirinktinis:
---
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
Nustato šoninės juostos tvarką:
{
"pages": ["index"]
}
Pridėkite puslapį sukurdami kitą .mdx failą ir įrašydami jo pavadinimą į pages.
Paleidimas
Paleiskite kūrimo serverį:
npm run dev
Pradžios puslapis yra http://localhost:3000, o dokumentacija – http://localhost:3000/docs.
Sukurkite gamybinę versiją:
npm run build
Tada skiltyje SEO ir paieška pridėkite paiešką, svetainės žemėlapį ir llms.txt.