Перейти к содержимому
0x17
Разработка

Почему Яндекс плохо индексирует сайты на JavaScript

Основатель 0x17Разработка и продвижение сайтов · в поиске с 2016 · 1 мин чтения

К нам регулярно приходят с одной и той же историей: сделали современный сайт, он быстрый и красивый, в 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, который отдал сервер.

Почему это дешевле решать сразу

Переделать способ рендеринга на готовом сайте — это, по сути, переписать его заново, и обычно с временной просадкой позиций. Заложить серверный рендеринг на старте не стоит почти ничего. Поэтому в разработке мы начинаем именно с этого решения, а не возвращаемся к нему потом.

Основатель 0x17в поиске с 2016

Разработка и продвижение сайтов

Все статьи автора
Услуга по теме статьи

Разработка сайтов, готовых к продвижению

Смотреть услугу
Бесплатный аудит