MDX — это расширение Markdown, которое позволяет включать JSX-компоненты прямо в текст документа. Для эффективной работы с MDX важно понимать, как можно расширять функциональность редакторов с помощью плагинов. Плагины в контексте MDX работают как промежуточный слой между парсером Markdown и сборщиком JavaScript-кода, позволяя модифицировать AST (Abstract Syntax Tree), добавлять новые возможности синтаксиса и интегрировать сторонние библиотеки.
1. Remark-плагины
Remark — это система обработки Markdown на уровне AST. Она отвечает за разбор и преобразование исходного Markdown в дерево узлов.
Пример подключения Remark-плагина в MDX:
import { MDXProvider } from '@mdx-js/react';
import remarkSlug from 'remark-slug';
import remarkAutolinkHeadings from 'remark-autolink-headings';
const mdxOptions = {
remarkPlugins: [remarkSlug, remarkAutolinkHeadings],
};
<MDXProvider components={{}}>
<MDXRenderer options={mdxOptions}>{content}</MDXRenderer>
</MDXProvider>
Ключевые моменты:
remarkSlug автоматически добавляет id к
заголовкам.remarkAutolinkHeadings позволяет делать заголовки
кликабельными.2. Rehype-плагины
Rehype отвечает за обработку HTML после конвертации Markdown/MDX в HTML.
Пример использования Rehype-плагина:
import rehypePrism from '@mapbox/rehype-prism';
const mdxOptions = {
rehypePlugins: [rehypePrism],
};
Ключевой момент: rehypePrism позволяет
делать подсветку синтаксиса для блоков кода.
Remark-плагин
Структура собственного плагина выглядит так:
function remarkMyPlugin() {
return (tree) => {
visit(tree, 'heading', (node) => {
node.children.push({
type: 'text',
value: ' ?'
});
});
};
}
visit — функция из пакета unist-util-visit
для обхода дерева AST.tree — объект AST документа.Rehype-плагин
function rehypeAddTargetBlank() {
return (tree) => {
visit(tree, 'element', (node) => {
if (node.tagName === 'a') {
node.properties = node.properties || {};
node.properties.target = '_blank';
node.properties.rel = 'noopener noreferrer';
}
});
};
}
MDX-плагины тесно связаны с редакторами типа MDX Deck, Next.js, Gatsby, а также визуальными редакторами на базе Slate.js или ProseMirror. Основные принципы интеграции:
Пример конфигурации в Next.js:
import { serialize } from 'next-mdx-remote/serialize';
import remarkGfm from 'remark-gfm';
import rehypeHighlight from 'rehype-highlight';
export async function getStaticProps() {
const mdxSource = await serialize(content, {
mdxOptions: {
remarkPlugins: [remarkGfm],
rehypePlugins: [rehypeHighlight],
},
});
return { props: { mdxSource } };
}
MDX-плагины обеспечивают гибкость и масштабируемость работы с Markdown и JSX. Remark-плагины позволяют управлять структурой документа на этапе разбора, Rehype — изменять конечный HTML. Собственные плагины дают полный контроль над обработкой содержимого, что делает MDX мощным инструментом для создания динамических и интерактивных документов.