MDX — это расширение Markdown, которое позволяет использовать JSX внутри документации. Это делает MDX мощным инструментом для создания динамического контента и интеграции компонентов React прямо в тексте. Трансформация контента в MDX подразумевает возможность изменять, обогащать и структурировать текст и элементы документа с помощью JavaScript и компонентов.
Одним из ключевых аспектов MDX является возможность внедрения JSX-компонентов в Markdown-контент. Любой React-компонент может быть импортирован и использован как элемент разметки:
import Alert from './Alert';
<Alert type="warning">
Внимание! Этот раздел содержит важную информацию.
</Alert>
MDX автоматически компилирует такой код в валидный React-код, что позволяет динамически изменять контент на основе состояния приложения или переданных пропсов.
MDX позволяет создавать динамические списки, таблицы или секции документа на основе данных. Например, используя массив объектов, можно сгенерировать карточки:
const cards = [
{ title: 'Первая карточка', description: 'Описание первой карточки' },
{ title: 'Вторая карточка', description: 'Описание второй карточки' }
];
{cards.map((card, index) => (
<div key={index} className="card">
<h3>{card.title}</h3>
<p>{card.description}</p>
</div>
))}
Такой подход позволяет трансформировать статический Markdown в интерактивный и гибко управляемый контент.
MDX поддерживает плагины Remark и Rehype, которые позволяют производить трансформацию контента на этапе компиляции.
Remark-плагины работают с AST Markdown, что позволяет:
Rehype-плагины работают с HTML-деревом:
Пример использования Remark-плагина для автоматического добавления идентификаторов к заголовкам:
import remarkSlug from 'remark-slug';
const mdxOptions = {
remarkPlugins: [remarkSlug]
};
MDX позволяет передавать пропсы в компоненты прямо из Markdown. Это облегчает создание настраиваемых блоков контента:
<Alert type="info" message="Информация о продукте" />
Компонент Alert может использовать переданные пропсы для
изменения визуального отображения, содержания и поведения. Кроме того,
контекст React можно использовать для управления состоянием документа
или общими настройками.
MDX поддерживает условную отрисовку элементов с использованием JavaScript. Это позволяет скрывать или отображать контент в зависимости от состояния приложения:
{isLoggedIn ? (
<p>Добро пожаловать, пользователь!</p>
) : (
<p>Пожалуйста, войдите в систему.</p>
)}
Таким образом, Markdown перестает быть статичным и становится интерактивным инструментом для отображения информации.
MDX позволяет импортировать данные из внешних файлов или API и использовать их для генерации контента. Пример импорта JSON-данных и генерации списка статей:
import articles from './articles.json';
<ul>
{articles.map(article => (
<li key={article.id}>{article.title}</li>
))}
</ul>
Это открывает возможность создавать документы, которые автоматически обновляются при изменении источника данных.
Для трансформации контента в MDX активно используются CSS-in-JS
решения, такие как styled-components или
emotion. Это позволяет:
import styled from 'styled-components';
const Highlight = styled.span`
background-color: yellow;
font-weight: bold;
`;
<p>Важное слово: <Highlight>MDX</Highlight></p>
С помощью плагинов и компонентов можно создавать динамическое оглавление, которое строится на основе заголовков в документе. Это упрощает навигацию в больших MDX-файлах и обеспечивает удобный доступ к разделам.
import { Toc } from './Toc';
<Toc headings={headings} />
Список заголовков (headings) может быть получен с
помощью Remark-плагинов или парсинга AST Markdown, что обеспечивает
синхронизацию содержания и оглавления.
MDX предоставляет уникальные возможности для преобразования статического Markdown в динамический, настраиваемый и интерактивный контент. Использование JSX-компонентов, плагинов Remark/Rehype, условной логики и внешних данных открывает широкий спектр применения: от документации и блогов до сложных интерактивных приложений.
Контент можно не только структурировать, но и визуально обогащать, создавать адаптивные интерфейсы и интегрировать с существующей экосистемой React.