Next.js製のブログにRSSを設定する

Next.js製のブログにRSSを設定しました。

結論

  • API Routeからフィードを返す
  • パスが気持ち悪いのでrewritesの設定で /feed -> /api/feed

やり方

Next.jsのルーティングは、pages/ 以下に、パスに対応するファイル名にReactコンポーネントを置いて画面を表示することができます。では、画面じゃなくて今回のRSSのようなレスポンスを返すにはどうすればいいか。調べるとAPI Routesというものがあったので今回はそれを使いました。

API Routes

API routes provide a straightforward solution to build your API with Next.js.

だそうです。RSSファイル返していいものかちょっと微妙な感じもしますが、他に良さげな方法がなかったので使いました。ドキュメントに書かれている通り、/pages/api/feed.ts とかに書くと、/api/feed で配信されます。

そこに、以下のような処理を書きました。

// ...もろもろ省略 export default async (req, res) => { res.statusCode = 200; const posts = await fetchPosts(); const feed = await generateFeed(posts); res.setHeader("Content-Type", "application/rss+xml;charset=utf-8"); res.write(feed.xml()); res.end(); };

パスのrewrites

ブログのフィードが /api/feed なのはなんとなく気持ち悪く、/feedにしたい。そこで、rewritesの設定を知りました。

以下のようにしました。

module.exports = { async rewrites() { return [ { source: "/feed", destination: "/api/feed", }, ]; }, };

以上で、 https://blog.gaaamii.jp/feed でフィード情報を返すことができました。

その他の方法

Pageコンポーネントにres.end書いちゃうのもOKみたいです。知らなかった。