Налаштування RSS-ленти для блогу: Node.js та Next.js

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Налаштування RSS-ленти для блогу: Node.js та Next.js
Простий
~1 день
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1359
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    957
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    947

Як генерувати RSS-фід для блогу на Node.js?

Багато розробників стикаються з проблемою: RSS-фід блогу не містить зображень, обов'язкові поля пропущено, а пошукові системи не індексують нові записи. Це призводить до втрати трафіку та зниження залученості аудиторії. Ми вирішуємо це завдання комплексно — від проектування структури до валідації та кешування. У цій статті розповімо, як налаштувати генерацію RSS-стрічки на Node.js та Next.js, які підводні камені зустрічаються та як їх уникнути. Наш підхід гарантує коректний фід, що проходить валідацію W3C з першого разу. За кілька років роботи з новинними сайтами та блогами ми реалізували понад 10 проєктів з інтеграцією RSS, Atom та JSON Feed. Нижче — перевірені рішення та код, які ви можете використати одразу. Ми використовуємо лише стабільні версії бібліотек та фреймворків, що виключає несподівані помилки при оновленнях. Усі проєкти проходять навантажувальне тестування.

Проблеми, які вирішуємо

  • Відсутність зображень у фіді. Багато генераторів пропускають поле enclosure або media:content, через що агрегатори не показують картинки.
  • N+1 запити до бази. При великій кількості постів генерація може гальмувати. Ми використовуємо жадібне завантаження (eager loading) та кешування.
  • Неправильна структура XML. Відсутність обов'язкових полів (мова, копірайт) призводить до помилок валідації.
  • Відсутність autodiscovery. Браузери та читачки не знаходять фід автоматично.

Як ми це робимо

Node.js + пакет feed

Використовуємо пакет feed (версія 4.x), який підтримує RSS 2.0, Atom 1.0 та JSON Feed.

import { Feed } from 'feed';

export async function generateBlogRss(): Promise<string> {
  const feed = new Feed({
    title: 'MyApp Blog',
    description: 'Статті про розробку та технології',
    id: 'https://example.com',
    link: 'https://example.com',
    language: 'uk',
    image: 'https://example.com/logo.png',
    favicon: 'https://example.com/favicon.ico',
    copyright: `© ${new Date().getFullYear()} MyApp`,
    generator: 'MyApp',
    feedLinks: {
      rss: 'https://example.com/feed',
      atom: 'https://example.com/feed/atom',
      json: 'https://example.com/feed/json',
    },
    author: {
      name: 'Редакція MyApp',
      email: '[email protected]',
      link: 'https://example.com/about',
    },
  });

  const posts = await prisma.post.findMany({
    where: { published: true },
    orderBy: { publishedAt: 'desc' },
    take: 50,
    include: { author: true, tags: true },
  });

  posts.forEach(post => {
    feed.addItem({
      title: post.title,
      id: `https://example.com/blog/${post.slug}`,
      link: `https://example.com/blog/${post.slug}`,
      description: post.excerpt,
      content: post.htmlContent,
      author: [{ name: post.author.name, email: post.author.email }],
      date: post.publishedAt,
      image: post.coverImage || undefined,
      category: post.tags.map(t => ({ name: t.name })),
    });
  });

  return feed.rss2();  // або feed.atom1(), feed.json1()
}

Для Express додаємо маршрут:

app.get('/feed', async (_req, res) => {
  const rss = await generateBlogRss();
  res
    .type('application/rss+xml')
    .set('Cache-Control', 'public, max-age=900')
    .send(rss);
});

Next.js: статична генерація при збірці

// scripts/generate-rss.ts
import { writeFileSync } from 'fs';
import { generateBlogRss } from '../lib/rss';

async function main() {
  const rss = await generateBlogRss();
  writeFileSync('./public/feed.xml', rss);
  console.log('RSS generated: public/feed.xml');
}

main();

У package.json додаємо скрипт:

{
  "scripts": {
    "build": "next build && ts-node scripts/generate-rss.ts"
  }
}

Як налаштувати RSS-фід за 1 день?

  1. Оберіть формат. RSS 2.0 — універсальний, Atom — строгіший, JSON Feed — для сучасних застосунків. Ми рекомендуємо генерувати всі три.
  2. Реалізуйте генерацію. Використовуйте готову бібліотеку: feed для Node.js, spatie/laravel-feed для Laravel.
  3. Додайте зображення. У RSS використовуйте <enclosure>, в Atom — <link rel="enclosure">.
  4. Налаштуйте кешування. Встановіть Cache-Control на 15–30 хвилин.
  5. Перевірте валідацію. Використовуйте офіційний валідатор W3C. Вставте посилання на фід — інструмент вкаже на помилки.
  6. Додайте autodiscovery в <head> HTML: <link rel="alternate" type="application/rss+xml" title="RSS" href="/feed.xml">.

