RSS и sitemap генерация

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';

Преобразование Markdown в HTML

Основной шаг перед генерацией RSS или sitemap — конвертация Markdown-контента в HTML.

const markdownToHtml = async (markdownContent) => {
  const file = await unified()
    .use(remarkParse)
    .use(remarkHtml)
    .process(markdownContent);

  return String(file);
};

Ключевой момент — использование unified() как ядра, к которому подключаются парсеры и плагины.


Создание RSS-ленты

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-парсером.
  • Даты обязательно форматируются в UTC для совместимости с RSS-читалками.
  • Каждый пост представляется отдельным <item>.

Генерация Sitemap

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());
};

Ключевые моменты:

  • Формат даты ISO 8601 (toISOString) обязателен для корректной работы поисковых систем.
  • changefreq и priority помогают поисковикам оптимизировать сканирование сайта.
  • Sitemap может быть динамически обновляемым при добавлении новых публикаций.

Интеграция Remark/Rehype в генерацию RSS

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);

Расширенные возможности

  1. Плагины для обработки ссылок и изображений Remark поддерживает плагины для автоматической трансформации ссылок, вставки атрибутов, оптимизации изображений.

  2. SEO-оптимизация RSS Можно включать <content:encoded> для полного HTML-контента, что увеличивает читаемость в RSS-ридерах.

  3. Локализация Генерация RSS и sitemap может учитывать языковые версии сайта, создавая отдельные <item> и <url> для каждой локализации.

  4. Автоматическая инкрементация lastmod При генерации sitemap рекомендуется использовать Git-коммиты или дату модификации файла Markdown для точного отображения изменений.


Remark и Rehype создают удобную и расширяемую платформу для генерации RSS и sitemap на основе Markdown-контента. Такой подход позволяет автоматизировать публикации, обеспечивать актуальность данных для поисковых систем и RSS-читалок, а также интегрировать дополнительные трансформации контента в единый конвейер обработки.