如何为 Fumadocs 博客生成 RSS Feed?
如何为 Fumadocs 博客生成 RSS Feed【免费下载链接】fumadocsThe beautiful flexible React.js docs framework.项目地址: https://gitcode.com/GitHub_Trending/fu/fumadocs如果你在用 Fumadocs 建站并且有博客模块想把这些文章聚合成一个可订阅的 Feed可以使用feed库生成 RSS 2.0 Feed再通过服务端路由对外暴露。这篇文章基于 Fumadocs 官方 RSS 文档与官方文档站自身的博客 Feed 实现走一遍完整路径添加依赖、编写 Feed 生成逻辑、创建服务端路由、在页面 Metadata 中声明 Feed 地址最后验证结果。主路径是 Next.jsApp Router项目文末附 React Router、Tanstack Start 和 Waku 的路由写法。准备条件站点已用 Fumadocs 搭好并且博客内容以内容集合content collection管理。Fumadocs 官方文档站用defineCollections定义博客集合dir: content/blog并在 schema 中把authorz.string()和datez.iso.date().or(z.date())设为必填字段定义见 lib/source/index.tsx。博客 Feed 正是要读取这两个字段所以每篇博客的 frontmatter 都必须包含author和date。安装feed依赖。Fumadocs 官方文档站的项目中声明为feed: ^6.0.0见 apps/docs/package.json。编写 Feed 生成逻辑官方文档/guides/rss.mdx)建议把生成 Feed 的逻辑写成函数例如放在lib/rss.tsimport { Feed } from feed; import { source } from /lib/source; const baseUrl https://fumadocs.dev; export function getRSS() { const feed new Feed({ title: Fumadocs Blog, id: ${baseUrl}/blog, link: ${baseUrl}/blog, language: en, image: ${baseUrl}/banner.png, favicon: ${baseUrl}/icon.png, copyright: All rights reserved 2025, Fuma Nama, }); for (const page of source.getPages()) { feed.addItem({ id: page.url, title: page.data.title, description: page.data.description, link: ${baseUrl}${page.url}, date: new Date(page.data.lastModified), author: [ { name: Fuma, }, ], }); } return feed.rss2(); }套用时需要替换两处内容baseUrl在文档示例中是 Fumadocs 官方域名必须换成你自己站点的对外访问域名它决定 Feed 的id、link、每个条目的link以及image、favicon的完整地址。文档示例遍历的是文档源source条目的时间取自page.data.lastModified如果为博客生成 Feed应改用博客 loader并参考下一节的官方文档站写法。Fumadocs 官方文档站的博客 loader 定义在 lib/source/index.tsxexport const blogLoader loader(blog.toFumadocsSource(), { baseUrl: /blog, });创建服务端路由Next.js 下官方文档/guides/rss.mdx)给出的路由文件是app/rss.xml/route.tsimport { getRSS } from /lib/rss; export const revalidate false; export function GET() { return new Response(getRSS()); }路由的GET返回new Response(getRSS())即feed.rss2()生成的 RSS 2.0 XML 字符串。如果你的 Feed 对应博客目录路由为/blog/rss.xml可以直接参考官方文档站自身的实现 app/(home)/blog/rss.xml/route.ts/blog/rss.xml/route.ts)。该实现把 Feed 逻辑直接写在路由里官方站点把文件放在(home)路由组中路由组名称不影响 URLimport { Feed } from feed; import { blogLoader } from /lib/source; import { NextResponse } from next/server; export const revalidate false; const baseUrl https://fumadocs.dev; export function GET() { const feed new Feed({ title: Fumadocs Blog, id: ${baseUrl}/blog, link: ${baseUrl}/blog, language: en, image: ${baseUrl}/banner.png, favicon: ${baseUrl}/icon.png, copyright: All rights reserved 2025, Fuma Nama, }); for (const page of blogLoader.getPages().sort((a, b) { return new Date(b.data.date).getTime() - new Date(a.data.date).getTime(); })) { feed.addItem({ id: page.url, title: page.data.title, description: page.data.description, link: ${baseUrl}${page.url}, date: new Date(page.data.date), author: [ { name: page.data.author, }, ], }); } return new NextResponse(feed.rss2()); }与上一节文档示例的差异条目按page.data.date从新到旧排序条目时间使用文章的date作者取自每篇文章的page.data.author。baseUrl同样要替换成你自己的域名。其他框架的路由写法可选站点如果不是 Next.js官方文档/guides/rss.mdx)给出了等价写法假设getRSS已按上文实现React Routerapp/routes/rss.tsimport { getRSS } from /lib/rss; export async function loader() { return new Response(getRSS()); }并在app/routes.ts中注册路由import { route, type RouteConfig } from react-router/dev/routes; export default [ route(rss.xml, routes/rss.ts), ] satisfies RouteConfig;Tanstack Startsrc/routes/rss[.]xml.tsimport { createFileRoute } from tanstack/react-router; import { getRSS } from /lib/rss; export const Route createFileRoute(/rss.xml)({ server: { handlers: { GET: async () new Response(getRSS()), }, }, });Wakupages/_api/rss.xml.tsimport { getRSS } from /lib/rss; export function GET() { return new Response(getRSS()); } export async function getConfig() { return { render: static as const, } as const; }在 Metadata 中声明 Feed 地址Next.js 项目可以往 metadata 对象里加alternates把 Feed 的标题和 URL 暴露给浏览器或 RSS 阅读器。官方文档/guides/rss.mdx)的示例import type { Metadata } from next; export const metadata: Metadata { alternates: { types: { application/rssxml: [ { title: Fumadocs Blog, url: https://fumadocs.dev/blog/index.xml, }, ], }, }, };url要指向你自己站点实际的 Feed 路由。Fumadocs 官方文档站在 lib/metadata.ts 中使用的是https://fumadocs.dev/blog/rss.xml与路由app/(home)/blog/rss.xml/route.ts对应文档示例里的/blog/index.xml只是示例地址两者指向各自的真实路由。验证结果请求 Feed 路由对应的 URL官方文档站为/blog/rss.xml按上文路由组文件则为/rss.xml返回的是feed.rss2()生成的 RSS 2.0 XML 字符串。检查 Feed 头部id与link指向博客首页${baseUrl}/blog每个条目的link为${baseUrl}${page.url}拼出的文章完整地址。加上alternates后页面 metadata 中以application/rssxml类型声明了该 Feed 地址。限制与注意博客集合 schema 中date和author为必填字段frontmatter 缺少这两项的文章无法通过集合校验也就进不了 Feed。Feed 条目读取的是页面数据中的title、description、date文档源示例中为lastModified内容随博客文章更新而变化。路由示例中的export const revalidate false;是文档示例自带的配置项在自己的项目中保持一致即可。【免费下载链接】fumadocsThe beautiful flexible React.js docs framework.项目地址: https://gitcode.com/GitHub_Trending/fu/fumadocs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

