nuxt-feedme
此模块提供了实现 RSS 订阅的额外功能。它与 module-feed
非常相似,但支持 nuxt-content
。
如果您需要完全自定义的订阅,您可以自由选择任何订阅模块(此模块或上面提到的模块)。但此模块可能更灵活。
功能
- 为
nuxt-content
开箱即用配置 - 支持两种订阅类型的通用和专用钩子
- 灵活:使用默认配置(feed、item、routes)、映射(nuxt content 到 item)或钩子进行自定义
- 支持 SSR 和 SSG
nuxt-content
开箱即用配置 为
默认设置是
{
defaults: {
common: true,
routes: true,
mapping: true,
mappingTemplates: true,
},
feeds: {
common: {
revisit: '6h',
fixDateFields: true,
feed: { title: 'Generated title by nuxt-feedme!' },
collections: ['content'],
templateMapping: ['', 'meta', 'meta.feedme'],
mapping: [
['link', 'path'],
],
},
routes: {
'/feed.atom': { type: 'atom1' },
'/feed.json': { type: 'json1' },
'/feed.xml': { type: 'rss2' },
}
},
}
按照设计,Nuxt 将合并默认设置和用户提供的设置。有时您需要忽略默认设置,转而使用自己的设置。要做到这一点,只需将所需的默认设置设为 false。
fixDateFields
选项仅影响创建的订阅项(date
和 published
字段)。
通用和专用钩子
Feedme 支持以下通用和专用钩子
feedme:handle[${PATH}]
feedme:handle
feedme:handle:content:before[${PATH}]
feedme:handle:content:before
feedme:handle:content:query[${PATH}]
feedme:handle:content:query
feedme:handle:content:item[${PATH}]
feedme:handle:content:item
feedme:handle:content:after[${PATH}]
feedme:handle:content:after
其中 PATH
是订阅路由(例如 /feed.xml
或任何用户定义的路由)。
内容钩子**仅**在默认处理程序未创建订阅时执行。feedme:content*
钩子中的订阅创建会阻止 Feedme 通过内容模块自动创建订阅。
您可以使用专用钩子创建自定义订阅,或“跳出”自定义创建的路由。
import type { NitroApp } from 'nitropack'
export default (nitroApp: NitroApp) => {
nitroApp.hooks.hook('feedme:handle', async ({ context: { event, routeSettings }, feed: { obtain } }) => {
// Note: You need to manually escape content paths when use both manual and content approaches
const escapeRoutes = new Set(['/content.xml', '/pages.json'])
if (escapeRoutes.has(event.path)) return
// Note: Since there's no specialized hooks for atom feed, general will create feed object
const feed = obtain({ title: `Default feed for '${event.path}'`, ...routeSettings.feed })
feed.addItem({ date: new Date('2025-09-20'), link: '/', title: 'General hook article' })
})
nitroApp.hooks.hook('feedme:handle[/feed.xml]', async ({ context: { event }, feed: { obtain } }) => {
// Note: Specialized hook is always called before general
const feed = obtain({ title: `Special feed for '${event.path}' route` })
feed.addItem({ date: new Date('2025-09-21'), title: 'Exclusive for xml (from specialized hook)' })
})
}
您仍然可以通过内容钩子修改内容订阅。
内容钩子角色
- 在任何交互之前,使用
feedme:handle:content:before*
钩子设置订阅。 - 使用
feedme:handle:content:query*
钩子提供自定义查询或集合(提供查询时会忽略集合)。 - 使用
feedme:handle:content:item*
钩子操作订阅项候选项或删除(废弃)它。 - 在需要时,使用
feedme:handle:content:after*
钩子操作已完成的订阅。
请参阅 playground/server/plugins/feed.ts
中的示例。
映射配置
映射用于将 feed
项键链接到已解析内容中的路径。
重大变更:自 v2 起,不再支持第三个参数。请使用 feedme:handle:content:item*
钩子修改数据(通过 raw
访问原始解析内容,或通过 set
、get
和 del
访问项候选项)。
Feedme 模块提供默认映射以及 ''
(根)、'meta'
(Nuxt 解析内容中 .md
文件中用户对象的字段)和 'meta.feedme'
(.md
文件对象中的嵌套对象)的模板根。
此外,Feedme 还提供额外的映射 ['link', 'path']
(Nuxt 解析内容对象中默认字段 link
到订阅项 path
字段)。
通过模板根,可以从 .md
内容页面自动创建订阅项(请参阅 playground
目录)。
为简单起见,Feedme 将 feeds.common.fixDateFields
设置为 true
,这会在 feedme:handle:content:item*
钩子之前为**候选项**启用字符串到日期的转换。
替换
以前称为标签。
替换字段是一个对数组。
第一个项是字符串,被视为序列化的 RegExp
对象,用于在解析内容对象值(带递归)中搜索替换。
第二个项是实际的字符串,用于替换所有匹配的 RegExp
。
大多数设置可以在 common 和每个路由中设置。
{
feeds: {
common: {
replace: [[/^(?=\/)/.toString(), baseUrl]],
},
}
}
快速设置
- 将
nuxt-feedme
依赖项添加到您的项目中。
使用您喜欢的包管理器(我更喜欢 yarn)yarn add -D nuxt-feedme pnpm add -D nuxt-feedme npm install --save-dev nuxt-feedme
或者通过nuxi module
安装它npx nuxi@latest module add nuxt-feedme
- 将
nuxt-feedme
添加到nuxt.config.ts
的modules
部分export default defineNuxtConfig({ modules: [ // After nuxt content '@nuxt/content', 'nuxt-feedme' ] })
就是这样!您现在可以在 Nuxt 应用程序中开始使用 nuxt-feedme
了 ✨
贡献
本地开发
对于本地开发,强烈建议使用 docker
docker compose --profile develop up
可选:如果您想释放会话,请使用分离模式运行(标志 -d
)。
替代方案
# Install dependencies
yarn install
# Run playground
yarn run dev --host '0.0.0.0'
# Run prepack to make sure, that module is ready
yarn run prepack
警告:请使用 conventional commits,否则您的更改可能会被拒绝或推送到替代分支。