大数跨境

为 Nuxt 网站制作 RSS Feed

为 Nuxt 网站制作 RSS Feed 索引目录
2025-09-23
1
导读:什么是 RSS 提要?RSS feed 是一个 XML 文档,允许用户订阅网站更新。

什么是 RSS 提要?

RSS feed 是一个 XML 文档,允许用户订阅网站更新。它是一种 XML 文档,可以轻松解析,以检索最新发布的文章、网站作者以及更多信息(如果您想了解更多信息,请参阅此处的维基百科条目)。

有很多应用程序允许您订阅 RSS 源,甚至在更新时收到通知。

尽管 XML 格式的 RSS 是使用 Web 提要的最知名的方式,但其他格式也受到广泛支持:

  • JSON 提要
  • 原子提要

在本文中,我将仅讨论 RSS - 并简要提及 atom - 但我所谈论的所有内容都适用于它们所有。

RSS Feed 的结构

让我们看一下 RSS 提要是什么样子的(你可以在这里找到我的)——特别是我的网站的 RSS 提要

<rss version="2.0">
  <channel>
    <title>Matteo's Log</title>
    <link>https://www.matteogassend.com</link>
    <generator>Nuxt & Feed</generator>
    <language>en</language>
    <atom:link href="https://www.matteogassend.com/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>T3Chat Cloneathon Postmortem</title>
      <link>
      https://www.matteogassend.com/articles/t3-cloneathon-postmortem
      </link>
      <guid isPermaLink="false">t3-cloneathon-postmortem</guid>
      <pubDate>Mon, 14 Jul 2025 00:00:00 GMT</pubDate>
      <description>
      I participated in the T3Chat cloneathon; here's how it went
      </description>
      <content:encoded>
        ...
      </content:encoded>
    </item>
  </channel>
</rss>

首先,我们用 main 标签指定此 XML 文档是一个 RSS 源,并指明其实现版本(在本例中为 2.0 版本)。
然后,我们进入channel定义;这是实际要使用的 RSS 源,我们可以在其中找到其名称、描述、语言等信息。
接下来,对于我们想要添加到channel中的每个元素,我们都有一个item标签。每个 item 包含名称、描述、发布日期、唯一 ID 以及可选的原始内容(在本例中为博客文章)。

如何在 Nuxt 中构建

幸运的是,Nuxt 路由可以是 Vue 组件,也可以是服务器端点——你也可以使用 tsx,但我们暂时先不讨论这个。服务器(或 API)端点由 Nitro 处理,并使用经典的浏览器请求与响应机制,这意味着我们只需返回一个带有正确 header 的 xml 文档即可!让我们看看具体操作方法。

声明 API 路由

让我们首先声明 Nitro 路线;在本例中,我将使其与路径匹配/rss.xml,这意味着我将在此处创建一个文件:/server/routes/rss.xml.ts并用基本的 Nitro 处理程序填充它:

export default defineEventHandler(async (event) => {
  //generate the feed
  ...
  //return the actual feed data here
  return {}
})

RSS Feed 进入游戏

我们可以手动编写 XML 文档,但何必呢?有一个完美的包可以实现这一点:feed。它允许我们以编程方式构建 feed 并以不同的格式返回。让我们看看如何将它与 Nitro 集成。

首先,让我们安装依赖项:

npm install feed

让我们开始创建 feed 本身;我们将首先设置 feed 所需的所有基本信息,然后将其他项目留待以后再设置:

const feed = new Feed({
    title: "Matteo's Log",
    description: "All the articles from matteogassend.com",
    id: <a unique id>,
    link: <url of your website>,
    language: "en",
    copyright: `All rights reserved ${new Date().getFullYear()}, Matteo Gassend`,
    updated: new Date(),
    generator: "Nuxt & Feed",
    feedLinks: {
      rss: `<url of your website>/rss.xml`,
    },
    author: {
      name: <name of the author>,
    },
  });

只需这样,我们就可以生成一个 XML 文档,并将其与上面创建的端点一起返回。我们来做吧

export default defineEventHandler(async (event) => {
  ... // the feed is here

  return feed.rss2()
})

在拥有功能齐全的 RSS 源之前,我们只需要另外两件事:

  • 告知浏览器我们发送的数据类型
  • 在 feed 中插入实际项目

第一步很简单,所以我们先把它搞定;在返回生成的 feed 之前,我们先设置一下content-typeheader。这个 header 告诉浏览器如何理解我们返回的内容;你可以看到它主要在返回 JSON 数据时使用——比如在创建 API 时。以下是我们在 Nitro 中如何设置:

setResponseHeader(event, "content-type", "text/xml");

这告诉浏览器我们正在发回一个 xml 文档。

将项目添加到 feed

现在我们已经了解了基础知识,接下来让我们开始向 feed 添加实际项目。在我的用例中,我需要从 Nuxt Content 集合中获取项目并将其添加到 feed 中。那么,我们就这样做吧:

const articles = await queryCollection(event, "articles")
    .order("publishDate", "DESC")
    .all();

如果您没有集合,就假装这是一个对象数组。

之后,它就像循环遍历数据数组并addItem在 feed 实例上调用方法一样简单:

articles.forEach((article) => {
    feed.addItem({
      title: article.title,
      id: article.slug,
      description: article.summary,
      date: new Date(article.publishDate),
      link: `${BASE_URL}/articles/${article.slug}`,
      content: article.rawbody,
    });
  });

这就是你在 Nuxt 应用中生成 RSS feed 所需要做的全部工作!我还添加了一个逻辑完全相同的 atom feed —— 只需将rss2call 替换为atom1即可!

将 Feed 添加到网站

一旦你有了服务器路由,你只需要将它添加到你的页面,大多数 RSS 阅读器都应该能够获取它。假设我们的 RSS 订阅位于/rss.xml:如果是这样,我们需要link在页面的 中添加以下标签head

<link rel="alternate" type="application/rss+xml" title="Your feed's title" href=`${BASE_URL}/rss.xml`

如果您正在使用unhead,那么也可以在 useHead 可组合钩子中使用类似如下的方式完成此操作:

useHead({
  link: [
    {
      rel: "alternate",
      type: "application/rss+xml",
      title: "Matteo's Log",
      href: "/rss.xml",
    },
    {
      rel: "alternate",
      type: "application/atom+xml",
      title: "Matteo's Log",
      href: "/atom",
    },
  ],
});

【声明】内容源于网络
0
0
索引目录
索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
内容 444
粉丝 0
索引目录 索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
总阅读12
粉丝0
内容444