Обсудить проект

Коротко опишите задачу — этого достаточно для первого контакта.

Практическое SEO · JavaScript

JavaScript и SEO: что видит поисковый робот и как проверить рендеринг

Современный сайт может отдавать почти пустой HTML и собирать весь интерфейс уже в браузере. Для пользователя это может работать нормально, а поисковый робот столкнётся с задержкой, ошибкой API, недоступной ссылкой или контентом, который появляется только после действия. Проверяем не наличие JavaScript, а доступность важного содержания и маршрутов.

Основа

JavaScript сам по себе не проблема — проблема в зависимости от хрупкого сценария

Поисковая система умеет обрабатывать JavaScript, но динамическая страница добавляет ещё один этап между получением HTML и появлением полезного содержимого. На этом этапе может не ответить API, не загрузиться bundle, возникнуть ошибка выполнения или не сработать действие, необходимое для показа текста.

Яндекс Вебмастер позволяет управлять рендерингом JavaScript-страниц. По умолчанию робот самостоятельно решает, выполнять ли JavaScript, оценивая полноту и качество содержимого с ним и без него.

Индексирование страниц с JavaScript в Яндекс Вебмастере.

Цель технической проверки — сделать так, чтобы важный контент и ссылки не зависели от единственного сложного сценария, который легко сломать.

Шаг 1

Сравниваем исходный HTML и итоговый DOM

Исходный HTML показывает, что сервер отдаёт до выполнения JavaScript. Итоговый DOM — что появилось после загрузки и работы скриптов. Если заголовок, основной текст, ссылки на категории и карточки существуют только во втором варианте, сайт сильнее зависит от успешного рендеринга.

Для статичных и SSR-проектов различие обычно небольшое. Для SPA исходный документ может содержать только контейнер приложения и ссылки на bundle. Это не означает автоматическую проблему, но требует отдельной проверки того, что робот действительно получает итоговое содержание.

ЭлементВ исходном HTMLПосле JSЧто проверяем
H1 и основной текстЕсть / нетЕсть / нетНе пропадает ли содержимое при ошибке JS
Внутренние ссылкиЕсть / нетЕсть / нетДоступны ли URL роботу как настоящие ссылки
Title и descriptionЕсть / временныеИтоговыеКакая версия попадает в индекс
CanonicalПравильный / шаблонныйМеняется JSНет ли конфликта между версиями

Шаг 2

Основной контент не должен появляться только после сложного взаимодействия

Текст, характеристики или список товаров могут загружаться только после прокрутки, клика, выбора вкладки или выполнения цепочки запросов. Для второстепенного интерфейса это нормально, но основное содержание страницы лучше делать доступным без обязательного пользовательского действия.

Особенно внимательно проверяем lazy-loaded текстовые блоки, вкладки характеристик, бесконечную прокрутку и каталоги, где первые товары появляются только после API-запроса.

Первичный контент

H1, описание и основная сущность страницы доступны сразу после обычной загрузки.

Вкладки

Скрытый интерфейс не должен делать важный текст недоступным до сложного действия.

Infinite scroll

У контента ниже первого набора должен оставаться понятный способ обнаружения по URL или ссылкам.

Ошибки API

При сбое внешнего сервиса страница не должна превращаться в пустой документ без объяснения.

Шаг 4

Title, description и canonical лучше проверять до и после рендеринга

Некоторые frontend-фреймворки меняют метаданные уже после загрузки приложения. Если в исходном HTML у всех страниц один шаблонный Title или canonical, а правильные значения появляются позднее через JavaScript, итог зависит от успешного рендеринга.

На важных посадочных надёжнее, когда критические SEO-сигналы формируются на сервере или в пререндеренной версии. Особенно это важно для canonical: неправильный адрес в исходном документе может конфликтовать с итоговым DOM и внутренней структурой.

Canonical и основной URL

Шаг 5

SSR и пререндеринг уменьшают зависимость от клиентского JavaScript

Server-Side Rendering формирует готовый HTML на сервере, а пререндеринг заранее создаёт HTML-версию страницы. В обоих случаях робот получает больше полезного содержимого до выполнения клиентского JavaScript.

Это не означает, что любой SPA нужно срочно переписывать. Сначала проверяем фактическую индексацию и рендеринг. Если важный контент уже стабильно доступен роботу, архитектурную переделку оцениваем по реальным рискам и стоимости.

В актуальном Яндекс Вебмастере есть отдельная настройка рендеринга JavaScript. Для сайтов с SSR или пререндерингом Яндекс предлагает возможность запретить дополнительный JS-рендеринг, если он не нужен и создаёт лишнюю нагрузку.

Шаг 6

API, задержки и ошибки превращают рендеринг в нестабильный процесс

Даже небольшой frontend может зависеть от нескольких API. Если один запрос медленный или иногда возвращает ошибку, часть страницы появляется с задержкой либо не появляется вообще. Пользователь может нажать «обновить», а робот зафиксирует именно неудачный вариант.

Timeout

Интерфейс ждёт внешний сервис и долго остаётся пустым.

