MDX — это расширение синтаксиса Markdown, которое позволяет включать
JSX-компоненты прямо в Markdown-документы. Для работы с MDX в проектах
на JavaScript чаще всего используют библиотеку @mdx-js/mdx
совместно с @mdx-js/react для интеграции с React.
Установка выполняется через npm или yarn:
npm install @mdx-js/mdx @mdx-js/react
или
yarn add @mdx-js/mdx @mdx-js/react
После установки можно компилировать MDX-файлы в JSX с помощью функции
compile из @mdx-js/mdx:
import { compile } from '@mdx-js/mdx';
import fs from 'fs';
const mdxContent = fs.readFileSync('example.mdx', 'utf-8');
const jsxResult = await compile(mdxContent, { outputFormat: 'jsx' });
Ключевые опции при компиляции:
outputFormat: 'jsx' — указывает, что результатом будет
JSX-код.remarkPlugins и rehypePlugins — позволяют
подключать плагины для обработки Markdown и HTML соответственно.providerImportSource — задаёт источник
MDXProvider для интеграции с React-компонентами.Для отображения MDX-контента в React используют компонент
MDXProvider. Он позволяет заменить стандартные элементы
Markdown на кастомные React-компоненты:
import { MDXProvider } from '@mdx-js/react';
import MyCustomHeading from './MyCustomHeading';
const components = {
h1: MyCustomHeading,
p: (props) => <p style={{ color: 'blue' }} {...props} />
};
function App({ Content }) {
return (
<MDXProvider components={components}>
<Content />
</MDXProvider>
);
}
Таким образом, все заголовки <h1> в MDX-файле
будут рендериться через компонент MyCustomHeading, а абзацы
будут окрашены в синий цвет.
MDX позволяет импортировать и использовать React-компоненты прямо
внутри .mdx файлов:
import Alert from './Alert'
# Важное уведомление
<Alert type="warning">
Это предупреждение о важной информации.
</Alert>
Такая интеграция делает MDX мощным инструментом для документации и блогов с интерактивными компонентами.
MDX поддерживает плагины для обработки контента на этапе компиляции. Примеры популярных плагинов:
remark-gfm — добавляет поддержку GitHub-flavored
Markdown (таблицы, чекбоксы).rehype-slug — автоматически генерирует идентификаторы
для заголовков.rehype-autolink-headings — добавляет ссылки к
заголовкам для удобной навигации.Подключение плагинов осуществляется через опции компилятора:
import remarkGfm from 'remark-gfm';
import rehypeSlug from 'rehype-slug';
const jsxResult = await compile(mdxContent, {
remarkPlugins: [remarkGfm],
rehypePlugins: [rehypeSlug]
});
Next.js имеет собственный механизм работы с MDX через
@next/mdx. Конфигурация включает создание файла
next.config.js:
const withMDX = require('@next/mdx')({
extension: /\.mdx?$/
});
module.exports = withMDX({
pageExtensions: ['js', 'jsx', 'md', 'mdx']
});
MDX-файлы можно размещать в папке pages или в отдельной
директории для контента. Их импорт выглядит как импорт обычного
компонента React:
import PageContent from '../content/my-page.mdx';
export default function Page() {
return <PageContent />;
}
Для разработки с MDX полезны следующие инструменты:
Для отладки MDX в React важно отслеживать ошибки компиляции через
try/catch и проверять корректность JSX-компонентов,
импортируемых в MDX. Частая проблема — использование несуществующих
компонентов, которые вызывают ошибку рендеринга.
MDX-компиляция может быть дорогой в больших проектах. Основные подходы к оптимизации:
.mdx файлов на этапе сборки,
а не на клиенте.Эти методы позволяют снизить нагрузку на браузер и ускорить рендеринг интерактивного контента.
MDX поддерживает:
Пример использования Layout:
export const meta = {
title: 'Документация по MDX'
}
<Layout meta={meta}>
# Содержание документации
</Layout>
Такой подход упрощает создание единообразного дизайна и повторно используемых элементов на всех страницах.
Для эффективной работы с MDX в JavaScript-проектах важно сочетать следующие инструменты и практики:
@mdx-js/mdx для генерации JSX.@mdx-js/react и MDXProvider для
кастомизации рендеринга.remark и rehype для расширенной
обработки Markdown и HTML.Такой стек позволяет создавать интерактивные, легко настраиваемые и производительные MDX-документы в профессиональных проектах.