MDX (Markdown + JSX) — это расширение синтаксиса Markdown, которое позволяет интегрировать JSX-компоненты прямо в текстовую разметку. В отличие от обычного Markdown, MDX превращает документ в полноценный модуль JavaScript, предоставляя возможность использовать компоненты, пропсы и динамическое поведение прямо внутри Markdown-файлов.
Ключевая особенность MDX заключается в том, что документ больше не является просто текстом — это полноценный JavaScript-модуль, который можно импортировать и рендерить.
MDX полностью сохраняет возможности стандартного Markdown:
Заголовки:
# Заголовок 1 уровня
## Заголовок 2 уровняСписки:
- Пункт списка
- Еще один пунктСсылки и изображения:
[Текст ссылки](https://example.com)
Форматирование текста:
**жирный текст**, *курсив*, `код`В MDX можно вставлять JSX-компоненты с использованием обычного синтаксиса React:
<MyButton color="blue">Нажми меня</MyButton>
Любой импортируемый или объявленный компонент можно использовать так же, как и в React. Важно, что JSX внутри MDX должен быть корректным с точки зрения JavaScript — теги должны быть закрыты, а атрибуты валидны.
MDX поддерживает стандартные механизмы ES Modules:
import { MyComponent } from './components/MyComponent';
export const meta = {
title: 'Пример документа'
};
Импортированные компоненты можно использовать прямо в документе, а экспортированные объекты позволяют хранить метаданные или конфигурацию документа.
MDX тесно интегрируется с экосистемой Remark и Rehype для парсинга и трансформации Markdown и HTML.
Пример подключения плагина Remark для подсветки синтаксиса кода:
import remarkGfm from 'remark-gfm';
import { compile } from '@mdx-js/mdx';
const mdxSource = `
\`\`\`js
console.log("Hello MDX")
\`\`\`
`;
const result = await compile(mdxSource, {
remarkPlugins: [remarkGfm]
});
Здесь remarkGfm добавляет поддержку расширенного
синтаксиса Markdown, включая таблицы и автолинк.
Компоненты можно как импортировать, так и объявлять прямо внутри документа:
export const Alert = ({ children }) => (
<div style={{ border: '1px solid red', padding: '10px' }}>
{children}
</div>
);
<Alert>Важное сообщение!</Alert>
MDX позволяет использовать пропсы, условные конструкции и JavaScript-выражения:
{[1, 2, 3].map(n => <p key={n}>Пункт {n}</p>)}
MDX позволяет сохранять чистую архитектуру, отделяя визуальные компоненты от контента:
title, date,
tags).Пример структурирования MDX-документа:
export const meta = {
title: 'Документ с компонентами',
date: '2026-03-22'
};
import { Note } from './components/Note';
# Заголовок документа
Это обычный Markdown-текст.
<Note>Важная заметка прямо в тексте</Note>
<!-- Это Markdown-комментарий -->
{/* Это JSX-комментарий */}
Текст с <strong>выделением</strong> прямо внутри строки.
<MyButton color={isActive ? 'green' : 'gray'}>Нажми</MyButton>
```python
def hello():
print("Hello MDX")
---
#### Работа с AST
Remark и Rehype превращают MDX-документ в дерево абстрактного синтаксиса:
- **Remark AST** — структура Markdown-тегов (`heading`, `paragraph`, `list`).
- **Rehype AST** — HTML-дерево после трансформации Markdown.
Используя плагины, можно автоматически модифицировать документ, например, добавлять идентификаторы к заголовкам или заменять изображения на оптимизированные компоненты:
```javascript
import rehypeSlug from 'rehype-slug';
import rehypeAutolinkHeadings from 'rehype-autolink-headings';
const result = await compile(mdxSource, {
rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings]
});
Здесь rehypeSlug добавляет id к каждому
заголовку, а rehypeAutolinkHeadings делает их
кликабельными.
<MyComp /> вместо <MyComp>),
иначе сборка MDX завершится ошибкой.MDX синтаксис предоставляет мощные возможности: от простого форматирования Markdown до полноценного использования React-компонентов и динамических данных внутри документа. Правильное понимание структуры AST и взаимодействия с Remark/Rehype открывает путь к созданию гибких, интерактивных документов и учебных материалов.