В контексте MDX метаданные представляют собой
структурированную информацию, описывающую содержимое документа. Обычно
они задаются в формате YAML или JSON в верхней части MDX-файла, внутри
блока export const или frontmatter. Метаданные
используются для организации документации, управления контентом и
интеграции с системами рендеринга. Валидация метаданных необходима для
обеспечения корректной работы приложения, предотвращения ошибок при
рендеринге и поддержания консистентности данных.
Метаданные в MDX могут включать такие поля, как:
export const meta = {
title: "Пример документа",
description: "Краткое описание документа",
date: "2026-03-23",
tags: ["javascript", "mdx", "tutorial"],
author: "Иван Иванов",
};
Ключевые моменты структуры:
YYYY-MM-DD), обязательна для хронологической
сортировки.Валидация метаданных решает следующие задачи:
В JavaScript-экосистеме применяются несколько подходов к проверке метаданных MDX:
function validateMeta(meta) {
if (!meta.title || typeof meta.title !== "string") {
throw new Error("Поле title обязательно и должно быть строкой");
}
if (!meta.date || !/^\d{4}-\d{2}-\d{2}$/.test(meta.date)) {
throw new Error("Поле date обязательно и должно быть в формате YYYY-MM-DD");
}
if (meta.tags && !Array.isArray(meta.tags)) {
throw new Error("Поле tags должно быть массивом строк");
}
}
zod, yup или joi позволяют
описывать схему метаданных и автоматически проверять данные при импорте
MDX.Пример с zod:
import { z } from "zod";
const MetaSchema = z.object({
title: z.string(),
description: z.string().optional(),
date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/),
tags: z.array(z.string()).optional(),
author: z.string().optional(),
});
function validateMeta(meta) {
MetaSchema.parse(meta); // выбросит ошибку при несоответствии
}
При использовании инструментов сборки типа Next.js, Gatsby или VitePress, валидация метаданных может выполняться автоматически при импорте MDX-файлов:
import fs from "fs";
import path from "path";
import { MetaSchema } from "./metaSchema";
import matter from "gray-matter";
const mdxDir = path.join(process.cwd(), "content");
const files = fs.readdirSync(mdxDir);
files.forEach((file) => {
const source = fs.readFileSync(path.join(mdxDir, file), "utf8");
const { data } = matter(source);
MetaSchema.parse(data);
});
В этом примере:
tags может быть
обязательным, если документ помечен как “учебный материал”. В
zod это реализуется через refine:const MetaSchema = z.object({
title: z.string(),
type: z.enum(["tutorial", "reference"]),
tags: z.array(z.string()).optional(),
}).refine((data) => data.type === "tutorial" ? data.tags?.length > 0 : true, {
message: "Документы типа tutorial должны содержать хотя бы один тег",
});
date-fns:import { parseISO, isValid } from "date-fns";
function validateDate(date) {
const parsed = parseISO(date);
if (!isValid(parsed)) {
throw new Error("Некорректная дата");
}
}
const defaultMeta = {
description: "Описание отсутствует",
tags: [],
author: "Неизвестен",
};
function applyDefaults(meta) {
return { ...defaultMeta, ...meta };
}
zod, yup,
joi) повышает читаемость кода и упрощает поддержку.В результате внедрения валидации метаданных обеспечивается консистентность контента, предотвращаются ошибки при рендеринге MDX-документов и упрощается масштабирование документации.