MDX — это расширение Markdown, которое позволяет встраивать JSX-компоненты непосредственно в текст. Это делает его мощным инструментом для создания интерактивной документации, блогов и образовательного контента в приложениях на React.
MDX сохраняет привычную структуру Markdown: заголовки, списки, ссылки, изображения и таблицы работают так же, как в обычном Markdown. Основное отличие — возможность вставки JSX-компонентов между блоками Markdown.
Пример:
# Заголовок
Это обычный текст Markdown.
<MyButton>Нажми меня</MyButton>
В данном примере <MyButton> — React-компонент,
который будет корректно отрендерен в месте своего вызова.
В MDX можно импортировать компоненты из других файлов:
import Alert from './components/Alert';
<Alert type="warning">
Важно! Это предупреждение.
</Alert>
MDX автоматически распознает импортированные компоненты и позволяет использовать их внутри документации или статьи так, как если бы это был обычный JSX.
Для работы с MDX в приложении на React необходимо использовать
библиотеки @mdx-js/mdx и @mdx-js/react.
Основной процесс состоит из двух шагов:
@mdx-js/mdx.import { compile } from '@mdx-js/mdx';
import fs from 'fs';
const source = fs.readFileSync('./example.mdx', 'utf8');
const jsx = await compile(source, { outputFormat: 'function-body' });
console.log(String(jsx));
MDXProvider:import { MDXProvider } from '@mdx-js/react';
import MDXContent from './example.mdx';
<MDXProvider components={{ Alert }}>
<MDXContent />
</MDXProvider>
MDX позволяет переопределять стандартные HTML-теги и использовать свои компоненты для любого блока:
const components = {
h1: (props) => <h1 style={{ color: 'tomato' }} {...props} />,
p: (props) => <p className="custom-paragraph" {...props} />,
};
Передача объекта components в MDXProvider
заменяет стандартные рендеры Markdown на кастомные.
MDX особенно эффективен в статических сайтах, таких как те, что создаются с Next.js, Gatsby или Astro. Процесс выглядит следующим образом:
Компиляция MDX на этапе сборки Статические генераторы сайтов обрабатывают MDX-файлы в JSX и сразу создают готовые HTML-страницы. Это ускоряет загрузку и улучшает SEO.
Импорт контента как модулей Вместо динамической загрузки MDX-файлов их можно импортировать как модули Jav * aScript:
import PostContent from '../content/post.mdx';
export default function PostPage() {
return <PostContent />;
}
next/image в
Next.js) и интерактивных виджетов. Это позволяет включать медиа и
визуализации без дополнительных скриптов на клиенте.eslint-plugin-mdx)
гарантирует единый стиль и предотвращает синтаксические ошибки.next-mdx-remote позволяет
загружать MDX динамически и использовать статическую генерацию.gatsby-plugin-mdx
интегрируется с GraphQL для извлечения данных.Эта интеграция делает MDX инструментом, который соединяет удобство Markdown и мощь React-компонентов, создавая гибкий и производительный контент для статических сайтов.