MDX-js
MDX-js (часто сокращённо MDX) — это формат файлов и инструмент для разработки веб-интерфейсов, который позволяет использовать синтаксис JSX (JavaScript XML) внутри документов, написанных на языке разметки Markdown. MDX объединяет возможности простого форматирования текста, присущие Markdown, с возможностью встраивать интерактивные компоненты, написанные на фреймворках вроде React, Vue или Svelte. Файлы MDX имеют расширение .mdx и обрабатываются компилятором, который преобразует их в JavaScript-модули, готовые к рендерингу в браузере или на сервере.
История
Формат MDX был создан разработчиком Джоном Отгеем (John Otander) и впервые опубликован в 2018 году. Изначально проект развивался как расширение для экосистемы React, позволяющее писать документацию и блоги с использованием компонентов. Первая стабильная версия, MDX 1.0, вышла в 2019 году. Она базировалась на компиляторе, который преобразовывал Markdown в JSX, а затем — в обычный JavaScript.
В 2021 году была выпущена версия MDX 2.0, которая стала значительным обновлением. В ней была переработана архитектура парсера, улучшена поддержка синтаксиса, добавлена возможность экспорта данных из файлов MDX и введена поддержка пользовательских типов узлов абстрактного синтаксического дерева (AST). MDX 2.0 стал более независимым от конкретного фреймворка, что позволило использовать его не только с React, но и с другими библиотеками.
В 2023 году вышла версия MDX 3.0, которая интегрировалась с новым форматом ESModule, улучшила обработку ошибок и добавила поддержку импорта компонентов из сторонних пакетов без необходимости их предварительной регистрации. Проект развивается как открытое программное обеспечение (Open Source) и поддерживается сообществом разработчиков.
Принцип работы
Компиляция
Процесс обработки файла .mdx состоит из нескольких этапов:
- Парсинг Markdown: Исходный текст разбивается на абстрактное синтаксическое дерево (AST) с использованием парсера, совместимого со спецификацией CommonMark. На этом этапе определяется структура документа: заголовки, абзацы, списки, ссылки, изображения и т.д.
- Обработка JSX: Парсер распознаёт встроенные конструкции JSX (например,
<Button>Нажми меня</Button>) и выделяет их в отдельные узлы AST. При этом синтаксис Markdown и JSX может смешиваться в одном файле. - Преобразование в JavaScript: Полученное AST транслируется в JavaScript-код. В результате получается функция, которая возвращает виртуальное DOM-дерево (Virtual DOM) или строку HTML. Этот код может быть импортирован как обычный модуль в приложении на React, Next.js, Gatsby или другом фреймворке.
Синтаксис
MDX наследует весь синтаксис Markdown: заголовки (#, ##), списки, таблицы, ссылки, изображения, встроенный код и блоки кода. Дополнительно поддерживаются следующие конструкции:
- Импорт компонентов: В начале файла можно импортировать JavaScript-модули, включая React-компоненты, используя синтаксис
import:
``javascript import Button from '../components/Button.jsx' ``
- Использование JSX: Импортированные компоненты могут быть вставлены непосредственно в текст Markdown:
```mdx Нажмите на кнопку ниже, чтобы отправить форму:
<Button variant="primary" onClick={handleClick}>Отправить</Button> ```
- Экспорт данных: Файл MDX может экспортировать переменные, функции или объекты, которые могут быть использованы в других модулях:
``javascript export const title = 'Заголовок статьи' export const metadata = { author: 'Иван', date: '2024-01-01' } ``
- Выражения JavaScript: Внутри JSX-блоков можно использовать фигурные скобки для вставки JavaScript-выражений:
``mdx <div>Сегодня: {new Date().toLocaleDateString('ru-RU')}</div> ``
Применение
Документация
MDX широко используется для написания технической документации и руководств пользователя. Платформы вроде Docusaurus, Storybook и VitePress поддерживают MDX «из коробки». Разработчики могут встраивать в документацию интерактивные примеры кода, демонстрации компонентов, формы обратной связи и динамические графики, не покидая среды Markdown.
Блоги и сайты
Генераторы статических сайтов, такие как Next.js, Gatsby и Astro, позволяют создавать блоги, где каждая статья является файлом .mdx. Это даёт возможность авторам писать контент в простом Markdown, а разработчикам — добавлять на страницы кастомные интерактивные элементы: слайдеры, карты, калькуляторы, встроенные видео-плееры.
Образовательные платформы
В образовательных курсах и интерактивных учебниках MDX позволяет создавать упражнения с проверкой кода в реальном времени. Например, можно встроить редактор кода, который принимает ввод пользователя и выводит результат, или динамически изменять содержимое страницы в зависимости от ответов на вопросы.
Инструменты и экосистема
Пакеты
@mdx-js/mdx— основной компилятор, который преобразует MDX в JavaScript.@mdx-js/react— интеграция с библиотекой React, предоставляющая компонентMDXProviderдля настройки рендеринга элементов Markdown.@mdx-js/loader— загрузчик для Webpack, позволяющий импортировать MDX-файлы напрямую в JavaScript-код.@mdx-js/node-loader— загрузчик для Node.js, позволяющий запускать MDX-файлы на сервере.
Интеграция с фреймворками
- Next.js: Поддерживает MDX через плагин
@next/mdx. Статьи могут быть размещены в папкеpagesили импортированы в компоненты. - Gatsby: Имеет плагин
gatsby-plugin-mdx, который обрабатывает MDX-файлы и создаёт из них страницы. - Astro: Нативно поддерживает MDX, позволяя использовать компоненты из любых фреймворков (React, Vue, Svelte) внутри Markdown-контента.
- VitePress: Использует MDX для создания документации, поддерживая встраивание Vue-компонентов.
Преимущества и недостатки
Преимущества
- Гибкость: Позволяет сочетать простой текст с мощными интерактивными элементами.
- Удобство для авторов: Авторы контента могут писать в привычном Markdown, не изучая JavaScript.
- Модульность: Компоненты могут быть переиспользованы в разных файлах MDX.
- Совместимость: Работает с большинством современных фреймворков и сборщиков.
Недостатки
- Сложность отладки: Ошибки в JSX-коде внутри MDX могут быть трудны для диагностики, так как компилятор генерирует промежуточный код.
- Зависимость от сборки: Для использования MDX требуется этап сборки (компиляции), что может замедлить разработку простых статических сайтов.
- Ограничения безопасности: Встраивание произвольного JavaScript-кода через MDX может представлять угрозу XSS (межсайтовый скриптинг), если не настроена санитизация ввода.
Сравнение с альтернативами
- Markdown: Обычный Markdown не поддерживает встраивание интерактивных компонентов. Для добавления динамики требуется отдельный JavaScript-файл.
- JSX: Чистый JSX не имеет синтаксиса Markdown для форматирования текста (заголовки, списки), что делает его менее удобным для написания длинных текстов.
- HTML: HTML-шаблоны громоздки для написания контента, и в них сложнее поддерживать читаемость исходного кода.
- MDX занимает промежуточное положение, предоставляя лучшие черты обоих миров.
Интересные факты
- MDX не является языком разметки в строгом смысле, а скорее форматом данных, который компилируется в JavaScript.
- Проект MDX изначально назывался «MDX» как сокращение от «Markdown + JSX».
- В MDX 2.0 была введена возможность экспорта данных, что позволило использовать MDX-файлы как источник метаданных (например, для конфигурации сайта).
- Некоторые платформы, такие как CodeSandbox и StackBlitz, используют MDX для создания интерактивных примеров кода в документации.
Источники
- Официальная документация MDX (mdxjs.com)
- Репозиторий проекта на GitHub (mdx-js/mdx)
- Статья «Introducing MDX» в блоге компании Gatsby (2018)
- Документация Next.js по работе с MDX
- Документация VitePress по работе с MDX
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →