nuxt-feedme

适用于 Nuxt Web 框架的 RSS 订阅模块,支持 ATOM、JSON 和 RSS

nuxt-feedme

npm versionnpm downloadsLicenseNuxtTests (GitHub Actions)

此模块提供了实现 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 选项仅影响创建的订阅项(datepublished 字段)。

通用和专用钩子

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 访问原始解析内容,或通过 setgetdel 访问项候选项)。

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]],
    },
  }
}

快速设置

  1. 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
    
  2. nuxt-feedme 添加到 nuxt.config.tsmodules 部分
    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,否则您的更改可能会被拒绝或推送到替代分支。