MDX (Markdown + JSX) объединяет привычный синтаксис Markdown с возможностями JSX, позволяя внедрять React-компоненты прямо в текстовый контент. Это даёт гибкость при создании документации, блогов и интерактивных интерфейсов. Основная идея — возможность использования компонентов для динамического или структурного контента без отказа от привычного Markdown.
Простейший пример MDX:
# Заголовок
Текст с обычным Markdown.
<MyComponent someProp="value" />
Здесь MyComponent — обычный React-компонент, который
можно вставить между параграфами, списками или таблицами.
Компоненты могут принимать любые свойства, что позволяет динамически изменять их поведение в зависимости от контекста. Для передачи данных используется стандартный синтаксис JSX:
<Button variant="primary" onCl ick={() => alert('Clicked!')}>
Нажми меня
</Button>
Можно также использовать локальные компоненты, объявленные прямо внутри MDX-файла:
export const Highlight = ({ children }) => <span style={{ color: 'red' }}>{children}</span>
Это <Highlight>важное</Highlight> слово.
Ключевой момент: MDX поддерживает как экспорт, так и импорт компонентов, что позволяет строить модульную и повторно используемую структуру контента.
MDX-файлы могут импортировать компоненты и данные из внешних модулей:
import { Alert, CodeBlock } from './components'
<Alert type="warning">Это предупреждение</Alert>
<CodeBlock language="js">{`console.log('Пример');`}</CodeBlock>
Также MDX поддерживает экспорт для использования данных или функций внутри других компонентов:
export const title = "MDX Статья"
MDX позволяет смешивать JSX с Markdown:
# Заголовок
Некоторый текст с **Markdown**.
<div style={{ border: '1px solid black', padding: '10px' }}>
Это блок, оформленный через JSX
</div>
Важно учитывать, что Markdown-блоки преобразуются в JSX, поэтому не
допускаются несовместимые конструкции, такие как вложенные
<p> в <p>.
MDX поддерживает стандартные HTML-теги, CSS-in-JS и стили через пропсы. Это позволяет создавать гибкую визуальную композицию:
<Card style={{ padding: '20px', backgroundColor: '#f5f5f5' }}>
<h2>Заголовок карты</h2>
<p>Описание содержимого</p>
</Card>
Для глобального оформления можно использовать темы, контекст или стилизованные компоненты.
MDX-файлы можно оборачивать в React-контекст для управления состоянием:
import { ThemeContext } from './ThemeContext'
<ThemeContext.Provider value={{ theme: 'dark' }}>
<ThemedComponent />
</ThemeContext.Provider>
Это открывает возможности для создания интерактивных учебных материалов, живых примеров кода и динамических интерфейсов.
MDX поддерживает структурирование контента через заголовки, списки и вложенные компоненты. Можно создавать сложные страницы с многоуровневой навигацией:
# Глава 1
<Section title="Подраздел 1.1">
Контент подраздела
</Section>
<Section title="Подраздел 1.2">
Другой контент
</Section>
Компоненты типа <Section> могут автоматически
формировать оглавление, индекс или динамические ссылки на разделы.
MDX отлично сочетается с библиотеками типа react-live,
позволяя встраивать интерактивные редакторы кода:
import { LiveProvider, LiveEditor, LivePreview } from 'react-live'
<LiveProvider code={`<button>Click me</button>`}>
<LiveEditor />
<LivePreview />
</LiveProvider>
Это позволяет демонстрировать поведение компонентов прямо в документе, что особенно полезно для учебных материалов и документации.
MDX позволяет строить композицию контента как гибкую, модульную систему: текст и компоненты могут существовать на равных, взаимодействовать друг с другом и создавать динамические, интерактивные страницы, что невозможно достичь с обычным Markdown.