Top.Mail.Ru Top.Mail.Ru
JavaScript и SEO: проблемы рендеринга и их решения

JavaScript и SEO: проблемы рендеринга и их решения

JavaScript и SEO: проблемы рендеринга и их решения

JavaScript давно перестал быть украшением страницы — на нём строятся каталоги, фильтры и целые интерфейсы. Но поисковый бот видит страницу не так, как пользователь: сначала он получает голый HTML, и только потом, в отдельной очереди, исполняет скрипты. Если ключевой контент появляется лишь после выполнения JS, он может попасть в индекс с задержкой или не попасть вовсе. Этот материал — практический разбор: как Яндекс и Google обрабатывают JavaScript, где ломается индексация и какие схемы рендеринга выбирать.

Как поисковый бот обрабатывает JavaScript

Индексация JS-страницы идёт в два этапа. Сначала краулер скачивает исходный HTML (то, что отдаёт сервер) и парсит ссылки. Затем страница ставится в очередь на рендеринг: бот запускает headless-браузер, исполняет скрипты, дожидается отрисовки DOM и лишь тогда видит финальный контент.

Google рендерит на движке Chromium и обрабатывает JS зрело. Яндекс тоже умеет исполнять JavaScript, но исторически делает это осторожнее и с большей задержкой. Вывод для рынка РФ: нельзя рассчитывать, что весь JS-контент будет одинаково хорошо разобран обоими поисковиками. Чем важнее текст и ссылки для ранжирования, тем меньше их стоит прятать за клиентским исполнением.

Три схемы рендеринга: CSR, SSR и пререндеринг

Стратегия рендеринга определяет, что бот получит в исходном HTML.

Схема Где формируется HTML Виден ли контент боту сразу Когда применять
CSR (клиентский) В браузере после исполнения JS Нет, только после рендеринга Закрытые кабинеты, админки — то, что не индексируется
SSR (серверный) На сервере при каждом запросе Да, полный HTML в ответе Коммерческие каталоги, карточки товаров, листинги
SSG / пререндеринг Заранее в статические файлы Да, готовый HTML Блоги, статьи, стабильные лендинги

CSR (Client-Side Rendering) — самый рискованный для SEO: сервер отдаёт почти пустой <div id="root">, контент дорисовывает браузер. SSR (Server-Side Rendering) решает проблему в корне — бот сразу получает полноценный HTML. SSG (Static Site Generation) и пререндеринг подходят, когда контент меняется редко. Рабочий минимум под Яндекс для коммерции — SSR или гибридные режимы Next.js / Nuxt.

Где ломается индексация: типичные сбои

  • Контент только в JS. Если тексты, цены и <title> появляются лишь после исполнения скриптов, бот может проиндексировать страницу без них. Для коммерческих запросов в Яндексе отсутствие цены и описания — прямой удар по ранжированию.
  • Навигация на onclick вместо <a href>. Бот ходит по ссылкам, а не по JS-обработчикам: меню и пагинация на onclick не передают вес и могут оставить разделы вне индекса.
  • Блокировка JS и CSS в robots.txt. Если каталоги со скриптами и стилями закрыты, бот не отрендерит страницу корректно. Файлы рендеринга должны быть открыты.
  • Таймауты и тяжёлые бандлы. Если скрипты висят на запросах к API, рендеринг может оборваться до появления контента — бот не ждёт бесконечно.
  • Soft 404 на SPA. Несуществующие URL отдают код 200 с пустой оболочкой вместо честного 404/410 — в индекс попадают «пустышки».

Прогрессивное улучшение как базовый принцип

Здоровая архитектура строится по принципу progressive enhancement: сначала рабочий HTML, потом — улучшения через JS. Главный текст, заголовки, цены и внутренние ссылки должны присутствовать в исходном ответе сервера. JavaScript добавляет интерактив (фильтры, подгрузку, анимации), но не должен быть единственным носителем смысла.

