rss

Comment générer un fichier rss.xml pour votre site.

2 min de lecture
Dernière modification le 18 avril 2025. Publié le

Qu'est-ce que le rss ?

Le rss est un fichier XML qui contient des informations sur vos articles, et est utilisé pour suivre les actualités d'un site.

Par exemple, sur ce site cela donne rss.xml.
N'importe qui peut s'abonner à ce flux, ainsi dès qu'un nouveau post est publié la personne n'aura qu'à actualiser son flux pour voir qu'il y a de nouveaux articles.

Comment générer un fichier rss.xml ?

Avec Astro, la fonction suivante utilise @astrojs/rss pour construire la réponse XML :

import rss from "@astrojs/rss";
import XMLBuilder from "fast-xml-builder";
import { EMAIL, SITE_METADATA } from "../src/lib/constants";
import type { Post } from "../src/lib/posts";
 
export function generateRss(posts: Post[], site: URL) {
	const date = new Date().toUTCString();
	return rss({
		title: SITE_METADATA.title,
		description: SITE_METADATA.description,
		site,
		trailingSlash: false,
		xmlns: { atom: "http://www.w3.org/2005/Atom" },
		customData: new XMLBuilder({ ignoreAttributes: false }).build({
			language: SITE_METADATA.locale,
			managingEditor: `${EMAIL} (${SITE_METADATA.author})`,
			generator: SITE_METADATA.title,
			pubDate: date,
			lastBuildDate: date,
			"atom:link": {
				"@_href": new URL("rss.xml", site).href,
				"@_rel": "self",
				"@_type": "application/rss+xml",
			},
			image: {
				url: new URL(SITE_METADATA.image, site).href,
				title: SITE_METADATA.title,
				link: site.href,
			},
			category: [...new Set(posts.flatMap((post) => post.fullTags))],
		}),
		items: posts.map((post) => ({
			title: post.title,
			description: post.description,
			link: post.url,
			pubDate: new Date(post.datePublished),
			categories: post.fullTags,
		})),
	});
}

L'endpoint src/pages/rss.xml.ts appelle cette fonction avec les articles et l'URL du site. Astro génère ensuite /rss.xml pendant le build :

import type { APIRoute } from "astro";
import { generateRss } from "../../scripts/generate-rss";
import { getPosts } from "../lib/posts";
export const GET: APIRoute = async ({ site }) =>
	generateRss(await getPosts(), site!);

Voir la documentation de @astrojs/rss.

Comment voir si ça marche ?

Pour tester j'ai utilisé la cli nom

Comment utiliser nom ?
nom add https://vahor.fr/rss.xml
nom
main page in nom tui
main page in nom tui
post in nom tui
post in nom tui

On se retrouve maintenant avec un sitemap.xml, un llms.txt et un rss.xml, je pense que les 5 articles du site ont assez de visibilité 🤣