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,否則您的更改可能會被拒絕或推送到替代分支。