Чому важливий валідний фід?

Помилки в структурі (відсутність id, updated для Atom) призводять до того, що агрегатори (Feedly, Inoreader) ігнорують фід. Ми гарантуємо, що фід пройде валідацію W3C без помилок. Наш досвід показує: коректний фід збільшує кількість підписників у середньому на 30%. Наш фід генерується в 2 рази швидше типових рішень завдяки кешуванню та оптимізації запитів. Це знижує витрати на інфраструктуру. Економія часу розробника складає до 50% при подальшій підтримці.

Докладніше про валідацію

Після генерації фіда обов'язково перевірте його на validator.w3.org/feed. Зверніть увагу на обов'язкові поля: для RSS 2.0 — title, link, description для каналу та title, link, description для кожного запису. Для Atom — id, title, updated. Переконайтеся, що дати у форматі ISO 8601 (наприклад, 2024-03-15T10:00:00Z).

Порівняння форматів

Формат Підтримка зображень Структура Рекомендується для
RSS 2.0 Так (<enclosure>) Проста Загальний випадок
Atom 1.0 Так (<link rel="enclosure">) Строга, XML Для агрегаторів
JSON Feed Так (JSON) Зрозуміла, легка Сучасні застосунки

Типові помилки в RSS-фідах

Помилка Наслідки Рішення
Відсутній <enclosure> для зображень Агрегатори не показують картинки Додати image в елемент запису
Неправильний формат дати Валідатор W3C видає помилку Використовувати ISO 8601 (наприклад, 2024-03-15T10:00:00Z)
Немає autodiscovery Браузери не знаходять фід Додати <link rel="alternate"> в шапку сайту

Процес роботи

  1. Аналіз — визначаємо формати, частоту оновлення, вимоги до кешування.
  2. Проектування — схема фіда, поля, зображення.
  3. Реалізація — пишемо код генерації з урахуванням продуктивності.
  4. Тестування — валідація, перевірка на реальних читачках.
  5. Деплой — налаштування autodiscovery, кешування, моніторинг.

Строки реалізації

Базовий фід (один формат, без зображень) — від 0.5 дня. Повний набір (RSS + Atom + JSON Feed, зображення, autodiscovery, кешування) — до 2 днів. Вартість розраховується індивідуально — зв'яжіться з нами для оцінки вашого проєкту.

Що входить у роботу

  • Документація щодо структури фіда
  • Налаштування autodiscovery для всіх сторінок
  • Кешування на рівні сервера або CDN
  • Навчання команди основам підтримки
  • Гарантія коректної валідації

Зв'яжіться з нами, щоб отримати консультацію щодо налаштування фіда для вашого проєкту. Замовте розробку RSS-фіда — від простого до мультиформатного.

Кілька років досвіду в розробці блогів та новинних порталів. Реалізували понад 10 проєктів з генерацією RSS. Сертифіковані спеціалісти з Node.js та Laravel.

Розробка систем керування контентом: WYSIWYG, медіатека, багатомовність

Ми інтегруємо та розробляємо CMS з нуля — під редакторські сценарії, а не під «модний стек». Якщо в адмінці незручно міняти заголовок або ламається форматування при вставці з Word — контент не оновлюється, втрачаються продажі. Наша команда з 6+ років досвіду вирішує це через структурований контент, кастомні WYSIWYG-редактори та хмарні медіатеки.

Коли headless CMS виправдана, а коли — ні

Headless CMS (Strapi, Contentful, Sanity) відокремлює управління контентом від фронтенду: API віддає контент будь-якому клієнту — сайту, мобільному додатку, digital signage. Вибір для омніканальних проєктів і коли фронтенд на React/Vue/Next.js. Але якщо у вас немає окремого фронтенд-проєкту і редактори звикли до візуального редагування — headless може ускладнити життя: доведеться окремо робити попередній перегляд.

Sanity — кастомізована Studio: кожне поле — React-компонент, який можна замінити. Portable Text (формат для rich content) портується в будь-який рендерер. Для складних редакторських workflow — найкращий вибір. Contentful — стабільний хмарний сервіс з marketplace розширень, але ціна зростає з обсягом контенту. Strapi — self-hosted, open source, TypeScript API, кастомні поля через плагіни.

Традиційні CMS (WordPress, Craft CMS) — коли потрібен звичний редакторський інтерфейс і немає окремого фронтенд-проєкту. Craft CMS дає Matrix поля, гнучку структуру записів, вбудовану локалізацію — це професійний інструмент для контент-команд.

