MDX расширяет возможности Markdown, позволяя использовать JSX-компоненты непосредственно в тексте. Одним из ключевых аспектов является замена стандартных элементов Markdown на собственные компоненты, что позволяет точно контролировать внешний вид и поведение контента.
MDXProvider для глобальной заменыДля переопределения стандартных элементов Markdown используется
компонент MDXProvider из пакета @mdx-js/react.
Он позволяет передавать объект components, где ключи
соответствуют тегам HTML, генерируемым Markdown, а значения —
собственные React-компоненты.
Пример структуры:
import { MDXProvider } from '@mdx-js/react';
import CustomHeading from './CustomHeading';
import CustomParagraph from './CustomParagraph';
const components = {
h1: CustomHeading,
p: CustomParagraph,
};
function App({ children }) {
return (
<MDXProvider components={components}>
{children}
</MDXProvider>
);
}
В этом примере:
h1 заменяется на компонент
CustomHeading.p заменяется на компонент
CustomParagraph.Любое содержание MDX, обёрнутое в MDXProvider,
автоматически будет использовать эти компоненты вместо стандартных
HTML-элементов.
Можно переопределять не только заголовки и параграфы, но и все остальные стандартные элементы Markdown:
ul, ol,
liaimgcode,
preblockquoteПример расширенной настройки:
import CustomLink from './CustomLink';
import CustomList from './CustomList';
import CustomCode from './CustomCode';
const components = {
a: CustomLink,
ul: CustomList,
ol: CustomList,
li: ({ children }) => <li className="custom-li">{children}</li>,
code: CustomCode,
};
Важный момент: при замене элементов типа code и
pre часто используют сочетание
компонентов, чтобы корректно обрабатывать как встроенный код,
так и блоки кода.
Компоненты в MDXProvider могут использовать
React-контекст для передачи стилей или настроек через всю
MDX-документацию. Например, можно создать тему для всех заголовков:
const HeadingContext = React.createContext({ color: 'blue' });
function CustomHeading({ children, ...props }) {
const theme = React.useContext(HeadingContext);
return <h1 style={{ color: theme.color }} {...props}>{children}</h1>;
}
При таком подходе MDX позволяет динамически изменять стили всех элементов Markdown без необходимости правки каждой страницы.
Кроме глобальной замены через MDXProvider, можно
переопределять компоненты локально внутри MDX-файла,
используя экспорт components:
export const components = {
h2: ({ children }) => <h2 style={{ color: 'red' }}>{children}</h2>,
p: ({ children }) => <p className="custom-paragraph">{children}</p>,
};
При этом внутри MDX файла все заголовки h2 и параграфы
p будут использовать указанные компоненты, не затрагивая
глобальные настройки.
MDX передаёт все стандартные HTML-атрибуты компонентам. Это позволяет сохранять семантику и расширять функциональность:
const CustomImage = ({ src, alt, ...props }) => {
return <img src={src} alt={alt} style={{ borderRadius: '8px' }} {...props} />;
};
Таким образом, можно не только менять визуальный стиль, но и добавлять дополнительные свойства, например для аналитики или lazy loading.
Замена Markdown-элементов отлично сочетается с CSS-in-JS решениями, такими как styled-components или Emotion. Например:
import styled from '@emotion/styled';
const StyledParagraph = styled.p`
font-size: 18px;
line-height: 1.6;
`;
const components = {
p: StyledParagraph,
};
Это позволяет создавать единый стиль для всего контента MDX без дублирования CSS-классов.
Такой подход делает MDX мощным инструментом для создания документации, блогов и интерактивного контента, где Markdown остаётся удобным для написания текста, а React-компоненты обеспечивают современный визуальный и функциональный контроль.