Почему Яндекс плохо индексирует сайты на JavaScript
К нам регулярно приходят с одной и той же историей: сделали современный сайт, он быстрый и красивый, в Google понемногу находится, а в Яндексе трафика нет вообще. Почти всегда причина одна — содержимое появляется только после того, как отработает JavaScript.
Как поисковик вообще видит страницу
Робот делает обычный HTTP-запрос и получает HTML. Если весь текст уже в этом HTML — робот увидел страницу целиком за один заход, и на этом всё.
Если HTML почти пустой, а содержимое подставляет скрипт, нужен второй этап: поставить страницу в очередь на отрисовку, запустить браузер, дождаться выполнения скриптов, забрать результат. Это дороже и делается не сразу.
В чём разница между Яндексом и Google
Google научился этому раньше и делает это шире. Отрисовка всё равно откладывается — от нескольких часов до нескольких недель, — но она происходит.
Яндекс обрабатывает JavaScript ограниченно и с большей задержкой. На практике это значит, что рассчитывать на отрисовку нельзя: страница может проиндексироваться такой, какой её отдал сервер. Если сервер отдал каркас без текста — в индекс попадёт каркас без текста.
Отсюда простое правило, которое мы держим в проектах: весь смысловой контент обязан быть в первичном HTML. Не «желательно» — обязан.
Что конкретно ломается
Контент, который подгружается запросом после загрузки. Описание услуги, характеристики товара, отзывы — если они приезжают отдельным запросом, для робота их нет.
Маршрутизация без серверного рендеринга. Одностраничное приложение может отдавать один и тот же пустой HTML на все адреса, а нужную страницу собирать уже в браузере. Для поисковика это означает, что все адреса сайта выглядят одинаково пустыми.
Табы и аккордеоны на условном рендеринге. Здесь ошибаются чаще всего,
и она самая обидная. Если содержимое вкладки появляется в разметке только
после клика — его нет в DOM, а значит нет и для робота. Тот же блок,
сделанный на details или скрытый стилями, остаётся в разметке и индексируется
нормально. Разница в одну строчку кода, а последствия — целые разделы мимо индекса.
Ленивая подгрузка списков. Товары, догружающиеся при прокрутке, робот не увидит: он не прокручивает.
Как проверить свой сайт за минуту
Самый честный способ — запросить страницу так же, как это делает робот, и посмотреть, что пришло:
curl -A "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)" https://ваш-сайт.ru/страница
Если в ответе нет текста, который вы видите в браузере, — проблема подтвердилась. Быстрая альтернатива без командной строки: отключите JavaScript в настройках браузера и откройте сайт. Увиденное близко к тому, что получает Яндекс.
Ещё есть «Проверка ответа сервера» в Яндекс.Вебмастере — она показывает именно тот HTML, который получает робот.
Что с этим делать
Ответ не в том, чтобы отказаться от JavaScript. Он в том, чтобы HTML приходил готовым с сервера, а скрипты только добавляли интерактивность поверх. Это серверный рендеринг или генерация страниц на сборке — оба подхода поддерживаются всеми современными фреймворками.
Важная оговорка: сам по себе JavaScript ничего не портит. Счётчики, формы, интерактивные элементы — всё это нормально работает и никак не мешает индексации. Вопрос ровно один: находится ли текст, ради которого человек пришёл из поиска, в том HTML, который отдал сервер.
Почему это дешевле решать сразу
Переделать способ рендеринга на готовом сайте — это, по сути, переписать его заново, и обычно с временной просадкой позиций. Заложить серверный рендеринг на старте не стоит почти ничего. Поэтому в разработке мы начинаем именно с этого решения, а не возвращаемся к нему потом.
