MDX сочетает возможности Markdown и JSX, позволяя встраивать компоненты React прямо в текст документации. Это открывает возможность динамического и интерактивного контента внутри Markdown-файлов, сохраняя при этом простоту разметки.
Компоненты в MDX ведут себя как обычные JSX-компоненты: их можно импортировать, передавать пропсы и использовать в структуре документа так же, как и в React-приложении.
import { Alert } from './components/Alert'
Это предупреждение отображается прямо в MDX.
При рендеринге MDX эти компоненты обрабатываются через Remark и Rehype, которые разбирают Markdown и преобразуют его в AST (Abstract Syntax Tree). Remark отвечает за разбор и обработку Markdown, а Rehype управляет HTML-структурой, что позволяет интегрировать JSX-компоненты в дерево документа.
MDX предоставляет возможность глобально регистрировать компоненты
через объект MDXProvider. Все элементы, переданные в
components, автоматически подменяют стандартные теги
Markdown.
import { MDXProvider } from '@mdx-js/react'
import { Heading, Paragraph } from './ui'
const components = {
h1: Heading,
p: Paragraph
}
Особенности:
Remark и Rehype работают как плагины для трансформации AST:
Пример подключения плагинов:
import remarkGfm from 'remark-gfm'
import rehypeSlug from 'rehype-slug'
import { compile } from '@mdx-js/mdx'
const mdxSource = `
# Заголовок
Текст с **выделением** и ссылкой [MDX](https://mdxjs.com/)
`
const compiled = await compile(mdxSource, {
remarkPlugins: [remarkGfm],
rehypePlugins: [rehypeSlug],
jsx: true
})
Ключевые моменты:
remarkGfm добавляет поддержку GitHub-flavored Markdown
(таблицы, чекбоксы, автолинкование).rehypeSlug создаёт уникальные идентификаторы для
заголовков, что облегчает навигацию.jsx: true позволяет встраивать React-компоненты
прямо в Markdown.MDX позволяет передавать в компоненты произвольные пропсы, включая функции, объекты и состояния React.
import { Button } from './components/Button'
Также возможна динамическая подгрузка компонентов с использованием
React.lazy и Suspense, что особенно полезно
для больших документаций или ленивой загрузки интерактивных блоков:
import { Suspense, lazy } from 'react'
const Chart = lazy(() => import('./components/Chart'))
Загрузка графика... MDX предоставляет API для тонкой настройки рендеринга:
styled-components или
emotion.const components = {
p: (props) =>
}
Для сложных трансформаций MDX предоставляет доступ к AST:
Пример добавления класса ко всем параграфам через Rehype-плагин:
function rehypeAddClass() {
return (tree) => {
visit(tree, 'element', (node) => {
if (node.tagName === 'p') {
node.properties.className = (node.properties.className || []).concat('custom-paragraph')
}
})
}
}
MDX позволяет сочетать статический Markdown с динамическими компонентами React, создавая мощный инструмент для документации, блогов и интерактивных учебников.