Библиотека MDX интегрируется с экосистемой remark и rehype, что позволяет обрабатывать Markdown и HTML на разных этапах компиляции. remark-плагины работают на уровне синтаксического дерева Markdown (MDAST), а rehype-плагины — на уровне дерева HTML (HAST).
Примеры популярных remark-плагинов:
remark-slug — добавляет уникальные идентификаторы к
заголовкам для удобного создания ссылок.remark-autolink-headings — автоматически оборачивает
заголовки в ссылки с якорями.remark-gfm — добавляет поддержку GitHub Flavored
Markdown (таблицы, зачеркивания, списки задач).Примеры популярных rehype-плагинов:
rehype-highlight — подсветка синтаксиса кода с
использованием highlight.js.rehype-stringify — преобразует дерево HTML обратно в
строку, необходимый этап для окончательной генерации MDX.rehype-slug — аналог remark-slug, добавляет
идентификаторы к заголовкам на уровне HTML.Настройка плагинов осуществляется через объект конфигурации MDX:
import { compile } from '@mdx-js/mdx';
import remarkGfm from 'remark-gfm';
import rehypeHighlight from 'rehype-highlight';
const mdxContent = `
# Пример заголовка
\`\`\`js
console.log('Hello, MDX!');
\`\`\`
`;
const compiled = await compile(mdxContent, {
remarkPlugins: [remarkGfm],
rehypePlugins: [rehypeHighlight],
});
Плагин @mdx-js/react позволяет использовать
React-компоненты внутри MDX-документов и управлять их рендерингом через
MDXProvider. Это обеспечивает возможность глобальной замены
элементов Markdown на кастомные компоненты.
Пример использования:
import { MDXProvider } from '@mdx-js/react';
import MyHeading from './MyHeading';
const components = {
h1: MyHeading,
};
function App({ children }) {
return <MDXProvider components={components}>{children}</MDXProvider>;
}
В данном случае все заголовки h1 в MDX будут заменены на
компонент MyHeading.
Ключевой момент: MDXProvider поддерживает все
HTML-теги Markdown (p, h1, h2,
ul, li, code) и позволяет
создавать глобальный стиль отображения контента без изменения исходного
MDX.
mdx-bundler — инструмент для компиляции MDX в
исполняемый JavaScript-код с поддержкой ESM. Он сочетает в себе
возможности esbuild и MDX, обеспечивая высокую
производительность при работе с большим количеством MDX-документов.
Особенности:
Пример использования:
import { bundleMDX } from 'mdx-bundler';
const result = await bundleMDX({
source: mdxContent,
mdxOptions(options) {
options.remarkPlugins = [...(options.remarkPlugins || []), remarkGfm];
options.rehypePlugins = [...(options.rehypePlugins || []), rehypeHighlight];
return options;
},
});
const { code } = result; // скомпилированный JS-код для рендеринга
mdx-bundler особенно полезен для статических сайтов и
блогов, где нужно динамически генерировать страницы из MDX с кастомными
компонентами и плагинами.
Для интеграции MDX с фреймворком Next.js используется
next-mdx-remote. Он позволяет рендерить MDX контент на
сервере и передавать готовый HTML в компонент страницы без необходимости
компиляции на клиенте.
Пример:
import { serialize } from 'next-mdx-remote/serialize';
import { MDXRemote } from 'next-mdx-remote';
export async function getStaticProps() {
const mdxSource = await serialize('# Пример MDX', { remarkPlugins: [remarkGfm] });
return { props: { mdxSource } };
}
export default function Page({ mdxSource }) {
return <MDXRemote {...mdxSource} />;
}
Преимущество: поддержка серверного рендеринга и оптимизация производительности страниц с MDX.
Для работы с метаданными MDX-документов используются плагины
remark-frontmatter и rehype-meta. Они
позволяют извлекать YAML или TOML блоки с настройками документа и
использовать их внутри React-компонентов.
Пример YAML-фронтматтера:
---
title: "Пример документа"
date: "2026-03-23"
tags: ["mdx", "javascript"]
---
# Контент документа
С помощью этих плагинов можно парсить фронтматтер и передавать метаданные в компоненты, например для генерации заголовков страниц или списка тегов.
Плагин remark-code-titles добавляет заголовки к блокам
кода, что особенно удобно для документации. Заголовок определяется как
первая строка блока комментария:
```js:title=example.js
console.log('Hello, world!');
На выходе получится визуально выделенный блок с названием файла `example.js`. Такой подход улучшает читаемость кода в учебных материалах и блогах.
---
### rehype-accessible-emojis
Плагин `rehype-accessible-emojis` преобразует эмодзи в доступные для screen reader элементы, улучшая UX и доступность контента. Он заменяет графические эмодзи на `<span>` с `aria-label`, что важно для образовательных и корпоративных MDX-документов.
---
Эти плагины формируют экосистему MDX, позволяя гибко кастомизировать Markdown и HTML, интегрировать React-компоненты, управлять фронтматтером и улучшать доступность. Комбинация remark и rehype плагинов обеспечивает максимальный контроль над преобразованием контента на всех этапах компиляции.