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