Доки по разработке
This project is maintained by teniryte
Ваш модуль 20-mdx показывает, как в Next.js:
.mdx) как страницы,<h1>),useMDXComponents..mdxВ Next.js MDX‑страницы можно использовать как обычные React‑компоненты:
.mdx файл, он становится компонентом,components, чтобы переопределить встроенные элементы.Пример страницы app/20-mdx/page.tsx:
// @ts-nocheck
import Welcome from '@/markdown/welcome.mdx';
function CustomH1({ children }) {
return <h1 style={{ color: 'blue', fontSize: '100px' }}>{children}</h1>;
}
const overrideComponents = {
h1: CustomH1,
};
export default function Page() {
return <Welcome components={overrideComponents} />;
}
Принципы:
<Welcome />.components можно подменять поведение стандартных тегов:
h1, h2, p, a, img, ul, li и т.д.Файл app/20-mdx/layout.tsx задаёт:
/20-mdx,Пример:
// @ts-nocheck
export default function MdxLayout({ children }: { children: React.ReactNode }) {
// Общие стили/оформление для всех MDX‑страниц в этом маршруте
return <div style={{ color: 'blue' }}>{children}</div>;
}
Принципы:
layout.tsx.useMDXComponents: глобовое переопределение элементовФайл src/mdx-components.tsx предоставляет функцию useMDXComponents:
Пример:
import type { MDXComponents } from 'mdx/types';
import Image, { ImageProps } from 'next/image';
export function useMDXComponents(components: MDXComponents): MDXComponents {
return {
// Кастомный <h1> для всего MDX
h1: ({ children }) => (
<h1 style={{ color: 'red', fontSize: '48px' }}>{children}</h1>
),
// Кастомный <img>, обёрнутый в next/image
img: (props) => (
<Image
sizes="100vw"
style={{ width: '100%', height: 'auto' }}
{...(props as ImageProps)}
/>
),
// Не забываем прокинуть переданные компоненты
...components,
};
}
Принципы:
useMDXComponents вы задаёте дефолтные компоненты для всех MDX‑страниц.next/image вместо обычных <img>,Предположим, у вас есть файл markdown/welcome.mdx:
# Добро пожаловать в документацию
Это пример MDX‑страницы, где:
- мы можем использовать **Markdown** синтаксис;
- вставлять React‑компоненты прямо внутрь;
- использовать кастомные компоненты для `h1`, `img` и других тегов.

<CustomButton>Нажми меня</CustomButton>
При рендере:
# Добро пожаловать... превратится в кастомный <h1> из useMDXComponents или overrideComponents,![Картинка] превратится в ваш кастомный img → <Image />,<CustomButton> будет отрисован, если вы передадите его через components или глобово определите в useMDXComponents.Ваш модуль 20-mdx отлично подходит как основа для собственной документации:
src/
markdown/
intro.mdx
getting-started.mdx
forms.mdx
isr.mdx
app/
docs/
layout.tsx // общий layout для документации
page.tsx // список разделов/оглавление
[slug]/
page.tsx // рендер определённого MDX по slug
useMDXComponents для глобового стиля;components при необходимости.Пример рендера раздела документации по slug:
// app/docs/[slug]/page.tsx
import Intro from '@/markdown/intro.mdx';
import Forms from '@/markdown/forms.mdx';
const map = {
intro: Intro,
forms: Forms,
} as const;
export default function DocsPage({ params }: { params: { slug: string } }) {
const MDX = map[params.slug as keyof typeof map] ?? Intro;
return <MDX />;
}
С учётом ваших примеров:
useMDXComponents для глобового влияния,components={...} для локального переопределения.layout.tsx для ветки app/20-mdx или app/docs,next/image и дизайн‑систему:
img на <Image />,MDXComponents для строгой типизации.Этот модуль‑конспект поможет быстро вспомнить, как устроена связка Next.js + MDX в вашем проекте и как расширять её под свою документацию или блог.