MDX — это расширение Markdown, которое позволяет интегрировать JSX-компоненты прямо в Markdown-документы. Для сборки проектов с MDX часто используют esbuild из-за его высокой скорости и гибкой системы плагинов. Настройка esbuild для работы с MDX требует понимания нескольких ключевых аспектов: трансформации MDX в JSX, интеграции с React-компонентами и обработки зависимостей.
Для начала нужно установить основные зависимости:
npm install esbuild @mdx-js/esbuild @mdx-js/react react react-dom
esbuild — инструмент для быстрого бандлинга и
трансформации.@mdx-js/esbuild — плагин, который позволяет esbuild
обрабатывать .mdx файлы.@mdx-js/react — библиотека для рендеринга MDX с
React.Простейший пример сборки MDX с esbuild выглядит следующим образом:
const esbuild = require('esbuild');
const { mdx } = require('@mdx-js/esbuild');
esbuild.build({
entryPoints: ['src/index.mdx'],
bundle: true,
outfile: 'dist/bundle.js',
plugins: [mdx()],
loader: {
'.js': 'jsx',
'.mdx': 'jsx'
},
define: {
'process.env.NODE_ENV': '"production"'
},
minify: true,
sourcemap: true,
}).catch(() => process.exit(1));
Ключевые моменты:
plugins: [mdx()] подключает плагин MDX, который
конвертирует .mdx в JSX.loader указывает esbuild, как обрабатывать файлы с
конкретными расширениями.define позволяет задавать глобальные переменные
окружения на этапе сборки.bundle: true объединяет все зависимости в один
файл.MDX использует JSX для рендеринга компонентов внутри Markdown. В esbuild нужно убедиться, что:
jsxFactory: 'React.createElement',
jsxFragment: 'React.Fragment',
Эти опции гарантируют корректное преобразование JSX в JavaScript. Полная конфигурация может выглядеть так:
esbuild.build({
entryPoints: ['src/index.mdx'],
bundle: true,
outfile: 'dist/bundle.js',
plugins: [mdx()],
loader: {
'.js': 'jsx',
'.mdx': 'jsx'
},
define: { 'process.env.NODE_ENV': '"production"' },
jsxFactory: 'React.createElement',
jsxFragment: 'React.Fragment',
sourcemap: true
});
MDX-файлы могут импортировать и использовать React-компоненты напрямую:
import { Button } from './Button';
# Заголовок MDX
Для корректного рендеринга MDX в React необходимо использовать
компонент MDXProvider:
import React from 'react';
import ReactDOM from 'react-dom';
import { MDXProvider } from '@mdx-js/react';
import App from './App.mdx';
ReactDOM.render(
,
document.getElementById('root')
);
MDXProvider позволяет переопределять стандартные теги
Markdown (h1, p, a и т.д.) на
свои React-компоненты, создавая гибкую систему кастомизации.
Если в MDX используются изображения, CSS или другие ресурсы, их нужно
настроить через loader:
loader: {
'.js': 'jsx',
'.mdx': 'jsx',
'.png': 'file',
'.jpg': 'file',
'.css': 'css'
}
file — копирует файл в директорию сборки и возвращает
путь.css — позволяет импортировать CSS в JavaScript, если
подключен соответствующий плагин.Плагин MDX имеет несколько важных опций:
jsxImportSource — указывает, откуда брать JSX-фабрику
(обычно react).providerImportSource — определяет источник
MDXProvider.remarkPlugins и rehypePlugins — подключают
плагины для обработки Markdown и HTML.Пример использования плагинов:
const remarkGfm = require('remark-gfm');
esbuild.build({
entryPoints: ['src/index.mdx'],
bundle: true,
outfile: 'dist/bundle.js',
plugins: [mdx({ remarkPlugins: [remarkGfm] })],
});
remark-gfm добавляет поддержку расширений GitHub
Flavored Markdown, таких как таблицы и чекбоксы.
watch для быстрой пересборки при изменении файлов.sourcemap: true
облегчает отладку MDX-компонентов.Для проектов на TypeScript добавляют tsconfig.json и
используют загрузчик .ts и .tsx:
loader: {
'.ts': 'ts',
'.tsx': 'tsx',
'.mdx': 'jsx'
}
Важно: MDX-файлы всегда компилируются в JSX, поэтому
.mdx можно указывать как jsx для совместимости
с TypeScript и React.
src/components/ — React-компоненты.src/pages/ — MDX-файлы, представляющие страницы или
документацию.src/index.mdx — точка входа для сборки.dist/ — директория с собранными файлами.Эта структура облегчает поддержку MDX и масштабирование проекта.