MDX сочетает возможности Markdown и React-компонентов, что позволяет создавать динамическую и структурированную документацию. Одним из важных аспектов построения многостраничной документации является организация перехода между страницами, особенно функции «Предыдущая» и «Следующая» страница.
В MDX каждая страница может содержать frontmatter, который задаёт ключевую информацию о странице:
---
title: "Основы MDX"
slug: "/mdx-basics"
order: 1
---
Для построения навигации важно иметь упорядоченный список страниц. В большинстве проектов его формируют либо статически при сборке, либо динамически с помощью файловой системы и парсинга frontmatter.
Создание массива объектов, представляющих страницы, позволяет реализовать навигацию:
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
const pagesDirectory = path.join(process.cwd(), 'pages/mdx');
const files = fs.readdirSync(pagesDirectory);
const pages = files.map(filename => {
const filePath = path.join(pagesDirectory, filename);
const fileContents = fs.readFileSync(filePath, 'utf8');
const { data } = matter(fileContents);
return {
title: data.title,
slug: data.slug,
order: data.order
};
}).sort((a, b) => a.order - b.order);
После сортировки по order каждая страница получает
индекс, по которому можно определить предыдущую и
следующую страницы.
Создание React-компонента для отображения ссылок на соседние страницы:
import Link from 'next/link';
export default function PageNavigation({ currentSlug, pages }) {
const currentIndex = pages.findIndex(page => page.slug === currentSlug);
const previousPage = pages[currentIndex - 1];
const nextPage = pages[currentIndex + 1];
return (
<nav className="page-navigation">
{previousPage && (
<Link href={previousPage.slug}>
<a className="previous-page">← {previousPage.title}</a>
</Link>
)}
{nextPage && (
<Link href={nextPage.slug}>
<a className="next-page">{nextPage.title} →</a>
</Link>
)}
</nav>
);
}
Ключевые моменты:
slug и массив pages.Навигация должна быть визуально понятной. Пример CSS для горизонтальной навигации:
.page-navigation {
display: flex;
justify-content: space-between;
margin-top: 2rem;
padding: 1rem 0;
border-top: 1px solid #ddd;
}
.page-navigation a {
color: #0070f3;
text-decoration: none;
font-weight: 500;
}
.page-navigation a:hover {
text-decoration: underline;
}
Встраивание компонента навигации на каждую MDX страницу:
import PageNavigation from '../components/PageNavigation';
import pages from '../pagesData';
# Основы MDX
MDX объединяет Markdown и JSX, что позволяет использовать React-компоненты внутри документации.
<PageNavigation currentSlug="/mdx-basics" pages={pages} />
Особенности интеграции:
currentSlug должен соответствовать slug страницы.pages может быть импортирован как статический массив,
либо сгенерирован динамически при сборке сайта.Для больших проектов ручное указание slug неудобно. Используется динамическая генерация навигации при сборке:
export function getStaticProps({ params }) {
const pages = getAllPages(); // возвращает упорядоченный массив
const currentPageIndex = pages.findIndex(p => p.slug === params.slug);
return {
props: {
pages,
currentSlug: params.slug,
previousPage: pages[currentPageIndex - 1] || null,
nextPage: pages[currentPageIndex + 1] || null
}
};
}
Такой подход позволяет:
Многоуровневая навигация: Страницы могут содержать категории и подкатегории. Для этого массив страниц строится с вложенными объектами, а компонент навигации адаптируется к структуре.
Динамическое выделение активной страницы:
Использование класса active позволяет визуально
подсвечивать текущую страницу в списке навигации.
Интеграция с роутингом: В проектах Next.js или Gatsby маршруты автоматически связываются со slug из frontmatter, что упрощает навигацию.
Организация «Предыдущая» и «Следующая» страница в MDX позволяет сделать документацию интерактивной, логичной и удобной для чтения, сохраняя структуру и гибкость React-компонентов.