Ошибка API

Вместо содержимого показывается loader или пустой контейнер.

Поздняя загрузка

Важный блок появляется заметно позже события DOMContentLoaded.

Hydration error

Серверный HTML есть, но клиентский код ломает часть уже показанного интерфейса.

Яндекс описывает расширенные настройки для страниц, где контент загружается с задержкой, но использовать их стоит только после понимания архитектуры и реальной причины задержки.

Шаг 7

Проверяем рендеринг через Яндекс Вебмастер

В Вебмастере можно сравнивать обработку страниц с JavaScript и без него, а также управлять выполнением JS для сайта. Это полезно, когда нужно понять, появляется ли основной контент только после выполнения скриптов.

Дополнительно используем «Проверку страницы»: смотрим версию документа в базе и сравниваем её с тем, что видит обычный браузер. Если значимый текст или ссылки отсутствуют, проблема уже подтверждается не только локальным тестом.

Не меняем настройки JS-рендеринга в Вебмастере «на всякий случай». Сначала сравниваем версии страницы и понимаем, какой режим соответствует реальной архитектуре сайта.

Практический пример

Категория есть в браузере, но робот получает почти пустую страницу

Каталог построен как SPA: сервер отдаёт каркас, а товары и текст категории загружаются из API уже после запуска приложения.

ПроверкаРезультатРискДействие
Исходный HTMLТолько app-root и скриптыНет полезного содержания без JSПроверить фактический рендеринг роботом
APIИногда отвечает 3–4 секундыРобот может получить пустой списокУскорить API и добавить устойчивое состояние
Внутренние ссылкиКарточки открываются через обработчикМаршруты хуже обнаруживаютсяИспользовать реальные href
TitleМеняется после запроса APIМетаданные зависят от успешного JSФормировать критические meta раньше
После SSRТекст и ссылки есть в HTMLЗависимость от JS нижеJS остаётся для интерактивности
Браузервсё выглядит нормально
Сравнение HTML/DOMпоказывает зависимость
SSR + реальные ссылкиделают страницу устойчивее

Частые ошибки

Что обычно ломает JavaScript-страницы для поиска

Пустой исходный HTML

Весь смысл страницы зависит от успешной загрузки приложения и API.

Навигация через onclick

Важные маршруты существуют как действия интерфейса, а не обычные ссылки.

Шаблонный Title до JS

У всех URL одинаковые метаданные до завершения рендеринга.

Контент после скролла

Основной текст появляется только после события, которое робот может не воспроизвести.

API без fallback

Одна ошибка превращает документ в пустой loader.

Проверка только глазами

Разработчик видит итоговый DOM и не замечает, что сервер отдаёт совсем другую страницу.

Чек-лист

Проверка JavaScript и рендеринга

  1. Сравнить исходный HTML и DOM: понять, что появляется только после JS.
  2. Проверить H1 и основной текст: важное содержание не должно зависеть от хрупкой цепочки.
  3. Проверить внутренние ссылки: важные маршруты оформлены через реальные href.
  4. Проверить прямой вход: любой SPA-URL открывается корректно без предварительного перехода по приложению.
  5. Проверить Title и description: итоговые метаданные не теряются при сбое рендеринга.
  6. Проверить canonical: исходный HTML и итоговый DOM не конфликтуют.
  7. Проверить API: таймауты и ошибки не оставляют страницу пустой.
  8. Проверить lazy-content: основной текст не появляется только после скролла или клика.
  9. Проверить SSR/пререндеринг: использовать там, где это снижает реальную зависимость от клиента.
  10. Проверить Вебмастер: сравнить обработку страницы с JavaScript и без него.
  11. Проверить серверную нагрузку: дополнительный рендеринг не должен создавать проблемы backend.
  12. Повторить после deploy: frontend-сборка способна изменить поведение сразу всего сайта.

Вопросы

Короткие ответы

JavaScript мешает SEO?

Не сам по себе. Риск появляется, когда важный контент, ссылки или метаданные доступны только после нестабильного рендеринга.

Нужно ли всем SPA делать SSR?

Нет. Сначала проверяем фактическую индексацию. SSR оправдан, когда снижает реальную проблему доступности, скорости или стабильности контента.

Можно ли менять Title через JavaScript?

Можно, но критические метаданные надёжнее иметь уже в исходном HTML или серверно сформированной версии, особенно на важных посадочных.

Почему робот не видит ссылку, которая работает у пользователя?

Переход может быть реализован только через обработчик клика. Для важных внутренних маршрутов лучше использовать обычный элемент a с href.

Как проверить, что Яндекс видит страницу после JavaScript?

Использовать проверку страницы и инструменты JavaScript-рендеринга в Яндекс Вебмастере, а локально сравнить исходный HTML и итоговый DOM.

Практика NIC-SEO

JavaScript оставляем для интерфейса, но не делаем поиск заложником frontend

Проверяем, что основное содержание, ссылки и метаданные доступны устойчиво, а ошибки API или bundle не превращают важную страницу в пустой контейнер.