MDX (Markdown + JSX) позволяет встраивать React-компоненты непосредственно в Markdown. Сгенерированный контент в MDX может содержать:
Для корректной работы приложения необходимо убедиться, что контент соответствует ожиданиям: компоненты правильно импортированы, структура документа валидна, нет потенциально опасного кода.
Синтаксические ошибки Markdown
Ошибки JSX
Безопасность контента
1. Статическая проверка структуры MDX
Использование библиотек типа remark и
rehype для разбора Markdown и JSX позволяет анализировать
AST (Abstract Syntax Tree) документа. Основные шаги:
Парсинг документа через remark-parse и
remark-mdx
Прогон AST через кастомные плагины для проверки структуры:
2. Валидация JSX-компонентов
Проверка компонентов включает:
Пример использования TypeScript для валидации:
import { MDXProvider } from '@mdx-js/react';
import MyComponent from './MyComponent';
interface Props {
content: string;
}
const components = { MyComponent };
function RenderMDX({ content }: Props) {
return <MDXProvider components={components}>{content}</MDXProvider>;
}
В этом примере, если content содержит несуществующий
компонент, TypeScript или линтер выявит ошибку.
3. Проверка данных FrontMatter
FrontMatter часто используется для хранения метаданных, например:
---
title: "Пример статьи"
date: "2026-03-23"
tags: ["MDX", "Validation"]
---
Валидация включает:
title,
date)date-fnsПример кода:
import matter from 'gray-matter';
const file = matter(mdxContent);
if (!file.data.title) throw new Error('Отсутствует заголовок');
if (!/^\d{4}-\d{2}-\d{2}$/.test(file.data.date)) throw new Error('Неверный формат даты');
4. Динамическая валидация при рендеринге
Некоторые проверки невозможно выполнить статически, например проверка того, что переданный пропс содержит корректный URL. Для этого можно использовать:
useEffect) для проверки значений
пропсовfunction SafeImage({ src, alt }: { src: string; alt: string }) {
if (!/^https?:\/\//.test(src)) {
console.error('Недопустимый URL изображения:', src);
return null;
}
return <img src={src} alt={alt} />;
}
5. Интеграция с линтерами и сборщиками
eslint-plugin-mdx помогает проверять
синтаксис JSX в MDXzod
или yupВ результате внедрение этих практик позволяет строить надёжную систему генерации и рендеринга MDX-контента, минимизируя ошибки и обеспечивая безопасность приложений.