Техническое SEO: доступ поисковика к сайту

JavaScript SEO

JavaScript SEO на origin — что отдаёт первый HTML до исполнения скриптов: Google ставит URL в очередь WRS, Яндекс решает рендер в кабинете β, а пустая оболочка с 200 становится soft 404.

Кирилл Бабийчук · обновлено · 4 мин чтения

JavaScript SEO здесь — не очередь Chromium у Google и не курс по React. Это контракт origin: что робот получает в первом HTML, что появляется только после исполнения скриптов, какой HTTP-статус у пустого состояния. Хаб технического SEO начинается с доступа. Как именно Googlebot ставит 200 в очередь Web Rendering Service — соседний URL JavaScript SEO в контуре Google, этот H1 его не повторяет. CSR, SSR и общий рендеринг для поисковиков в карте ещё впереди отдельными страницами.

Google Search обрабатывает JS-приложения тремя фазами: crawl → render → index (справка «Understand JavaScript SEO basics»). Яндекс даёт тумблер: Индексирование → Рендеринг страниц JavaScript β. По умолчанию «На усмотрение робота»: он сам решает, исполнять ли код, сравнивая полноту страницы с JS и без. Справка советует запретить рендеринг, если уже есть SSR или пререндер. Исполнение JS создаёт дополнительную нагрузку на ваш сервер — это написано в той же карточке, не байка.

Что должно быть в первом ответе

Пока скрипты не выполнились, в индексе может оказаться оболочка. Критичное кладут в исходный HTML, а не «дождётся гидратация».

Слой В первом HTML Только после JS
Текст денежного URL заголовок, цена, оффер, абзац задачи может не доехать до индекса
Ссылки <a href> на канонические пути клик по div и onclick Googlebot не нажимает
Каноникал / noindex в <head> ответа 200 поздняя подмена опаздывает; у Google каноникализация идёт до рендера
Код ответа реальный 404/410 на несуществующем пути SPA часто отдаёт 200 на пустышку — soft 404, см. 404
Бандлы доступны, не Disallow закрытый /static/ в robots.txt ломает рендер

WRS (Google) кэширует агрессивно и может игнорировать Cache-Control: отпечаток в имени файла (app.a1b2c3.js) — гигиена, не буст. Между загрузками URL WRS не держит Local Storage, Session Storage и cookie: контент, который живёт только в сессии браузера, роботу не отдадут. Hash-маршрут #/products Google Search отдельным URL не считает; схема AJAX-crawling со #! снята с 2015-го. Нужен History API и сервер, который на каждый путь отдаёт документ, не 404 оболочке.

Яндекс: кабинет β и RotorSettings

Если контент рисуется клиентом и SSR нет — в Вебмастере включают исполнение JS, не «оставим на усмотрение» навечно. Если SSR уже есть — рендеринг запрещают, чтобы робот не гонял второй проход и не сравнивал две версии.

Для отложенной загрузки справка просит объект window.YandexRotorSettings до DOMContentLoaded. Ключи, которые робот читает:

  • WaiterEnabled: true — можно ждать IsLoaded / IsError (в том числе функцией: «в DOM больше N блоков», «title не пустой»);
  • FailOnTimeout — по тайм-ауту либо не брать страницу, либо взять то, что успело загрузиться;
  • NoJsRedirectsToMain: true — если приложение зовёт window.history.back(). Яндекс воспринимает это как переход на главную без смены содержимого: в сниппет и каноникал главной может утечь внутренний URL. Симптом из справки: description или canonical главной внезапно как у внутренней.

Ждать «пять секунд» справка не рекомендует: загрузка ресурсов роботом неопределённа, честнее ждать конкретный селектор. Это не замена SSR и не соседний H1 про рендеринг — это сигнал «контент ещё не готов», пока вы не отдали HTML с сервера.

Проверка без театра: curl без JS видит оффер и ссылки; в GSC инспектор сравнивает скачанный и отрисованный HTML; в Вебмастере — «Проверка страницы» и выбранный режим рендера. Пустая оболочка, которая 200 на проде, — дыра доступа, с неё начинается SEO-аудит сайта. Тяжёлый CSR жжёт квоту обхода, см. crawl budget, не «балл Lighthouse».

Робот индексирует то, что успел получить. Если оффер живёт только после гидратации, в поиске может остаться оболочка с 200.

Частые вопросы

Чем эта страница отличается от JavaScript SEO в разделе Google?

Там — очередь WRS и кабинет Search Console. Здесь — origin для обоих роботов: первый HTML, статус, ссылки, тумблер Яндекса и RotorSettings. Стек CSR/SSR как отдельные H1 не занимаем.

Нужно ли включать рендеринг JavaScript в Вебмастере, если есть SSR?

Нет. Справка просит запретить рендеринг, когда сервер уже отдаёт готовый HTML. Иначе робот второй раз исполняет скрипты и грузит origin зря.

Почему Яндекс показывает на главной текст внутренней SPA-страницы?

Часто history.back() без NoJsRedirectsToMain: робот считает это переходом на главную и забирает чужой контент. Лечат флагом и тем, чтобы каждый путь сам отвечал своим HTML, а не «одной оболочкой».

Google умеет JS — значит CSR достаточно?

Умеет через очередь рендера, не вместо первого HTML. Ссылки, каноникал, статус и оффер надёжнее в ответе сервера. Иначе вы зависите от того, доехал ли WRS и включил ли Яндекс исполнение.