MDX — это расширение Markdown, позволяющее внедрять JSX-компоненты в текстовую разметку. Одной из ключевых возможностей MDX является использование форматтеров для управления тем, как содержимое Markdown преобразуется в конечный JSX-вывод. Форматтеры отвечают за парсинг, трансформацию и рендеринг отдельных элементов документа, обеспечивая гибкость и контроль над структурой и стилем.
Inline-форматтеры Эти форматтеры работают с встроенным текстом, включая:
[текст](url)),**жирный**, _курсив_),`код`).Inline-форматтеры преобразуют Markdown-разметку в соответствующие
React-компоненты, например <strong>,
<em> или <code>.
Block-форматтеры Они обрабатывают блочные элементы, такие как:
<p>),<h1>, <h2> и
т.д.),<ul>, <ol>),<pre><code>),<blockquote>).Block-форматтеры позволяют внедрять в документ сложные JSX-компоненты вместо стандартных HTML-тегов, обеспечивая стилизованный вывод.
MDX использует двухступенчатую трансформацию:
Парсинг Markdown в AST (Abstract Syntax Tree) На этом этапе весь текст документа разбивается на дерево узлов:
paragraph — абзац,heading — заголовок,link — ссылка,inlineCode — встроенный код и т.д.AST хранит как текст, так и метаданные (уровень заголовка, URL ссылки, язык кода).
Трансформация AST в JSX через форматтеры Каждый узел AST обрабатывается соответствующим форматтером. Форматтер:
className,
style или кастомные атрибуты.Форматтеры могут быть пользовательскими, что позволяет создавать уникальные компоненты для специфической разметки.
MDX поддерживает подключение своих форматтеров через объект
components при использовании MDXProvider:
import { MDXProvider } from '@mdx-js/react';
const components = {
h1: (props) => <h1 style={{ color: 'darkblue' }} {...props} />,
code: (props) => <pre className="custom-code" {...props} />,
};
<MDXProvider components={components}>
<YourMDXContent />
</MDXProvider>
Ключевые моменты при создании кастомных форматтеров:
<h1> или <p>, добавляя
стили и логику.children и метаданные.Форматтер для блока кода особенно важен в учебниках и документации. Обычно он выполняет три функции:
Пример:
const CodeBlock = ({ className, children }) => {
const language = className?.replace('language-', '');
return (
<pre className={`code-block ${language}`}>
<code>{children}</code>
</pre>
);
};
const components = { code: CodeBlock };
MDX можно интегрировать с фреймворками вроде Next.js, Gatsby, React Static. В таких случаях форматтеры:
Использование форматтеров с такими фреймворками позволяет строить документацию, блоги и учебные материалы с единым подходом к стилям и компонентам.
components, чтобы все MDX-документы использовали
одинаковый стиль и логику рендеринга.Форматтеры — это основа гибкого и мощного отображения Markdown в MDX. Они позволяют не только преобразовывать стандартную разметку, но и внедрять интерактивные компоненты, управлять стилями и расширять возможности документации без изменения исходного Markdown.