Проверить просто: откройте «Просмотр кода страницы» (исходный HTML, не DOM) и поищите ключевой текст и ссылки. Если их нет — для бота их тоже нет до рендеринга. Принцип связан с приоритетом мобильной версии — см. mobile-first индексацию.

Скорость рендеринга и Core Web Vitals

Тяжёлый JavaScript бьёт не только по индексации, но и по поведению: большие бандлы блокируют главный поток, откладывают отрисовку и портят Core Web Vitals — фактор ранжирования в Google и косвенно в поведенческих сигналах Яндекса. Целевые нормативы: LCP < 2,5 с, INP < 200 мс, CLS < 0,1. Чтобы удержать их: разбивайте бандл на части (code splitting), применяйте defer/async для некритичных скриптов, откладывайте сторонние виджеты (чаты, аналитику, карты), резервируйте место под динамические блоки против скачков layout, сжимайте (gzip/brotli) JS и CSS. Детали — в материале про скорость загрузки сайта.

Как проверить рендеринг

Диагностика строится на сравнении исходного HTML и отрендеренного DOM:

  1. Исходный код страницы (Ctrl+U) — что отдаёт сервер; чего здесь нет, то зависит от JS.
  2. Инспектор DOM — что видно после скриптов. Разница и есть JS-зависимый слой.
  3. Яндекс.Вебмастер и Google Search Console (проверка URL) — как бот видит страницу и какие ресурсы заблокированы.
  4. Логи сервера — какие коды (200/301/404) видят краулеры на JS-маршрутах.

⚠️ РИСК: динамический рендеринг и клоакинг

Раньше частым решением был динамический рендеринг — отдавать ботам пререндеренный HTML, а людям клиентскую версию. Опасность в том, что если боту и пользователю показывают существенно разный контент, это переходит в клоакинг — запрещённую технику, за которую можно получить санкции в обоих поисковиках.

Безопасное правило: контент для бота и человека должен совпадать. Отдавать боту тот же HTML быстрее (через SSR) можно, подменять другим — нельзя. Динамический рендеринг — серая мера на переходный период, целевое решение — SSR или SSG.

Мини-кейс

Региональный интернет-магазин на React работал в режиме CSR: сервер отдавал пустую оболочку, а карточки товаров с ценами дорисовывались скриптами. В исходном HTML не было ни <title>, ни текстов, ни цен — для бота карточки были пустыми. Вдобавок в robots.txt был закрыт каталог со скриптами.

Что сделали: открыли JS/CSS в robots.txt, перевели каталог и карточки на SSR через Next.js, добавили в исходный HTML заголовки, описания и цены, заменили фильтры-onclick на ссылки с реальными URL. После переобхода в Яндекс.Вебмастере страницы стали индексироваться с полным содержимым. Конкретные цифры по позициям и трафику не приводим — они зависят от ниши, конкуренции и сезонности.

FAQ

Индексирует ли Яндекс JavaScript-контент?
Да, но с задержкой и осторожнее, чем Google. Критичный контент (цены и описания для коммерческих запросов) надёжнее отдавать в исходном HTML через SSR.

Чем SSR отличается от пререндеринга (SSG)?
SSR формирует HTML на сервере при каждом запросе — для часто меняющегося контента (каталоги, листинги). SSG собирает статику заранее — для блогов, статей и стабильных лендингов.

Можно ли оставить SPA на чистом CSR и не потерять SEO?
Для индексируемых страниц рискованно. CSR допустим для закрытых разделов (кабинеты, админки); для продвигаемых — SSR.

Нужно ли открывать JS и CSS в robots.txt?
Да. Если ресурсы для рендеринга закрыты, бот не отрисует страницу корректно. Закрывать стоит служебные разделы, а не файлы отображения.

Динамический рендеринг — безопасно?
Это временная серая мера. Бот и пользователь должны получать один и тот же контент, иначе это клоакинг и риск санкций.

Материал подготовлен экспертами Chrome Media — по техническому SEO и продвижению JavaScript-сайтов в Яндексе и Google.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *