JavaScript | Sitemap

JavaScript | Sitemap

О чём?

В этой публикации мы разберём вопрос генерации карты сайта для поисковых роботов. Речь пойдёт о создании файла Sitemap.xml силами JavaScript

 

Первый важный момент

Существует две разновидности Sitemap.xml:

  1. Это файл-индекс с набором ссылок на файлы-карты
  2. Это сами файлы-карты

 

Второй важный момент — размер строки адреса

Существуют ограничения самого файлов-индексов и файлов-карт:

  • Количество адресов в файле не должно превышать 50000 штук
  • Размер файла не должен превышать 50 мегабайт (52 428 800 байт)
  • Размер строки-адреса не должен превышать 2048 символов (2048 байт)

Что даёт нам эта информация?

Во-первых, при написании функции генерации Sitemap.xml мы должны учитывать появление файла-индекса. Если мы хотим «скормить» роботам один миллиард адресов, тогда нам понадобится минимум (1000000000 / 50000) = 20000 файлов + 1 файл-индекс, в котором будут лежать ссылки на эти 20К адресов.

Вывод можно сделать такой: переполнить файл-индекс адресами представляется «нереальным» для большинства сайтов (доменов)

Во-вторых, мы должны хорошо представлять структуру сайта, а именно длину его адресов. Приведу 2 примера:

--первый пример

https://www.example.com/
https://www.example.com/1
https://www.example.com/1000000000
--второй пример

https://www.example.www.example.www.example.www.example.com/
https://www.example.www.example.www.example.www.example.com/safgygvjydarkcwbyibvwnwr
https://www.example.www.example.www.example.www.example.com/jhfsdjfhgjevebrhajkbre-aberhbakjervbaverkvubrv-aerbaebrbubiearbuireab-arbhbvraejbhvrehb

 

Как выдумаете? Какой вариант Sitemap.xml быстрее заполнит 50 мегабайт? Мы не будем гадать. Мы посчитаем. (1 символ = 1 байт)

-- первый пример

new Blob(["http://www.example.com/"]).size
23
new Blob(["https://www.example.com/1"]).size
25
new Blob(["https://www.example.com/1000000000"]).size
34
--второй пример

new Blob(["https://www.example.www.example.www.example.www.example.com/"]).size
60
new Blob(["https://www.example.www.example.www.example.www.example.com/safgygvjydarkcwbyibvwnwr"]).size
84
new Blob(["https://www.example.www.example.www.example.www.example.com/jhfsdjfhgjevebrhajkbre-aberhbakjervbaverkvubrv-aerbaebrbubiearbuireab-arbhbvraejbhvrehb"]).size
147

Скрин из браузера

Размеры адресов в байтах - JavaScript
Размеры адресов в байтах — JavaScript

Теперь просто перемножим байты на максимальное возможное количество адресов в файле Sitemap.xml

23*50000 = 1150000 байт (1,1 Мб)
25*50000 = 1250000 байт (1,19 Мб)
34*50000 = 1700000 байт (1,62 Мб)

60*50000 = 3000000 байт (2,86 Мб)
84*50000 = 4200000 байт (4,01 Мб)
147*50000 = 7350000 байт (7,01 Мб)

Последний вариант записи самый ёмкий. Чем длиннее адрес, тем больше он будет занимать места в файле.

 

Третий важный момент — размер «обвязки» строки адреса

Для файлов-индексов обязательны XML-теги:

  • <sitemapindex> Инкапсулирует информацию о всех файлах Sitemap в этом файле.
  • <sitemap> Инкапсулирует информацию об отдельном файле Sitemap.
  • <loc> Указывает местоположение файла Sitemap. Этим местоположением может быть файл Sitemap, файл Atom, файл RSS или простой текстовый файл.

Для файлов-карт обязательны XML-теги:

  • <urlset> Инкапсулирует этот файл и указывает стандарт текущего протокола.
  • <url> Родительский тег для каждой записи URL-адреса. Остальные теги являются дочерними для этого тега.
  • <loc> URL-адрес страницы. Этот URL-адрес должен начинаться с префикса (например, HTTP) и заканчиваться косой чертой, если Ваш веб-сервер требует этого. Длина этого значения не должна превышать 2048 символов.

Есть необязательные XML-теги. Уверен, что поисковые системы хорошо справляются без них. Поэтому даже не буду их рассматривать.

 

Четвёртый важный момент — Маскирование символов

Если у вас не ЧПУ-адреса, то придётся потратить больше символов для редактирования. Рекомендую перевести сайт на ЧПУ (Человеко-Понятные-УРЛы)

Символ Маскирование
Амперсанд & &amp;
Одинарные кавычки &apos;
Двойные кавычки « &quot;
Больше > &gt;
Меньше < &lt;

 

Пятый важный момент —

 

Функция генерации Sitemap.xml на клиенте (браузере) — для файлов-карт

Функция будет принимать массив адресов-строк. Если их будет больше 50000, то массив будет обрезан до 50000 адресов. Функция будет возвращать файл «sitemap.xml» в браузере.

function getSitemapXML(array){
   if (array.length>50000){array.length = 50000};
   var a = array.map(i=>`<url>\n<loc>\n${i}\n</loc>\n</url>\n`).join("");
   var b = `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${a}\n</urlset>`;
   var blob = new Blob([b], {type: "text/plain"});
   var link = document.createElement("a");
   link.setAttribute("href", URL.createObjectURL(blob));
   link.setAttribute("download", "sitemap.xml");
   link.click();
}

Пример работы функции. Создадим массив и зальём его одинаковыми адресами.

var arr = Array(60000)
arr.fill("https://www.example.www.example.www.example.www.example.com/jhfsdjfhgjevebrhajkbre-aberhbakjervbaverkvubrv-aerbaebrbubiearbuireab-arbhbvraejbhvrehb")

Функция генерации sitemap.xml на клиенте — JavaScript

Функция генерации sitemap.xml на клиенте - JavaScript
Функция генерации sitemap.xml на клиенте — JavaScript

Вызываем функцию и передаём в неё наш массив:

getSitemapXML(arr)

Содержимое созданного файла

Функция создала файл sitemap.xml - JavaScript
Функция создала файл sitemap.xml — JavaScript

 

Смотрим, что внутри файла, который скачался из браузера

Сгенерированный sitemap на 50К адресов в браузере Chrome - JavaScript
Сгенерированный sitemap на 50К адресов в браузере Chrome — JavaScript

Хром успешно распознал разметку и нашёл в карте 50 тысяч адресов.

Размер файла sitemap.xml 8,3 мегабайта
Размер файла sitemap.xml 8,3 мегабайта

 

Информационные ссылки

JavaScript | Как сохранить данные в файл на клиенте (браузере)?

XML-формат файла Sitemap — https://www.sitemaps.org/ru/protocol.html