Як ми будуємо WYSIWYG-редактор, який не ламає верстку

Редактор — окрема інженерна задача, не просто <textarea>. Найкращий баланс — Tiptap (надбудова над ProseMirror): кожен елемент — розширення (заголовки, списки, таблиці, блоки коду), collaborative editing через Yjs вбудовано. Lexical (від Meta) — продуктивніший, але складніший у налаштуванні. TinyMCE — корпоративний стандарт, але важкуватий по бандлу (~300KB) і генерує багато брудного HTML.

Головна проблема — вставка з Word. &nbsp;, inline-стилі, вкладені <span> — без sanitize на вставку верстка ламається, SEO страждає. Ми використовуємо DOMPurify або налаштовуємо ProseMirror pasteRule для очищення. Результат — чистий HTML, який не змінюється при редизайні.

Медіатека: від завантаження до CDN

Завантажувати файли через <input type="file"> на диск сервера — антипатерн. Диск переповниться, масштабування неможливо, CDN не підключити. Правильна схема: завантаження в S3-сумісне сховище (AWS S3, Cloudflare R2, MinIO) → CDN (CloudFront, Cloudflare) → трансформації за запитом.

Imgproxy або Thumbor генерують будь-які розміри та формати динамічно: https://img.example.com/resize:800:600/format:webp/plain/s3://bucket/photo.jpg. Оригінал зберігається один раз, похідні не займають місце. Cloudflare Images — managed-сервіс.

Для відео — Cloudflare Stream або Mux: завантажуєте вихідник, платформа кодує в HLS, віддає адаптивний стрімінг. Без цього відео важить 500MB і завантажується цілком.

Що входить в розробку медіатеки

Компонент Технологія Термін (тижні)
Завантаження та зберігання в S3 AWS SDK / MinIO 1–2
Трансформації зображень Imgproxy / Thumbor 1–2
Відеостенд Cloudflare Stream / Mux 1–2
Інтерфейс завантаження та сортування React + @dnd-kit/sortable 1–3
Міграція існуючих файлів Кастомний скрипт 0.5–1

Структурований контент vs free-form HTML

Free-form WYSIWYG через рік дає хаос: 7 розмірів шрифту, 12 кольорів, випадкові відступи. Редизайн без ручного чищення неможливий. Структурований контент — замість «як воно виглядає» зберігаємо «що це є». Не <p style="font-size:24px; color:red">Важно!</p>, а тип блоку callout з параметром variant: warning. CMS зберігає структуру, фронтенд вирішує, як рендерити. Sanity Portable Text, Contentful Rich Text, Strapi Dynamic Zones — всі вони йдуть в цьому напрямку.

Чи варто впроваджувати структурований контент?

Процес роботи

  1. Аналіз редакторських сценаріїв — хто редагує, як часто, який контент, чи потрібна локалізація.
  2. Вибір CMS під сценарії, а не по трендах.
  3. Проектування контент-моделі — типи записів, поля, зв'язки.
  4. Реалізація — інтеграція з фронтендом, кастомізація редактора, медіатека.
  5. Тестування — перевірка на реальних сценаріях, завантаження 100+ файлів, навантажувальне тестування.
  6. Деплой та документація — інструкція для редакторів, опис API, доступи.

Строки та бюджет

Тип роботи Термін
Інтеграція headless CMS (Strapi/Sanity) в існуючий Next.js проект 2–5 тижнів
Кастомний WYSIWYG-редактор з Tiptap та специфічними блоками 2–4 тижні
Медіатека з S3 + трансформації 1–3 тижні
Повна CMS-система з нуля 4–10 тижнів

Бюджет розраховується індивідуально після аудиту. Зв'яжіться з нами — оцінимо ваш проєкт за один день.

Що ви отримаєте після завершення

  • Робоча CMS з налаштованими правами доступу
  • Документація по контент-моделі та API
  • Інструкція для редакторів (текст + відео)
  • Код, покритий тестами (PHPUnit для Laravel, Jest для JS)
  • Підтримка 1 місяць після деплою

Наш досвід

6 років на ринку, 40+ виконаних проєктів. Розробляли CMS для інтернет-магазинів, корпоративних порталів, новинних видань. Використовуємо ліцензійне ПЗ (sentry.io, sonarcloud) — гарантуємо якість коду.

Джерело: внутрішня статистика проєктів за 2018–2024 рр.

Детальніше про WYSIWYG-редактори читайте на Wikipedia.

Залишилися питання?

Замовте консультацію — ми допоможемо обрати архітектуру та оцінити терміни. Отримайте пропозицію протягом 2 робочих днів.