MDXProvider — это ключевой компонент библиотеки MDX,
позволяющий гибко управлять рендерингом элементов Markdown внутри
React-приложения. Основная задача MDXProvider — предоставлять
возможность переопределять стандартные HTML-элементы, такие как
<h1>, <p>, <a>,
<ul>, <li> и другие, на кастомные
React-компоненты. Это особенно полезно для единообразного оформления
контента, интеграции с дизайн-системами и добавления дополнительной
логики при рендеринге элементов.
Для использования MDXProvider необходимо импортировать его из пакета
@mdx-js/react:
import { MDXProvider } from '@mdx-js/react';
Затем создаётся объект с компонентами, которые будут заменять стандартные HTML-теги:
const components = {
h1: (props) => <h1 style={{ color: 'darkblue' }} {...props} />,
p: (props) => <p style={{ lineHeight: '1.6' }} {...props} />,
a: (props) => <a style={{ textDecoration: 'underline' }} {...props} />,
};
После этого MDXProvider оборачивает компонент, содержащий MDX-контент:
<MDXProvider components={components}>
<Content />
</MDXProvider>
В этом примере все заголовки <h1> в
Content будут отрисовываться с темно-синим цветом, абзацы
получат увеличенный межстрочный интервал, а ссылки — подчеркнутый
стиль.
MDXProvider поддерживает переопределение любых стандартных элементов Markdown. Например, можно создать собственные версии списков и элементов списка:
const components = {
ul: (props) => <ul style={{ listStyleType: 'square' }} {...props} />,
li: (props) => <li style={{ marginBottom: '8px' }} {...props} />,
};
Это позволяет задавать глобальный стиль списков без необходимости править каждый MDX-файл отдельно.
MDXProvider поддерживает вложенность, что даёт возможность создавать
локальные переопределения для отдельных разделов приложения. Компоненты
передаются через components рекурсивно:
<MDXProvider components={globalComponents}>
<Page>
<MDXProvider components={localComponents}>
<Article />
</MDXProvider>
</Page>
</MDXProvider>
В этом примере globalComponents применяются ко всем
элементам внутри Page, но для Article
используется локальный набор компонентов localComponents,
который может переопределять часть глобальных компонентов.
При работе с TypeScript рекомендуется типизировать объект компонентов, чтобы избежать ошибок при передаче нестандартных элементов:
import { MDXProviderComponents } from '@mdx-js/react';
const components: MDXProviderComponents = {
h2: (props) => <h2 style={{ fontWeight: 'bold' }} {...props} />,
code: (props) => <pre style={{ background: '#f5f5f5', padding: '10px' }} {...props} />,
};
Тип MDXProviderComponents гарантирует, что все ключи
объекта соответствуют допустимым тегам MDX, а переданные свойства
правильно типизированы.
MDXProvider можно использовать совместно с динамически загружаемыми
MDX-файлами. Например, при импорте MDX-контента через
@mdx-js/loader или динамическую загрузку через
next/dynamic:
import dynamic from 'next/dynamic';
const DynamicContent = dynamic(() => import('./content.mdx'));
<MDXProvider components={components}>
<DynamicContent />
</MDXProvider>
Все компоненты внутри динамически загруженного MDX будут автоматически использовать переопределённые стили и функциональность.
MDXProvider часто применяется для интеграции MDX-контента с дизайн-системами. Это позволяет:
Пример интеграции с компонентами дизайн-системы:
import { Heading, Text, Link } from 'design-system';
const components = {
h1: Heading,
p: Text,
a: Link,
};
components. Остальные теги рендерятся как стандартные
HTML-элементы.components для всего
приложения упрощает поддержку и обновление стилей.props
обеспечивает совместимость с существующими MDX-файлами.MDXProvider — фундаментальный инструмент для интеграции MDX с React, позволяющий объединять Markdown и компоненты приложения в единую систему с гибким управлением визуальным и функциональным поведением контента.