MDX (Markdown + JSX) позволяет комбинировать разметку Markdown с компонентами React. Это делает MDX мощным инструментом для создания динамического контента в приложениях на Next.js, Gatsby и других фреймворках. Одной из частых задач является отображение внешних данных, таких как RSS-ленты, непосредственно внутри MDX-документов.
Для работы с RSS в JavaScript обычно применяются парсеры вроде
rss-parser или встроенные функции Node.js с использованием
xml2js. MDX позволяет интегрировать эти данные через
импорты и функции, чтобы лента автоматически рендерилась как
компонент.
npm install rss-parser
После установки создается экземпляр парсера:
import Parser fr om 'rss-parser';
const parser = new Parser();
Для загрузки RSS-ленты используется метод parseURL:
async function fetchRSS(url) {
const feed = await parser.parseURL(url);
return feed.items;
}
feed.items — массив объектов, каждый из которых содержит
свойства: title, link, pubDate,
contentSnippet и другие, доступные в конкретной
RSS-ленте.
MDX позволяет импортировать React-компоненты и использовать их внутри документации. Пример компонента для отображения RSS:
import { useEffect, useState } fr om 'react';
export default function RSSFeed({ url, lim it = 5 }) {
const [items, setItems] = useState([]);
useEffect(() => {
async function loadFeed() {
const feedItems = await fetchRSS(url);
setItems(feedItems.slice(0, lim it));
}
loadFeed();
}, [url, limit]);
return (
<ul>
{items.map(item => (
<li key={item.link}>
<a href={item.link} target="_blank" rel="noopener noreferrer">
{item.title}
</a>
<p>{item.pubDate}</p>
<p>{item.contentSnippet}</p>
</li>
))}
</ul>
);
}
MDX поддерживает импорт и использование компонентов React напрямую:
import RSSFeed fr om './components/RSSFeed';
# Новости
<RSSFeed url="https://example.com/rss" lim it={10} />
Такой подход позволяет держать динамический контент, загружаемый с внешних источников, внутри статических страниц MDX.
Для удобства отображения можно фильтровать и сортировать элементы RSS. Например, сортировка по дате публикации:
items.sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate));
Фильтрация по ключевому слову в заголовке:
const filteredItems = items.filter(item => item.title.includes('JavaScript'));
В комбинации с MDX это позволяет создавать адаптивные блоки контента с динамическими списками.
В Next.js и Gatsby часто применяется подход генерации статических страниц. Для этого RSS-запрос выполняется на этапе сборки, а результат передается в MDX через пропсы:
export async function getStaticProps() {
const items = await fetchRSS('https://example.com/rss');
return { props: { rssItems: items } };
}
В MDX можно затем использовать переданные данные:
{rssItems.map(item => (
<li key={item.link}>
<a href={item.link}>{item.title}</a>
</li>
))}
Это позволяет уменьшить количество запросов на клиенте и ускоряет загрузку страниц.
slice, limit), чтобы не перегружать
интерфейс.useEffect или статической генерации
через getStaticProps является стандартной практикой.Для производительных приложений рекомендуется:
Suspense и динамический импорт компонентов
для ленивой загрузки.Эти подходы позволяют интегрировать внешние RSS-данные в MDX без ущерба для скорости и удобства использования страниц.