MDX представляет собой расширение Markdown, позволяющее вставлять JSX-компоненты прямо в текст. Это открывает большие возможности для создания интерактивной документации и блогов, но накладывает определённые ограничения, которые необходимо учитывать при работе с библиотеками Remark и Rehype.
Комбинация Markdown и JSX В MDX Markdown-синтаксис используется одновременно с JSX. Это накладывает ограничения на структуру документа:
Ограничения вложенности
{<Component />}, но JSX в середине параграфа часто
требует переноса в отдельный блок.Remark отвечает за разбор Markdown-структуры перед передачей её в Rehype или на рендеринг:
AST (Abstract Syntax Tree) Remark строит дерево
синтаксиса Markdown. Для MDX это дерево модифицируется плагинами
remark-mdx, которые добавляют новые узлы для
JSX-компонентов.
Плагины Remark Некоторые плагины могут некорректно работать с MDX. Например:
remark-lint иногда ошибочно помечает JSX как
некорректный HTML.remark-slug работает только с обычными заголовками
Markdown, а JSX-компоненты в качестве заголовков не поддерживаются.Порядок плагинов критичен: сначала следует
обрабатывать Markdown через remark-parse, затем подключать
remark-mdx, после чего подключать плагины, модифицирующие
содержимое.
Rehype отвечает за работу с HTML-деревом, полученным после обработки Markdown через Remark:
Конвертация в HTML JSX-компоненты на этом этапе обычно остаются нативным JSX и не преобразуются в HTML. Rehype оперирует только тем HTML, который сгенерирован из Markdown.
Плагины Rehype
rehype-highlight для подсветки кода работает только с
<pre><code> блоками Markdown, игнорируя
JSX-компоненты.rehype-autolink-headings добавляет якоря к заголовкам
Markdown, но заголовки внутри JSX не обрабатываются.Совместимость с React Rehype предоставляет возможность модифицировать HTML перед рендерингом в React. Для MDX важно, чтобы плагины не пытались преобразовать JSX в чистый HTML, иначе компоненты будут потеряны.
Файлы MDX должны иметь расширение
.mdx для корректного распознавания JSX.
Импорты и экспорты JSX разрешены только в начале
файла, до Markdown-контента. Любая попытка вставить import
внутри текста вызовет синтаксическую ошибку.
Объявление переменных через
{const value = 42} возможно, но только в пределах
JSX-блоков или внутри {} в тексте.
Комментарии:
<!-- HTML-комментарий --> поддерживаются только
вне JSX.{/* JSX-комментарий */} допустимы внутри JSX-блоков, но
не в чистом Markdown.MDX позволяет создавать мощные интерактивные документы, но сочетание Markdown и JSX накладывает ограничения на структуру, синтаксис и обработку через Remark и Rehype. Понимание этих особенностей критично для корректного парсинга, трансформации и рендеринга контента.