nuxt-feedme
このモジュールは RSS フィードを実装するための追加機能を提供します。module-feed と非常に似ていますが、nuxt-content のサポートがあります。
完全にカスタマイズされたフィードが必要な場合は、任意のフィードモジュール (これまたは上記で言及されたもの) を自由に選択できます。しかし、このモジュールはより柔軟である可能性があります。
機能
nuxt-content用にすぐに設定可能- 両方のフィードタイプで一般的なフックと特殊なフックをサポート
- 柔軟性: 設定のデフォルト (フィード、アイテム、ルート)、マッピング (Nuxt コンテンツからアイテムへ)、またはカスタマイズのためのフックを使用
- 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:handlefeedme:handle:content:before[${PATH}]feedme:handle:content:beforefeedme:handle:content:query[${PATH}]feedme:handle:content:queryfeedme:handle:content:item[${PATH}]feedme:handle:content:itemfeedme: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 以降、3 番目の引数はサポートされなくなりました。feedme:handle:content:item* フックを使用してデータを変更します (raw 経由で解析された生のコンテンツ、または set、get、del 経由でアイテム候補を変更)。
Feedme モジュールは、デフォルトのマッピングとそのままでテンプレートルートを提供します。ルートは '' (ルート)、'meta' (.md ファイルのユーザーオブジェクト用の Nuxt 解析コンテンツフィールド)、'meta.feedme' (.md ファイルオブジェクト内のネストされたオブジェクト) です。
また、Feedme は追加のマッピング ['link', 'path'] を提供します (解析されたコンテンツオブジェクト内の Nuxt デフォルトフィールド link をフィードアイテム path フィールドにマッピング)。
テンプレートルートを使用すると、.md コンテンツページからフィードアイテムを自動的に作成できます (playground ディレクトリを参照)。
シンプルにするため、Feedme は feeds.common.fixDateFields を true に設定します。これにより、feedme:handle:content:item* フックの前に、候補アイテムの文字列から日付への変換が有効になります。
置換
以前はタグとして知られていました。
置換フィールドはペアの配列です。
最初の項目は文字列で、シリアル化された RegExp オブジェクトと見なされ、解析されたコンテンツオブジェクトの値 (再帰的) で置換を検索するために使用されます。
2 番目の項目は、一致したすべての RegExp を置き換えるために使用される実際の文字列です。
ほとんどの設定は、共通およびルートごとに設定できます。
{
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 を使用してください。そうでない場合、変更が拒否されたり、別のブランチにプッシュされたりする可能性があります。