Препроцессинг в контексте MDX — это этап подготовки исходных файлов с разметкой и кодом перед их компиляцией в React-компоненты. Он позволяет интегрировать JavaScript-логику и специальные трансформации текста, обеспечивая гибкость и расширяемость MDX-проекта.
MDX сочетает Markdown и JSX, что создаёт необходимость обрабатывать два разных типа синтаксиса одновременно. Препроцессинг выполняет следующие функции:
Для выполнения этих задач чаще всего используют remark (Markdown-парсер) и rehype (HTML-парсер), которые интегрируются с MDX через плагины.
Remark работает на уровне Markdown AST. Основные возможности:
Пример подключения плагина remark:
import { defineMdxComponents } from '@mdx-js/react';
import remarkGfm from 'remark-gfm';
import { MDXProvider } from '@mdx-js/react';
const components = defineMdxComponents({
h1: (props) => <h1 style={{ color: 'blue' }} {...props} />,
});
export default function MdxWrapper({ children }) {
return (
<MDXProvider components={components}>
{children}
</MDXProvider>
);
}
// В конфигурации MDX:
{
remarkPlugins: [remarkGfm],
}
Rehype выполняет обработку HTML-подобного AST. Основные задачи:
Пример Rehype-плагина:
import rehypeSlug from 'rehype-slug';
import rehypeAutolinkHeadings from 'rehype-autolink-headings';
{
rehypePlugins: [
rehypeSlug,
[rehypeAutolinkHeadings, { beh * avior: 'wrap' }]
]
}
После препроцессинга MDX-файл превращается в валидный React-компонент. Этот процесс состоит из нескольких шагов:
Для настройки этого процесса используются функции
compile или compileSync из
@mdx-js/mdx:
import { compile } from '@mdx-js/mdx';
const mdxSource = `
# Пример
<MyComponent />
`;
const compiled = await compile(mdxSource, {
remarkPlugins: [remarkGfm],
rehypePlugins: [rehypeSlug]
});
Результат compiled можно интегрировать в проект на React
через MDXProvider или динамический рендер.
MDX позволяет создавать собственные плагины для препроцессинга:
Пример пользовательского Remark-плагина для замены ключевых слов:
import { visit } from 'unist-util-visit';
function remarkReplaceWord(word, replacement) {
return (tree) => {
visit(tree, 'text', (node) => {
node.value = node.value.replace(new RegExp(word, 'g'), replacement);
});
};
}
// Использование
remarkPlugins: [remarkReplaceWord('MDX', 'MDX.js')]
MDX полностью поддерживает TypeScript, но для корректной работы необходимо:
Пример настройки:
import { compile } from '@mdx-js/mdx';
import remarkGfm from 'remark-gfm';
const compiled = await compile(`
# Заголовок
<MyTSComponent someProp={42} />
`, {
remarkPlugins: [remarkGfm],
providerImportSource: '@mdx-js/react'
});
MDX может быть интегрирован в проекты с Webpack, Vite, Next.js. Препроцессинг позволяет:
Пример конфигурации для Next.js:
// next.config.js
const withMDX = require('@next/mdx')({
extension: /\.mdx?$/,
options: {
remarkPlugins: [require('remark-gfm')],
rehypePlugins: [require('rehype-slug')]
}
});
module.exports = withMDX({
pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'md', 'mdx']
});
Препроцессинг в MDX открывает широкие возможности для кастомизации, интеграции с современными фронтенд-стеками и создания динамических, интерактивных документаций. Он является ключевым этапом, обеспечивающим гибкость и масштабируемость MDX-проектов.