TS
#astro#typescript#rss#feed#content-collections#seo

Astro: генерация RSS-ленты (пример функции/эндпоинта)

Генерация RSS-ленты из Content Collections в Astro через эндпоинт или статическую генерацию.

Как использовать

  1. Скопируйте нужный фрагмент кода.
  2. Вставьте в свой проект и при необходимости измените под задачу.
  3. Проверьте зависимости и окружение (версии, переменные).

Генерация RSS-ленты из Content Collections (блог) в Astro. Используйте для автоматической генерации фида при билде или через эндпоинт.

// src/pages/rss.xml.ts
import { getCollection } from 'astro:content';
import rss from '@astrojs/rss';
import { SITE } from '@config/site.config';

export async function GET(context: any) {
  const posts = (await getCollection('blog'))
    .filter(post => !post.data.draft)
    .sort((a, b) => 
      b.data.pubDate.valueOf() - a.data.pubDate.valueOf()
    )
    .slice(0, 20); // Последние 20 постов

  return rss({
    title: SITE.title,
    description: SITE.description,
    site: context.site || SITE.domain,
    items: posts.map(post => ({
      title: post.data.title,
      description: post.data.description || '',
      pubDate: post.data.pubDate,
      link: `/blog/${post.slug}/`,
      content: post.body, // Если нужно полное содержимое
    })),
    customData: `<language>ru</language>`,
    stylesheet: '/rss-styles.xsl', // Опционально
  });
}

Альтернатива: статическая генерация через скрипт билда:

// scripts/generate-rss.mjs
import { getCollection } from 'astro:content';
import { writeFile } from 'fs/promises';
import rss from '@astrojs/rss';

async function generateRSS() {
  const posts = (await getCollection('blog'))
    .filter(p => !p.data.draft)
    .sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf());

  const feed = rss({
    title: 'My Blog',
    description: 'Blog RSS Feed',
    site: 'https://example.com',
    items: posts.map(post => ({
      title: post.data.title,
      description: post.data.description || '',
      pubDate: post.data.pubDate,
      link: `/blog/${post.slug}/`,
    })),
  });

  await writeFile('./public/rss.xml', feed);
}

generateRSS();

Подключение в проекте:

  1. Установите пакет: npm install @astrojs/rss
  2. Создайте файл src/pages/rss.xml.ts (для динамической генерации)
  3. Или добавьте скрипт в package.json: "generate-rss": "node scripts/generate-rss.mjs"

Usage:

После билда RSS будет доступен по /rss.xml. Добавьте ссылку в <head>: <link rel="alternate" type="application/rss+xml" href="/rss.xml" />.

Notes:

⚠️ Функция rss() возвращает строку XML, не промис. Для получения HTML контента используйте post.render(). context.site берётся из astro.config.mjs (параметр site). Для статической генерации используйте скрипт в package.json и запускайте перед билдом. Динамический эндпоинт работает только в SSR режиме Astro.