RSS 是个人站点最重要的内容分发方式之一。它不依赖任何平台,不被算法干扰,读者可以直接在自己的阅读器中订阅。对于一个以内容为核心的站点来说,RSS 不是可选功能,而是基础设施。
基本实现
Astro 提供了 @astrojs/rss 集成,可以在构建时生成 RSS 订阅源:
import rss from '@astrojs/rss';
import { getCollection } from 'astro:content';
export async function GET(context: { site?: URL }) {
const posts = await getCollection('posts');
return rss({
title: '站点名称',
description: '站点描述',
site: context.site.toString(),
items: posts.map((post) => ({
title: post.data.title,
pubDate: post.data.publishedAt,
description: post.data.summary,
link: `/posts/${post.id}/`,
})),
});
}
这个实现在构建时执行,生成静态的 feed.xml 文件。
类型安全
使用 TypeScript 确保 RSS 条目的类型安全:
type FeedEntry = {
id: string;
data: {
title: string;
summary: string;
publishedAt: Date;
draft: boolean;
};
body: string;
};
在生成 RSS 条目时,TypeScript 会检查所有必要字段是否存在,避免运行时错误。
内容过滤
RSS 中只应该包含已发布的内容。使用与站点相同的过滤逻辑:
const entries = getPublicContent(posts);
这确保 RSS 订阅者看到的内容与网站访客看到的一致。
格式规范
RSS 2.0 有几个关键的格式要求:
必填字段
<title>:条目标题。<link>:条目链接。<description>:条目摘要。
推荐字段
<pubDate>:发布日期,使用 RFC 822 格式。<category>:分类标签。<guid>:全局唯一标识符。
日期格式
RSS 2.0 使用 RFC 822 格式的日期:
Sun, 11 Aug 2026 12:00:00 +0800
Astro 的 @astrojs/rss 会自动处理日期格式转换。
内容处理
Markdown 内容在进入 RSS 之前需要处理:
HTML 转义
RSS 条目的描述可能包含 HTML 标签,需要正确转义:
<转义为<>转义为>&转义为&
截断
过长的描述会影响阅读器的显示效果。可以截断到合适的长度(如 300 字符),并在截断处添加省略号。
纯文本版本
某些阅读器偏好纯文本描述。可以提供 content:encoded 字段包含完整 HTML,同时在 description 中提供纯文本摘要。
多集合订阅
如果站点有多种内容类型(文章、笔记),可以生成多个 RSS 源:
/feed.xml:所有内容的聚合订阅源。/feed/posts.xml:仅文章的订阅源。/feed/notes.xml:仅笔记的订阅源。
或者将所有内容合并到一个订阅源中,按发布时间排序。
验证
RSS 生成后应该通过验证:
- W3C Feed Validation Service:检查 RSS 格式是否符合规范。
- 浏览器直接打开
feed.xml:检查是否能正常解析。 - RSS 阅读器订阅测试:确认内容能正常显示。
订阅发现
在站点的 <head> 中添加 RSS 订阅发现链接:
<link
rel="alternate"
type="application/rss+xml"
title="站点名称"
href="/feed.xml"
/>
这让浏览器和阅读器能自动发现 RSS 订阅源。
本笔记的状态
这是一个 growing 状态的笔记。随着在更多场景中实现 RSS,会补充关于 podcast RSS、视频 RSS 等扩展格式的笔记。
评论