Astro: генерация RSS-ленты (пример функции/эндпоинта)
Генерация RSS-ленты из Content Collections в Astro через эндпоинт или статическую генерацию.
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
Генерация 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();
Подключение в проекте:
- Установите пакет:
npm install @astrojs/rss - Создайте файл
src/pages/rss.xml.ts(для динамической генерации) - Или добавьте скрипт в
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.