nuxt-feedme

ATOM、JSON、RSS をサポートする Nuxt Web フレームワーク用 RSS フィードモジュール

nuxt-feedme

npm versionnpm downloadsLicenseNuxtTests (GitHub Actions)

このモジュールは 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: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 以降、3 番目の引数はサポートされなくなりました。feedme:handle:content:item* フックを使用してデータを変更します (raw 経由で解析された生のコンテンツ、または setgetdel 経由でアイテム候補を変更)。

Feedme モジュールは、デフォルトのマッピングとそのままでテンプレートルートを提供します。ルートは '' (ルート)、'meta' (.md ファイルのユーザーオブジェクト用の Nuxt 解析コンテンツフィールド)、'meta.feedme' (.md ファイルオブジェクト内のネストされたオブジェクト) です。

また、Feedme は追加のマッピング ['link', 'path'] を提供します (解析されたコンテンツオブジェクト内の Nuxt デフォルトフィールド link をフィードアイテム path フィールドにマッピング)。

テンプレートルートを使用すると、.md コンテンツページからフィードアイテムを自動的に作成できます (playground ディレクトリを参照)。

シンプルにするため、Feedme は feeds.common.fixDateFieldstrue に設定します。これにより、feedme:handle:content:item* フックの前に、候補アイテムの文字列から日付への変換が有効になります。

置換

以前はタグとして知られていました。

置換フィールドはペアの配列です。

最初の項目は文字列で、シリアル化された RegExp オブジェクトと見なされ、解析されたコンテンツオブジェクトの値 (再帰的) で置換を検索するために使用されます。

2 番目の項目は、一致したすべての RegExp を置き換えるために使用される実際の文字列です。

ほとんどの設定は、共通およびルートごとに設定できます。

{
  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-feedmenuxt.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 を使用してください。そうでない場合、変更が拒否されたり、別のブランチにプッシュされたりする可能性があります。