Blog

For solo engineers, but not only.

Crafting an RSS Feed with Next.js 14

February 19, 2024Lev Gelfenbuim3 min. read

While JSON has become the de facto standard for web APIs, XML remains pivotal in specific use cases, such as RSS feeds. RSS feeds allow users to stay updated with content changes or news without manually checking the website. This post delves into creating an RSS feed for a blog or news section of a website using Next.js 14, showcasing how XML responses can be efficiently rendered and served.

Why Render XML in Next.js?

Leveraging Next.js 14 for an RSS feed involves generating XML content on the server side, enabling efficient content distribution and updates for subscribers. This approach benefits content-rich applications, such as blogs, news sites, and e-commerce platforms, by enhancing user engagement and content discoverability.

Use Case: RSS Feed for a Blog

An RSS feed for a blog is a classic example where XML rendering is essential. It allows readers to subscribe to the blog's updates, receiving notifications for new posts without visiting the blog directly. This functionality not only improves the user experience but also helps in building a loyal reader base.

Step-by-Step Implementation
  1. Set Up Your Next.js Project: Start with a Next.js 14 project. If you're new to Next.js, you can create a project using pnpm dlx create-next-app rss-feed.
  2. Create an API Route for the RSS Feed:
    • In the app/api/ directory, create a file named feed/route.ts. This file will handle the generation of the RSS feed.
    • Utilize Next.js route handlers to construct the XML structure of the RSS feed, filling in details like the blog title, description, and individual blog posts.
  3. Generating XML for RSS:
    • Inside api/feed/route.ts, construct the XML document as a string. Begin with the RSS standard declaration and the channel metadata, including the title, link, and description of your blog.
    • Fetch your blog posts from your data source, whether it's a headless CMS, markdown files, or a database.
    • Iterate over your blog posts, appending each item to the XML string with appropriate tags like <item>, <title>, <link>, and <description>.
1export async function GET(request: Request) {
2  const blogPosts = [
3    {
4      title: "First Post",
5      description: "This is the first post.",
6      link: "https://example.com/first-post",
7      pubDate: new Date().toUTCString(),
8    },
9    {
10      title: "Second Post",
11      description: "This is the second post.",
12      link: "https://example.com/second-post",
13      pubDate: new Date().toUTCString(),
14    },
15  ];
16
17  const feed = `<?xml version="1.0" encoding="UTF-8" ?>
18    <rss version="2.0">
19        <channel>
20            <title>My Blog</title>
21            <link>https://example.com</link>
22            <description>This is my blog where I share my thoughts.</description>
23            <language>en-us</language>
24            ${blogPosts
25              .map(
26                (post) => `
27            <item>
28                <title>${post.title}</title>
29                <link>${post.link}</link>
30                <description>${post.description}</description>
31                <pubDate>${post.pubDate}</pubDate>
32            </item>
33            `
34              )
35              .join("")}
36        </channel>
37    </rss>`;
38
39  return new Response(feed, {
40    status: 200,
41    headers: { "Content-Type": "application/rss+xml" },
42  });
43}
  1. Serving the RSS Feed:
    • Ensure the route handler sets the correct Content-Type header to application/rss+xml. This informs browsers and RSS readers that the content is XML.
    • Return the XML content as the response from the route handler.
  2. Testing Your Feed:
    • Once implemented, test your RSS feed by navigating to http://localhost:300/api/feed on your local development server. You should see the XML content rendered in the browser.
    • Use RSS feed validators available online to ensure your feed meets the RSS specification and is ready for consumption by RSS readers.
1curl -i http://localhost:3000/api/feed
2HTTP/1.1 200 OK
3vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Url
4content-type: application/rss+xml
5Date: Mon, 19 Feb 2024 22:11:25 GMT
6Connection: keep-alive
7Keep-Alive: timeout=5
8Transfer-Encoding: chunked
9
10<?xml version="1.0" encoding="UTF-8" ?>
11<rss version="2.0">
12    <channel>
13        <title>My Blog</title>
14        <link>https://example.com</link>
15        <description>This is my blog where I share my thoughts.</description>
16        <language>en-us</language>
17        <item>
18            <title>First Post</title>
19            <link>https://example.com/first-post</link>
20            <description>This is the first post.</description>
21            <pubDate>Mon, 19 Feb 2024 22:11:25 GMT</pubDate>
22        </item>
23        <item>
24            <title>Second Post</title>
25            <link>https://example.com/second-post</link>
26            <description>This is the second post.</description>
27            <pubDate>Mon, 19 Feb 2024 22:11:25 GMT</pubDate>
28        </item>
29
30    </channel>
31</rss>
Conclusion

Rendering XML with Next.js 14 for an RSS feed is a straightforward process that significantly benefits content distribution. By following the steps outlined above, developers can implement a robust RSS feed, enhancing content accessibility and engagement for their users. This use case exemplifies the versatility of Next.js in handling various content formats, further establishing it as a powerful tool for modern web development.

Article last update: February 19, 2024

Next.js
Webdev