MDX (Markdown + JSX) обеспечивает возможность встраивания JSX-компонентов прямо в Markdown-документы. При этом ключевым аспектом является совместимость с различными версиями React, поскольку MDX работает как мост между Markdown и компонентной архитектурой React.
MDX версии 2 и выше ориентирован на использование React 17 и новее. Для корректной работы необходимо учитывать следующие моменты:
JSX-трансформация MDX использует стандартную
JSX-трансформацию, которая в React 17 и выше поддерживает новый
синтаксис JSX без необходимости импорта React в каждом
файле. При работе с React 16 требуется явный импорт
React:
import React from 'react';
import { MDXProvider } from '@mdx-js/react';
const components = {
h1: (props) => <h1 style={{ color: 'blue' }} {...props} />
};
В React 17+ импорт React не обязателен, но может быть
оставлен для совместимости с инструментами сборки.
Поддержка хуков MDX позволяет использовать React-компоненты, что подразумевает поддержку хуков. Минимальная версия React должна быть 16.8, так как именно с неё появились функциональные компоненты с хуками.
Context API MDX использует
MDXProvider, который работает через Context API React. Все
версии React начиная с 16.3 поддерживают Context API. Однако для
оптимальной интеграции рекомендуется React 17+, чтобы избежать проблем с
несовместимостью при SSR (Server-Side Rendering) и новых функциях
Suspense.
React 16.x
React.createRoot в React 18.MDXProvider корректно, но некоторые стили
и контексты могут потребовать дополнительных обёрток.React 17.x
React в каждом файле.peerDependencies.React 18.x и выше
createRoot,
автоматический batching, улучшенный SSR.@mdx-js/react для корректной интеграции с
React 18.При использовании серверного рендеринга MDX-документов необходимо учитывать версию React:
React 16/17: Используется
ReactDOM.render. Гидратация возможна через
ReactDOM.hydrate, но требуется ручная настройка контекстов
и обработка сторонних компонентов, которые используют хуки.
React 18: Применяется
ReactDOM.createRoot и метод hydrateRoot для
гидратации. MDX-проекты автоматически получают преимущества concurrent
mode и оптимизированной гидратации.
Пример гидратации MDX с React 18:
import React from 'react';
import { createRoot } from 'react-dom/client';
import { MDXProvider } from '@mdx-js/react';
import App from './App';
const container = document.getElementById('root');
const root = createRoot(container);
root.render(
<MDXProvider components={{}}>
<App />
</MDXProvider>
);
MDX с TypeScript зависит от версии React для корректной типизации JSX.
React 16.x: Требуется @types/react@16.
MDX-компоненты нужно типизировать вручную или использовать
ComponentType для динамических импортов.
React 17/18: Используется современная типизация JSX без дополнительных корректировок. MDXProvider корректно типизируется через дженерики:
import { MDXProvider, MDXProviderComponents } from '@mdx-js/react';
const components: MDXProviderComponents = {
h1: (props) => <h1 {...props} />
};
При интеграции MDX в проект важно проверять
peerDependencies пакетов:
@mdx-js/react указывает минимальную версию React в
peerDependencies. Несоответствие версий вызывает
предупреждения и ошибки сборки.Этот подход обеспечивает надёжную интеграцию MDX в проекты с разными версиями React, позволяя использовать современные возможности экосистемы без потери обратной совместимости.