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 и включил ли Яндекс исполнение.