MDX — это расширение синтаксиса Markdown, которое позволяет встраивать JSX-компоненты в текстовую разметку. Несмотря на гибкость, MDX накладывает определённые ограничения, понимание которых критично для корректного использования библиотеки в проектах на JavaScript.
MDX поддерживает использование JSX, однако JSX-блоки должны быть самостоятельными единицами. Нельзя напрямую вставлять JSX внутрь обычного Markdown-текста без обрамления. Например:
Текст до блока
<MyComponent />
Текст после блока
Попытка встроить JSX в середину строки Markdown приведёт к ошибке парсинга:
Неверно: <MyComponent /> здесь текст
Каждый JSX-компонент в MDX должен быть отдельным абзацем или элементом.
MDX позволяет вставлять JavaScript-выражения в фигурных скобках
{}. Однако есть ограничения:
Примеры допустимых выражений:
{2 + 2} // Вернёт 4
{user.name} // Выведет значение свойства name объекта user
Недопустимые конструкции:
{if (x > 0) { return x }} // Ошибка синтаксиса
{const y = 5} // Ошибка, объявления вне компонента
Для сложной логики необходимо создавать отдельный компонент:
function ShowPositive({ value }) {
return value > 0 ? <span>{value}</span> : null;
}
<ShowPositive value={x} />
MDX интерпретирует все элементы, начинающиеся с заглавной буквы, как React-компоненты. Следовательно:
<div>,
<p>) остаются стандартными HTML-тегами.<MyComponent /> // корректно
<Div /> // ошибка, Div не является React-компонентом
Импорты в MDX выполняются через директиву import.
Существует несколько особенностей:
Пример корректного импорта:
import Button from './Button.jsx'
<Button text="Click me" />
Неверный вариант:
# Заголовок
import Button from './Button.jsx' // Ошибка
MDX позволяет использовать стандартные блоки кода с тройными обратными апострофами. Однако:
js, jsx, ts, tsx,
bash).```jsx
// Этот код только отображается
<MyComponent />
#### 6. Ограничения по обработке inline-элементов
MDX поддерживает использование JSX внутри Markdown-текста, но **только через inline-выражения в фигурных скобках**. Прямое встраивание полноценного компонента в середину строки недопустимо:
```mdx
Неверно: Этот текст <MyComponent /> продолжается дальше.
Корректно:
Этот текст {<MyComponent />} продолжается дальше.
Однако при использовании сложных компонентов inline-формат может быть неудобным, поэтому рекомендуется использовать отдельные JSX-блоки.
className и
style={{}}.class для
JSX-компонентов вызовет ошибку.for → htmlFor, onclick →
onClick.<Button className="primary" style={{ color: 'red' }} />
Неверно:
<Button class="primary" oncl ick="alert('Hi')" />
MDX не поддерживает непосредственные циклы и условные блоки в Markdown-части. Для динамической генерации элементов необходимо:
map внутри JSX.Пример правильного подхода:
function ItemList({ items }) {
return (
<ul>
{items.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
}
<ItemList items={myItems} />
MDX сохраняет большую часть синтаксиса Markdown, но некоторые расширения могут конфликтовать:
- Элемент списка
<MyComponent /> // корректно, если компонент на отдельной строке
Неправильно:
- Элемент списка <MyComponent /> // ошибка парсинга
MDX предоставляет мощные инструменты для интеграции JSX в Markdown, но требует строгого соблюдения правил вложенности, импорта и синтаксиса выражений. Нарушение этих ограничений приводит к ошибкам компиляции и неправильному отображению контента. Понимание этих правил является основой для написания стабильных и читаемых MDX-документов.