Chupurnov Valeriy
Chupurnov Valeriy
Front End Engineer

Карта сайта на NodeJS или sitemap.xml

/blog/uploads/images/1631634531332-image-image.webp

Для интеграции с поисковыми системами нам потребуется генератор карты сайта. Ничего лишнего, просто список урлов.

Научим наш блог генерировать такой 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.Вебмастер и Гугл.Консоль и наслаждаемся жизнью.

Всем Добра!