دعم rss feeds في مشروع nextjs

سليمان العثمان
سليمان العثمان
١ ديسمبر ٢٠٢٣
Cover Image for دعم rss feeds في مشروع nextjs

إن من الأدوات المفيدة لإبقاء قراء و زوار الموقع على إطلاع بأحدث التدوينات و الأخبار دون الحاجة منهم إلى زيارته يدويًا باستمرار هي RSS، حيث تسمح لهم بمعرفة آخر التدوينات و الأخبار المطروحة بشكل تلقائي، و هو أمر جيد كذلك لزيادة عدد الزيارات و الزوار لموقعك بطريقة غير مُباشرة، و في هذه التدوينة سنتطرق إلى ما هو RSS و كيفية إضافته لمشروع Next.js.

ما هو RSS؟

RSS (Really Simple Syndication) هو تنسيق موجز ويب يُستخدم لنشر المحتوى الذي يتم تحديثه بشكل متكرر، مثل منشورات المدونات و المقالات الإخبارية و البودكاست، بطريقة موحدة يمكن قراءتها بسهولة من خلال التطبيقات الأخرى. فهو يتيح للمستخدمين الإشتراك في مواقع الويب المفضلة لديهم و تلقي التحديثات تلقائيًا، مما يجعلها أداة قيمة لكل من مالكي مواقع الويب والقراء.

فوائد استخدام خدمة RSS

هناك عدة أسباب تجعل إضافة RSS على الموقع الخاص بك مُفيدًا، فإنه يسهل على القراء و الأشخاص الذين يفضّلون RSS Reader البقاء على إطلاع بآخر تحديثات للمحتوى الموجود في موقعك، دون الحاجة منهم إلى التحقّق من موقعك عبر زيارته يدويًا، و بذلك يمكن أن يُؤدي ذلك إلى زيادة عدد الزيارات للموقع، حيث من المُرجّح أن يقرأ الزائر و القارئ المحتوى الخاص بك بإنتظام.

بالإضافة إلى ذلك يمكن أن تساعد RSS في زيادة ظهور الموقع و مدى وصوله، من خلال مشاركة المحتوى مع مواقع و منصات الأخرى، و بذلك وصول إلى جمهور أوسع و قراء جدد للمحتوى المطروح في موقعك!

إعداد موجز RSS في موقع Next.js

ملاحظة : الشرح القادم تم تطبيقه على هيكلة App router التي أتت مع إصدار 13 لـ Next.js، في حال أردت شرح لهيكلة src directory فستجدها في الرابط المرفق في قسم المصادر و المراجع.

أولاً، ستحتاج إلى استخدام مكتبة يمكنها إنشاء RSS feeds بناءً على محتوى موقع الويب الخاص بك. إحدى المكتبات الشائعة لإنشاء خلاصات RSS هي مكتبةfeed.

للبدء، ستحتاج أولاً إلى تثبيت مكتبة feed باستخدام npm أو yarn في مشروعك. افتح Terminal أو CMD في مسار الذي يُوجد به مشروعك و نفّذ الأمر التالي :

yarn add feed

ثُم نُنشئ مجلد باسم rss.xml داخل مجلد app و نضيف بداخله ملف باسم route.ts ليصبح كالتالي :

/app/rss.xml/route.ts

ثم نُضيف له الكود التالي :

import { getAllPosts } from "@/libs/posts";
import { Feed } from "feed";

async function rss() {
  const posts = await getAllPosts([
    'title',
    'excerpt',
    'date',
    'slug',
    'draft'
  ]);
  const feed = new Feed({
    title: 'مدونة سايفرس',
    description: "من نقطة الصفر و لحظة تكوين و نشوء الشيفرة نستلهم كتابتنا للتدوينة حتى نصل إلى أقصى تعقيداتها و تبسيطها للقارئ",
    id: process.env.NEXT_PUBLIC_URL as string,
    link: process.env.NEXT_PUBLIC_URL,
    language: 'ar',
    image: `${process.env.NEXT_PUBLIC_URL as string}/icon.png`,
    favicon: `${process.env.NEXT_PUBLIC_URL as string}/icon.png`,
    author: {
      name: "سليمان العثمان",
      // email: "john@example.com",
      // link: "http://localhost:3000/about",
    },
    copyright: ""
  });
  posts.map((post) => {
    feed.addItem({
      title: post.title as string,
      link: `${process.env.NEXT_PUBLIC_URL as string}/posts/${post.slug as string}`,
      description: post.excerpt as string,
      date: new Date(post.date as string),
    });
  });

  return feed.rss2();
}


export async function GET() {
  return new Response(await rss(), {
    headers: {
      'Content-Type': 'application/xml; charset=utf-8',
    },
  });
}

شرح الكود

في البداية تم تسمية اسم الملف route.ts من أجل ضبط معالجة الصفحة و جعلها xml بدل html كما سيتبين معنا في شرح الكود.

أستوردنا Feed من مكتبة feed و كذلك دالة getAllPosts.

أنشأنا دالة باسم rss في البداية ثم أستدعينا دالة getAllPosts لجلب التدوينات و حفظناها بمتغير posts.

ثم أنشأنا Feed مع قيّم المطلوبة مثل عنوان المدونة و الوصف و كذلك الرابط ... ألخ

ثم عملنا mapping على posts و في داخلها أضفنا المعلومات التي نريدها لكل تدوينة في feed.

في نهاية دالة rss عملنا return لـ feed بقالب rss نسخة الثانية منه.

ثم أنشأنا دالة GET و هي بالمناسبة تعتبر handler و ذلك لضبط Response الذي يعود للصفحة حين طلبها.

نلاحظ إننا عملنا return لـ new Response و مررنا المحتوى المُنشئ من دالة rss التي أنشأنها سابقًا، و ضبطنا headers من ناحية Content-Type ليكون application/xml، و بتلك الطريقة جعلنا نوع المحتوى للصفحة هو XML.

الآن إذا كان كل شيء على ما يُرام فيمكننا مشاهدة نتيجة من خلال زيارة الرابط التالي :

www.domain.com/rss.xml

و سنجد النتيجة كالتالي :

RSS XML

الخطوة الأخيرة

تبقّت خطوة أخيرة و هي إضافة الموقع مع rss في زر أو أيقونة حيث يمكن للزائر معرفة بأن موقعك يدعم rss.

رابط المكتبة

المصادر و المراجع

Generate an RSS Feed for Your Next.js Website

RSS - Wikipedia

Routing: Route handlers | Next.js

تصميم@sulealothman