Remark и Rehype — это мощные инструменты для обработки Markdown и HTML в экосистеме JavaScript. Remark занимается синтаксическим разбором Markdown в AST (Abstract Syntax Tree), а Rehype — HTML. Использование этих библиотек позволяет создавать эффективные конвейеры для генерации RSS-лент и sitemap на основе контента сайта.
Для работы с Remark и Rehype необходимы соответствующие пакеты:
npm install remark remark-html rehype rehype-stringify unified
remark — основной парсер Markdown.remark-html — плагин для преобразования Markdown в
HTML.rehype — парсер и трансформер HTML.rehype-stringify — превращает AST HTML обратно в
строку.unified — ядро для построения конвейеров
обработки.После установки создаётся единая цепочка обработки:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkHtml from 'remark-html';
import rehypeParse from 'rehype-parse';
import rehypeStringify from 'rehype-stringify';
Основной шаг перед генерацией RSS или sitemap — конвертация Markdown-контента в HTML.
const markdownToHtml = async (markdownContent) => {
const file = await unified()
.use(remarkParse)
.use(remarkHtml)
.process(markdownContent);
return String(file);
};
Ключевой момент — использование unified() как ядра, к
которому подключаются парсеры и плагины.
RSS — XML-файл, содержащий список публикаций сайта. Структура RSS
требует <channel> и <item> для
каждой публикации.
Пример генерации:
import fs from 'fs';
import path from 'path';
const generateRSS = (posts) => {
const items = posts.map(post => `
<item>
<title>${post.title}</title>
<link>${post.url}</link>
<description><![CDATA[${post.content}]]></description>
<pubDate>${new Date(post.date).toUTCString()}</pubDate>
</item>
`).join('\n');
const rss = `
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>My Blog</title>
<link>https://example.com/</link>
<description>Последние публикации</description>
${items}
</channel>
</rss>
`;
fs.writeFileSync(path.join(process.cwd(), 'public/rss.xml'), rss.trim());
};
Особенности:
CDATA блоки защищают HTML-контент от разборки
XML-парсером.<item>.Sitemap — XML-файл для поисковых систем, содержащий URL страниц сайта и дополнительную метаинформацию (частота обновления, приоритет).
const generateSitemap = (posts) => {
const urls = posts.map(post => `
<url>
<loc>${post.url}</loc>
<lastmod>${new Date(post.date).toISOString()}</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
`).join('\n');
const sitemap = `
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
${urls}
</urlset>
`;
fs.writeFileSync(path.join(process.cwd(), 'public/sitemap.xml'), sitemap.trim());
};
Ключевые моменты:
toISOString) обязателен для
корректной работы поисковых систем.changefreq и priority помогают поисковикам
оптимизировать сканирование сайта.Markdown-контент, преобразованный с помощью Remark в HTML, удобно
вставлять в <description> RSS. Пример интеграции:
const postsMarkdown = [
{ title: 'Первый пост', url: '/post-1', content: '# Заголовок\nТекст поста', date: '2026-03-22' },
{ title: 'Второй пост', url: '/post-2', content: '## Подзаголовок\nЕще текст', date: '2026-03-20' }
];
const posts = await Promise.all(postsMarkdown.map(async post => ({
...post,
content: await markdownToHtml(post.content)
})));
generateRSS(posts);
generateSitemap(posts);
Плагины для обработки ссылок и изображений Remark поддерживает плагины для автоматической трансформации ссылок, вставки атрибутов, оптимизации изображений.
SEO-оптимизация RSS Можно включать
<content:encoded> для полного HTML-контента, что
увеличивает читаемость в RSS-ридерах.
Локализация Генерация RSS и sitemap может
учитывать языковые версии сайта, создавая отдельные
<item> и <url> для каждой
локализации.
Автоматическая инкрементация
lastmod При генерации sitemap рекомендуется
использовать Git-коммиты или дату модификации файла Markdown для точного
отображения изменений.
Remark и Rehype создают удобную и расширяемую платформу для генерации RSS и sitemap на основе Markdown-контента. Такой подход позволяет автоматизировать публикации, обеспечивать актуальность данных для поисковых систем и RSS-читалок, а также интегрировать дополнительные трансформации контента в единый конвейер обработки.