MDX (Markdown + JSX) предоставляет возможность использовать JSX внутри Markdown-файлов, что позволяет создавать интерактивные и динамичные компоненты в документации или на веб-страницах. Для быстрой интеграции без сборки проекта можно использовать CDN-подключение.
Основные шаги подключения через CDN:
<!-- Подключение React и ReactDOM -->
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<!-- Подключение MDX через CDN -->
<script src="https://unpkg.com/@mdx-js/mdx@2.4.0/dist/mdx.umd.js"></script>
react.development.js и
react-dom.development.js обеспечивают базовую работу
React-компонентов.mdx.umd.js содержит библиотеку MDX в универсальном
формате (UMD), подходящем для прямого использования в браузере без
сборки.Для рендеринга MDX-контента необходимо использовать функцию
MDX.compile или MDX.createElement. В
CDN-версии доступна глобальная переменная MDX, которая
предоставляет следующие методы:
MDX.compile(source: string): компилирует MDX-текст в
функцию JavaScript.MDX.createElement(type, props, ...children): создает
React-элемент из JSX-кода внутри MDX.Пример компиляции и рендеринга MDX:
<div id="root"></div>
<script>
const mdxSource = `
# Заголовок уровня 1
Это текст с **жирным выделением** и JSX-компонентом:
<MyButton label="Нажми меня" />
`;
// Определение простого React-компонента
function MyButton({ label }) {
return React.createElement('button', { onClick: () => alert('Клик!') }, label);
}
// Компиляция MDX в React-функцию
const compiledMDX = MDX.compile(mdxSource);
// Создание React-элемента из скомпилированного MDX
const MDXContent = compiledMDX.default;
ReactDOM.createRoot(document.getElementById('root')).render(
React.createElement(MDXContent, { components: { MyButton } })
);
</script>
MDX позволяет переопределять стандартные HTML-элементы или добавлять
свои React-компоненты через объект components. Этот объект
передается как проп components при рендеринге.
const components = {
h1: (props) => React.createElement('h1', { style: { color: 'blue' }, ...props }),
MyButton: MyButton
};
ReactDOM.createRoot(document.getElementById('root')).render(
React.createElement(MDXContent, { components })
);
components соответствует
элементу MDX.MDX-контент можно хранить в виде внешних файлов .mdx и
загружать их через fetch. После получения текста его можно
компилировать и рендерить.
fetch('content.mdx')
.then(res => res.text())
.then(source => {
const compiled = MDX.compile(source);
const MDXContent = compiled.default;
ReactDOM.createRoot(document.getElementById('root')).render(
React.createElement(MDXContent, { components: { MyButton } })
);
});
MDX не сможет корректно создавать
компоненты.Для централизованного управления компонентами удобно использовать
MDXProvider, который в CDN-версии доступен через
MDX.MDXProvider.
const { MDXProvider } = MDX;
ReactDOM.createRoot(document.getElementById('root')).render(
React.createElement(MDXProvider, { components }, React.createElement(MDXContent))
);
MDXProvider позволяет задавать компоненты один раз для
всего дерева MDX, что упрощает стилизацию и управление элементами.CDN-конфигурация MDX обеспечивает быстрый старт без сборки, позволяет
использовать динамический контент, подключать собственные компоненты и
управлять рендерингом через MDX.createElement и
MDXProvider. Такой подход особенно полезен для прототипов,
образовательных проектов и веб-страниц с интерактивной
документацией.