Astro позволяет использовать MDX для создания контента с возможностью вставки React-компонентов, что открывает новые возможности для построения динамических и интерактивных страниц. MDX сочетает преимущества Markdown и JSX, позволяя писать контент в привычной разметке Markdown и одновременно вставлять компоненты как в React.
Для работы с MDX в Astro необходимо установить соответствующий интеграционный пакет:
npm install @astrojs/mdx
После установки требуется добавить интеграцию в
astro.config.mjs:
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
export default defineConfig({
integrations: [mdx()],
});
Поддержка MDX включает файлы с расширением .mdx. Astro
автоматически обрабатывает такие файлы как страницы или компоненты в
зависимости от расположения в проекте.
MDX-файл начинается с фронтматтер-объекта YAML, который используется для метаданных страницы:
---
title: "Пример использования MDX"
date: "2026-03-23"
---
# Заголовок страницы
Это **текст** с разметкой Markdown.
<Alert type="warning">
Это компонент React внутри MDX.
</Alert>
--- обозначает фронтматтер, который может содержать
произвольные ключи.Любой React-компонент можно импортировать в MDX и использовать как обычный JSX:
import Button from '../components/Button.jsx';
<Button text="Нажми меня" onCl ick={() => alert('Привет!')} />
Компоненты могут принимать любые props, управлять состоянием, обрабатывать события. MDX позволяет легко комбинировать статический контент с динамическими элементами.
Astro поддерживает частичную гидратацию (Partial Hydration), что позволяет загружать только необходимые компоненты на клиенте. Для MDX это особенно полезно:
<Button client:load text="Кнопка с загрузкой на клиенте" />
<Button client:visible text="Загружается при видимости" />
<Button client:idle text="Загружается в простое" />
client:load – компонент загружается сразу после
загрузки страницы.client:visible – загружается, когда компонент виден
пользователю.client:idle – загружается, когда браузер не занят
другими задачами.MDX-файлы могут использоваться как страницы или как контентные блоки для других компонентов:
import MyPost from '../content/post.mdx';
<MyPost />
Структура проекта обычно организуется следующим образом:
src/
├─ pages/
│ └─ index.mdx
├─ components/
│ └─ Button.jsx
└─ content/
└─ post.mdx
Такой подход обеспечивает удобное разделение контента и логики приложения.
Astro автоматически предоставляет данные фронтматтера как объект props в MDX:
---
title: "Фронтматтер пример"
---
<h1>{frontmatter.title}</h1>
Можно использовать любые поля фронтматтера для динамического построения контента, генерации метаданных или SEO-тегов.
mdx pragma – для
продвинутых случаев можно импортировать функции MDX напрямую для
программного создания контента.MDX в связке с Astro обеспечивает гибкую и масштабируемую архитектуру для построения контента, сочетающего статическую разметку и динамическую функциональность компонентов.