2025年03月17日
タイトルのとおり。
この日記サイトはHonoXとmicroCMSで動かしていて、先日FEED配信機能を追加した。
というわけで今日はさくっと実装内容を共有。
ちょっと前に同様のスタックでsitemapを生成する記事を紹介していた。
HonoXとmicroCMSのブログでsitemapをサクッと動的に生成
このときはroutes配下にsitemap.xml.ts
を作成してテキストを{ "Content-Type": "application/xml" }
で返せばよかった。
なので、FEEDも配信も同様にfeed.atom.ts
のようなエンドポイントファイルを作成して、テキストを生成したのちに、{"Content-Type":"atom+xml"}
で返せばいい。
以下のようなコードになった。
import { createRoute } from "honox/factory";
import { config } from "../settings/siteSettings";
import type { MicroCMSListResponse } from "microcms-js-sdk";
import type { Post } from "../types/blog";
import { MicroCMSClient } from "../libs/microcmsClient";
import { jstDatetime } from "../utils/jstDatetime";
export default createRoute(async (c) => {
const client = new MicroCMSClient(c.env.SERVICE_DOMAIN, c.env.API_KEY);
const limit = 50;
const r = await client.getListResponse<MicroCMSListResponse<Post>>("post", {
limit: limit,
fields: "id,title,updatedAt,createdAt,description",
});
const baseUrl = config.siteURL;
const feedItems: string[] = [];
for (const post of r.contents) {
feedItems.push(` <entry>
<title>${post.title}</title>
<link href="${baseUrl}/post/${post.id}" />
<id>${baseUrl}/post/${post.id}</id>
<updated>${jstDatetime(post.updatedAt)}</updated>
<published>${jstDatetime(post.createdAt)}</published>
<summary>${post.description ? post.description.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">") : ''}</summary>
</entry>`);
}
const atomFeed = `<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>${config.siteTitle}</title>
<link href="${baseUrl}/feed.atom" rel="self"/>
<link href="${baseUrl}/"/>
<id>${baseUrl}/</id>
<updated>${jstDatetime(new Date().toISOString())}</updated>
${feedItems.join("")}
</feed>`;
return c.text(atomFeed,200,{"Content-Type":"atom+xml"})
});
あまり難しいことはなく適当に50件程度記事を取得して、FEED配信に即したxmlテキストを生成して返す。
/feed.atom
にアクセスするとxmlデータが表示される。
この日記サイトのフィード配信URL。
https://qlitre-dialy.ink/feed.atom
あとは適当なリーダーに登録してもらえば最新の記事が取得される。
iPhoneのNetNewsWireで取得した例。最新のエントリが配信された。
これは良い。これから日記の更新を増やそうと思っている、よろしければぜひFEED登録してみてください。ではでは。