惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学
博客园 - Franky
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
IT之家
IT之家
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Visual Studio Blog
S
SegmentFault 最新的问题
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
有赞技术团队
有赞技术团队
B
Blog RSS Feed
Last Week in AI
Last Week in AI
Jina AI
Jina AI
博客园 - 司徒正美
The Cloudflare Blog
博客园_首页
博客园 - 聂微东
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏

Cali Castle | 开发者、设计师、细节控、创始人

我决定,不再买 SaaS 了。 2023 年终总结,致我不同寻常的 28 | Cali Castle 如何复刻本网站,零氪快速建博客 | Cali Castle React 还是 Vue?我对 Web 前端现状的看法 | Cali Castle 我要当爸爸了 | Cali Castle 成为优秀工程师的八大法则 | Cali Castle 按钮真的需要手指光标吗? | Cali Castle 如何用 Upstash 为网站保驾护航 | Cali Castle 陈皓:以磊落之心,点亮科技之光 | Cali Castle
如何给你的 Next.js(App 路由)应用添加 RSS | Cali Castle
2023-06-10 · via Cali Castle | 开发者、设计师、细节控、创始人

随着 Next.js 13 的 App 路由前阵子在 Vercel Ship 上宣布进入了 Stable(稳定)版以后,越来越多的 Next.js 开发者肯定都陷入了窘境,意味着从今以后我们新建项目都会默认使用 App 路由了,也就代表着你不得不去重新学习一遍这崭新的 Next.js 应用架构。

在我看来,Next.js 目前的 App 路由变“稳定”是个海市蜃楼,它当然还有很长的路要走才能真正达到 bug 少,兼容性拓展性高

其实从 Pages 目录迁移到 App 目录不是件容易事,特别是如果你的代码库特别庞大的话。而且新的 RSC(React Server Component)也不一定适用所有项目,加上整个 paradigm shift 范式转移会让原本的“前端”开发转向了真·全栈开发。

我相信这一系列举动必然会给很多原本缺乏后端知识或者技能的前端小伙伴们增添了不少困惑,我也会在以后出一些关于 Next.js App 路由模式下的各类教程和指南。

好了,吐槽 Next.js 的废话就到这里了,接下来开始正片。

一般我们在网站里添加 RSS 功能的原因比较简单,大多数人我相信应该都是为自己的博客文章去添加支持 RSS 方便他人订阅。

不过不管你是什么原因,给你的 Next.js 站点添加 RSS 订阅其实非常容易,让我们开始吧!

安装依赖

首先我们需要安装 rss 这个 npm 库,它可以帮我们生成最终渲染出来的 RSS xml 格式,那就用你最喜欢的包管理器(npm/yarn/pnpm)添加到你的 Next.js 项目中吧:

为什么我们选择用 rss 呢?

其实主要是因为在我踩了 feed 的坑以后还是发现 rss 更好用一点 😂。(比如在 iOS Safari 中访问 rss 地址的话会出现自动添加 .rss 后缀导致不会自动触发 iOS 的 RSS 全局检测链接从而打开兼容的阅读器自动触发添加操作)

总而言之,我推荐你使用 rss 而不是 feed

那我们安装好了以后要怎么开始实现 RSS 功能呢?

API 路由定义

首先就是我们需要明确自己的 RSS 订阅最终地址是什么,常见的地址后缀有:

  • /feed
  • /feed.xml
  • /rss
  • /rss.xml

那么如果你跟我一样,就会想让自己的网站适配到每一个地址都可以访问。

完全没问题的,我们等下就来专门利用 Next.js 的 Rewrite 功能来实现一下。

但我们需要一个入口,所以无论你选哪个都是 OK 的,为了本教程,我选择标准化的 /feed.xml

首先我们在 app 路由下需要添加一个 Route Handler(路由解析器),一个简单的例子比如我们想发一条 GET/POST/PATCH/DELETE 请求到某个接口,那么在 app 路由的范式下,我们就称之为一个 Route Handler

其实要想定义一个 Route Handler,我们不一定要放在 api 文件夹下,特别是我们现在想实现的场景是访问 /feed.xml 从而达到渲染 RSS xml,那么我们完全可以用 Static Route Handler(静态路由解析) 来帮我们。

接下来我们在 app 目录下创建一个文件夹叫 feed.xml(没错,文件夹可以带任何看起来像文件类型后缀一样的字符,所以你也可以创建一个 .php 后缀的路由,然后看起来就很值钱了,距离兰博基尼梦不远了),然后在这个文件夹里创建一个 route.ts 文件:

基本上我们的文件结构就是这样子。

接下来需要你在这个路由里去动态的获取你所有的数据源,可以是从数据库里获取的文章数据,也可以是从 CMS 获取的数据。

因为我没办法知道你的具体数据源来自哪里,所以这里我假设你有一个 async 函数可以获取数据源叫做 fetchData

到这里就大功告成啦,在本地通过启动 Next.js 进程(npm run dev)以后到浏览器里访问 http://localhost:3000/feed.xml,你应该就可以看到 xml 被成功打印出来了。

多路由匹配

为了实现让 /rss /rss.xml /feed 都能获取到相同的 xml 内容,我们需要借力 Next.js 自带的 Rewrites(路由重写)功能:

这样就完成了在你的网站可以通过以下4个地址访问到你的 RSS 订阅:

  • /feed
  • /feed.xml
  • /rss
  • /rss.xml

小技巧

大部份浏览器都支持 RSS Autodiscovery(自动识别 RSS),那我们如果也希望给自己的网站加上这个功能的话,就必须要在 HTML 的 <head> 标签里添加: <link rel="alternate" type="application/rss+xml"
title="RSS Feed"
href="" />

在 Next.js 的 app 路由范式下,我们有 Metadata 可以让我们少写一点 <head> HTML:

这回我们网站的 RSS 功能就算比较完整了。

回顾总结

本次知识点回顾:

  1. 我们运用了 Static Route Handler 来生成静态的 /feed.xml
  2. 我们运用了 Rewrites 来实现多路由的重写映射;
  3. 我们运用了 Metadata 来为网站添加 RSS Autodiscovery;

最后奉上我在 Feedly 里测试添加 RSS 后的效果图:

Enjoy, have fun!