笔记

静态站点的 RSS 订阅源实现

如何在 Astro 静态站点中实现类型安全的 RSS 订阅源,以及需要注意的格式和验证问题。

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 标签,需要正确转义:

  • < 转义为 &lt;
  • > 转义为 &gt;
  • & 转义为 &amp;

截断

过长的描述会影响阅读器的显示效果。可以截断到合适的长度(如 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 等扩展格式的笔记。

评论