Astro предоставляет мощные возможности для работы с контентом через
коллекции (content collections). В комбинации с
библиотеками Remark и Rehype можно
создавать гибкие пайплайны обработки Markdown и HTML, расширять
синтаксис, добавлять плагины и формировать готовый для фронтенда
контент.
Для интеграции Remark и Rehype в Astro необходимо установить соответствующие пакеты:
npm install remark remark-html rehype rehype-stringify
Remark служит для парсинга и трансформации Markdown в AST (Abstract Syntax Tree), а Rehype работает с HTML-деревьями, позволяя выполнять сложные трансформации и вставку элементов.
В конфигурационном файле Astro (astro.config.mjs)
подключение может выглядеть так:
import { defineConfig } from 'astro/config';
import remarkGfm from 'remark-gfm';
import rehypeSlug from 'rehype-slug';
export default defineConfig({
markdown: {
remarkPlugins: [remarkGfm],
rehypePlugins: [rehypeSlug],
},
});
Ключевые моменты:
remarkPlugins применяются на этапе обработки
Markdown.rehypePlugins применяются после конвертации Markdown в
HTML.Коллекции контента (content collections) позволяют
структурировать Markdown-файлы и использовать их в приложении как
объекты JavaScript.
Пример структуры коллекции:
src/content/posts/
├─ first-post.md
├─ second-post.md
В src/content/config.ts определяется коллекция:
import { defineCollection, z } from 'astro:content';
const blogCollection = defineCollection({
schema: z.object({
title: z.string(),
date: z.string(),
tags: z.array(z.string()).optional(),
}),
});
export const collections = {
'blog': blogCollection,
};
Markdown-файлы автоматически проходят через подключенные Remark и Rehype плагины при импорте в Astro.
Remark поддерживает расширения для синтаксиса Markdown, такие как таблицы, чекбоксы и математические выражения:
import remarkMath from 'remark-math';
import rehypeKatex from 'rehype-katex';
export default defineConfig({
markdown: {
remarkPlugins: [remarkGfm, remarkMath],
rehypePlugins: [rehypeSlug, rehypeKatex],
},
});
Особенности:
remark-math добавляет поддержку математических формул в
Markdown.rehype-katex рендерит формулы в HTML с использованием
KaTeX.Импорт коллекции и вывод постов с уже обработанным контентом:
---
import { getCollection } from 'astro:content';
const posts = await getCollection('blog');
---
<ul>
{posts.map(post => (
<li>
<h2>{post.data.title}</h2>
<time>{post.data.date}</time>
<div innerHTML={post.body}></div>
</li>
))}
</ul>
Ключевые моменты:
post.body содержит HTML-код, сгенерированный через
Remark → Rehype.innerHTML позволяет рендерить
весь HTML с кастомными элементами и плагинами.Remark и Rehype поддерживают создание собственных плагинов для специфической обработки контента.
Пример простого Remark-плагина для вставки кастомных блоков:
export default function remarkCustomBlocks() {
return (tree) => {
visit(tree, 'paragraph', (node) => {
if (node.children[0]?.value?.startsWith(':::note')) {
node.type = 'html';
node.value = `<div class="note">${node.children[0].value.slice(6)}</div>`;
}
});
};
}
visit — функция для обхода AST.:::note в
HTML-блок с классом note.SSG) в Astro.Обработанный контент можно передавать в компоненты Astro Islands:
<ContentBlock html={post.body} />
remark-gfm — расширенный синтаксис GitHub
Markdown.remark-math + rehype-katex —
математические формулы.rehype-slug — генерация id для заголовков.rehype-autolink-headings — добавление ссылок к
заголовкам.rehype-highlight — подсветка синтаксиса кода.Эти плагины позволяют создавать высоко структурированные контентные коллекции и гибко управлять преобразованием Markdown в готовый HTML.