MDX сочетает возможности Markdown и JSX, позволяя использовать React-компоненты внутри Markdown-документации. Важнейшей концепцией является приоритет компонентов и их переопределение, что обеспечивает гибкость и контроль над визуальным отображением контента.
В MDX каждый элемент Markdown может быть представлен соответствующим React-компонентом. Например:
# Заголовок первого уровня
По умолчанию рендерится как в HTML. MDX
использует систему приоритетов, где пользовательские
компоненты имеют возможность переопределять стандартные элементы
Markdown.
Порядок приоритета рендеринга:
components при импорте MDX.MDXProvider в React.h1, p, ul и
т.д.).Это значит, что любой компонент, переданный через
components при рендеринге MDX-файла, имеет
наивысший приоритет и заменяет дефолтный рендерер.
MDXProvider для глобальных
переопределенийMDXProvider позволяет определять глобальные
переопределения компонентов, которые применяются ко всем
MDX-документам в приложении.
Пример:
import { MDXProvider } from '@mdx-js/react';
const components = {
h1: (props) => ,
p: (props) =>
};
function App() {
return (
);
}
В этом примере все заголовки в MDX-документах
будут красного цвета, а параграфы получат класс
custom-paragraph. Если в конкретном MDX-файле передан
локальный компонент h1, он перекроет глобальное
переопределение.
MDX позволяет передавать переопределения напрямую при рендеринге конкретного документа:
import Content from './Content.mdx';
const localComponents = {
h1: (props) =>
};
function Page() {
return ;
}
Здесь для данного MDX-файла заголовки будут
отображаться с увеличенным размером шрифта, не затрагивая другие
MDX-документы, использующие глобальные переопределения через
MDXProvider.
MDX предоставляет возможность заменять любой Markdown-тег на кастомный компонент. Часто переопределяются следующие элементы:
h1–h6)p)ul, ol, li)a)img)pre, code)Пример замены параграфа на компонент с анимацией:
const AnimatedParagraph = ({ children }) => (
{children}
);
const components = { p: AnimatedParagraph };
После этого все абзацы в MDX-документе будут рендериться через
AnimatedParagraph.
При работе с MDX важно учитывать вложенные компоненты:
использует внутри себя
для текста, локальные переопределения
абзацев будут применены внутри ,
если компонент рендерится через MDX-контекст. импортируется как обычный
React-компонент и рендерится вне MDX, глобальные переопределения
не применяются автоматически, требуется передача
components вручную.MDX поддерживает композицию переопределений:
const globalComponents = { p: GlobalParagraph };
const localComponents = { h1: LocalHeading };
В этом случае:
→ используется локальный
LocalHeading → используется глобальный
GlobalParagraphТакой подход обеспечивает максимальную гибкость и контроль над стилями и функциональностью компонентов.
MDXProvider, если требуется единый стиль для всех
документов.MDXProvider, что упрощает поддержку и масштабирование
документации.MDXProvider.h1–h6, p, ul и
т.д.).const components = {
p: (props) => (props.warning ? : )
};
Это позволяет реализовать умные и контекстно-зависимые переопределения.