MDX (Markdown for JSX) представляет собой расширение Markdown, позволяющее внедрять компоненты JSX прямо в текстовые документы. Экосистема MDX включает несколько ключевых библиотек и инструментов, которые обеспечивают полный цикл работы с контентом: от его написания до рендеринга в веб-приложениях.
@mdx-js/mdx – ядро MDX, библиотека для
парсинга и компиляции MDX в JSX. Она превращает MDX-файлы в валидный
React-код, который затем можно использовать в приложении. Поддерживает
плагины для работы с AST (Abstract Syntax Tree), что позволяет гибко
обрабатывать контент на этапе компиляции.@mdx-js/react – библиотека для
интеграции с React. Она предоставляет компонент
MDXProvider, через который можно переопределять рендеринг
стандартных Markdown-элементов (h1, p,
a) и подключать кастомные компоненты.xdm – современная альтернатива
@mdx-js/mdx, ориентированная на высокую скорость компиляции
и поддержку последней версии JSX. Часто используется в новых проектах
Next.js и Astro.MDX можно рендерить как на стороне клиента, так и на стороне сервера. Выбор подхода зависит от архитектуры приложения:
example.mdx и его
использование как <Example />.Для серверного рендеринга часто применяются функции
getStaticProps и getStaticPaths, чтобы
подготавливать контент заранее и обеспечивать динамическую генерацию
страниц.
MDX тесно интегрируется с современными сборщиками и фреймворками:
@mdx-js/loader
MDX-файлы превращаются в React-компоненты в процессе сборки.vite-plugin-mdx, который обеспечивает быструю компиляцию и
интеграцию с HMR (Hot Module Replacement).@next/mdx или кастомные плагины, позволяя импортировать MDX
напрямую в страницы и компоненты.MDX поддерживает плагины как на уровне Markdown, так и на уровне JSX.
Remark-плагины позволяют трансформировать Markdown перед компиляцией в JSX. Примеры:
remark-slug для автоматической генерации
id у заголовков,remark-autolink-headings для добавления ссылок к
заголовкам.Rehype-плагины обрабатывают уже HTML-представление документа, например:
rehype-highlight для подсветки синтаксиса,rehype-format для приведения HTML к читаемому
виду.MDX позволяет полностью контролировать отображение элементов
Markdown. Через MDXProvider можно задавать компоненты для
любых тегов, включая нестандартные:
import { MDXProvider } from '@mdx-js/react';
import CustomHeading from './CustomHeading';
const components = {
h1: CustomHeading,
a: ({ children, href }) => <a href={href} style={{ color: 'red' }}>{children}</a>
};
<MDXProvider components={components}>
<Content />
</MDXProvider>
Это позволяет создавать единый стиль для документации или блога, заменяя стандартные элементы на более сложные React-компоненты.
MDX-файлы часто используются в документации, блогах и сайтах с большим количеством страниц. Для удобства навигации применяются следующие подходы:
/content или /docs) с логической
структурой.pages или через
getStaticPaths создают маршруты автоматически.MDX поддерживает динамическую загрузку компонентов через
import и React.lazy, что позволяет
оптимизировать размер бандла:
import { lazy, Suspense } from 'react';
const Chart = lazy(() => import('./Chart'));
<MDXProvider components={{ Chart }}>
<Suspense fallback={<div>Loading...</div>}>
<Content />
</Suspense>
</MDXProvider>
Такой подход снижает нагрузку на основное приложение и ускоряет рендеринг MDX-страниц.
MDX позволяет внедрять интерактивные элементы напрямую в документацию:
useState,
useEffect) для демонстрации UI-примеров.react-live.Этот подход делает документацию живой, позволяя пользователям взаимодействовать с примерами прямо на странице.
MDX-файлы можно тестировать аналогично обычным React-компонентам:
@testing-library/react для
юнит-тестирования.Такой комплекс инструментов обеспечивает стабильность и предсказуемость поведения MDX-документов в масштабных проектах.