Карта сайта на NodeJS или sitemap.xml
Для интеграции с поисковыми системами нам потребуется генератор карты сайта. Ничего лишнего, просто список урлов.
Научим наш блог генерировать такой sitemap.xml на стороне NodeJS.
Нам потребуется пакет sitemap.
Установим нужные зависимости:
npm i apicache sitemap --save
Пакет apicache
штука нужная, он позволяет кешировать результат работы контроллера. Это очень удобно, если ручка генерирует очень большие данные. Ну да ну да) в нашем блоге будет много данных) Вообще этой техникой, можно кешировать не только sitemap.xml
, но и страницы которые генерируются через SSR. Сильно сэкономите ресурсы сервера.
Ок, вернемся к карте сайта.
Сперва сделаем эндпоинт для sitemap.xml
const sitemap = async (req, res) => {
// Тут будем генерировать XML
}
const cache = require('apicache').middleware;
const { Router } = require('express');
const router = Router();
router.get('/sitemap.xml', cache('5 minutes'), sitemap);
// app.use('/blog/', router); // Эту часть вы пишите сами
Ну и собственно сам контроллер:
const sitemap = async (req, res) => {
const { SitemapStream, streamToPromise } = require('sitemap');
const { Readable } = require('stream');
// An array with your links
const links = [
{
url: '/blog/',
changefreq: 'daily',
priority: 0.3
}
].concat(
(await Post.all()).map(post => ({
url: `/blog/${post.slug || post.id}/`,
changefreq: 'daily',
priority: 0.3
}))
);
// Create a stream to write to
const stream = new SitemapStream({ hostname: 'https://xdan.ru' });
res.header('Content-Type', 'application/xml');
// Return a promise that resolves with your XML string
res.send(
await streamToPromise(Readable.from(links).pipe(stream)).then(data =>
data.toString()
)
);
}
Что такое Post
я уже писал - это модель Sequelize. У вас может быть все что угодно, хоть бы и просто статичный массив.
Вот и все, добавляем новую карту сайта в Yandex.Вебмастер и Гугл.Консоль и наслаждаемся жизнью.
Всем Добра!