monaka

Next.jsでRSS(feed)を作る

Next.jsでRSS(feed)を作った際の備忘録。作るのにちょっと苦戦したが問題なく作ることができた。今回もmicroCMSでの実装例となる

完成イメージ

事前準備

rssとfeedというライブラリがあるようだった。今回はfeedを利用した。

npm install feed

実装の流れ

ファイルを2つ作成する。1つは「/_libs/」ディレクトリの中に「feed.ts」を作成する。2つ目はapp直下に「feed.xml」というディレクトリを作成し、その配下に「route.ts」というファイルを作成した。

「feed.ts」に以下のように記述した

import { Feed } from "feed";
import { getAllNewsList } from "@/app/_libs/microcms";

export const generateRssFeed = async (): Promise<string> => {
  const baseUrl = "{ブログのURLをいれる}";
  const feed = new Feed({
    title: "{ブログタイトルをいれる}",
    description: "{descriptionをいれる}",
    id: baseUrl,
    link: baseUrl,
    language: "ja",
    copyright: "{コピーライトをいれる}",
    generator: baseUrl,
  });

  const posts = await getAllNewsList();

  posts.forEach((post) => {
    const publishDate = post.publishedAt
      ? new Date(post.publishedAt)
      : new Date();

    feed.addItem({
      title: post.title,
      description: post.description,
      date: publishDate,
      id: `${baseUrl}/blog/${post.id}`, //URLの体系が異なる場合は適宜変更
      link: `${baseUrl}/blog/${post.id}`, //URLの体系が異なる場合は適宜変更
    });
  });

  return feed.rss2();
};

続いて「route.ts」には以下のように記述した

import { generateRssFeed } from "@/app/_libs/feed";

export const GET = async () => {
  const xml = await generateRssFeed();

  const response = new Response(xml, {
    status: 200,
    headers: {
      "Cache-Control": "s-maxage=86400, stale-while-revalidate", // 24時間キャッシュする
      "Content-Type": "text/xml",
    },
  });

  return response;
};

RSSの文法が正しいかチェック

https://validator.w3.org/feed/というサイトでチェックした。結果は無事問題なしの結果が出た。一部推奨事項が出たが今回はこのままOKとする

つまづいたところ(今回は未対応)

metaの情報は自分の場合、layout.tsxで扱っていたので、importしようとしたがうまくいかなかった。いつかうまいことまとめたいが、ブログタイトルもdescriptionもそんなに高頻度で変更しないので、直書きでもよいかと思ってそのままにした。(もし変えるとなってもそれほど工数変わらないので)

参考にしたページ

Next.js+ヘッドレスCMSではじめる! かんたんモダンWebサイト制作入門 高速で、安全で、運用しやすいサイトのつくりかた
Next.js+ヘッドレスCMSではじめる! かんたんモダンWebサイト制作入門 高速で、安全で、運用しやすいサイトのつくりかた
Amazon楽天市場Yahoo!ショッピング

関連記事