社交网站建站避坑指南:3类实战案例拆解费用与服务器配置

社交网站建站避坑指南:3类实战案例拆解费用与服务器配置

社交网站建站避坑指南:3类实战案例拆解费用与服务器配置 域名注册了三年没备案,服务器买了高配却卡成PPT,这是很多做社交类项目的甲方最头疼的噩梦。别急着甩锅给技术,很多时候是你在选型阶段就踩进了“域名服务器搞不懂”的深坑。我看过太多…

2026/11/4 9:13:15 阅读更多 →
CTF数学题破题核心:Sylvester结式法实战指南

CTF数学题破题核心:Sylvester结式法实战指南

1. 这不是线性代数课,是CTF里真能拿分的数学武器你打开ctfshow web112题目,页面只显示一行:已知 f(x) x - 6x 11x - 6,g(x) x - 5x 6,求它们的公共根。没有源码、没有交互、没有SQL注入点——连个输入框都没有。这…

2026/11/4 9:13:14 阅读更多 →
BIT-Vehicle数据集详解:从.mat标注到YOLO/VOC/COCO格式转换

BIT-Vehicle数据集详解:从.mat标注到YOLO/VOC/COCO格式转换

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/9 6:46:48 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/8 1:19:03 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/8 14:17:55 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/9 1:59:56 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/8 1:38:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/9 7:45:06 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/8 1:23:14 阅读更多 →

日新闻

周新闻

月新闻