🧩JS-сайты и индексация: что видят Яндекс, Google и AI-краулеры

Почему сайт на React или Vue может быть полным для Google и пустым для ChatGPT: кто из роботов исполняет JavaScript, кто нет, и как проверить за пять минут.

редакция seodb#javascript#ssr#рендеринг#индексация#ai-краулеры#техническое-seo

Сайт на React открывается в браузере идеально: меню, карточки, цены, отзывы. А в исходном коде страницы — пустой <div id="root"></div> и ссылка на бандл в два мегабайта. Человек этого не видит. Робот видит только это, если он не умеет исполнять JavaScript.

Пять лет назад вопрос звучал как «индексирует ли Google JS». Сегодня он шире: роботов, которые приходят за содержимым, стало больше, и ведут они себя по-разному. Ниже — кто из них что видит и как это проверить без догадок.

Два вида «страницы»

Главное понятие, без которого дальше ничего не понятно.

Исходный HTML — то, что сервер отдал в ответ на запрос. Его видно через «Просмотр кода страницы» (Ctrl+U) или curl.

Отрендеренный DOM — то, что получилось после того, как браузер скачал и выполнил скрипты. Его видно в инструментах разработчика (вкладка Elements).

Если содержимое есть только во втором — страница зависит от рендеринга. Каждый робот, который не исполняет JS, видит пустую оболочку.

Кто что видит

Робот Исполняет JS Что это значит
Googlebot Да, актуальный Chromium Увидит содержимое, но с задержкой: рендеринг идёт отдельной очередью
YandexBot Частично Рендерит, но не всегда и не всё; надёжнее отдавать готовый HTML
Bingbot Да Рендерит, с теми же оговорками про ресурсы и время
GPTBot, OAI-SearchBot Нет Видят только исходный HTML
ClaudeBot Нет Видит только исходный HTML
PerplexityBot Нет Видит только исходный HTML
Боты соцсетей и мессенджеров (превью ссылок) Нет Берут og:-теги из исходного HTML

Независимые замеры логов показывают одно и то же: боты OpenAI и Anthropic скачивают JS-файлы, но не выполняют их. Для них сайт без серверной отрисовки выглядит как пустая страница с заголовком.

Отсюда неприятный вывод, который мы видим всё чаще: сайт может хорошо стоять в Google и при этом отсутствовать в ответах ChatGPT и Perplexity. Google дорендерил, AI-краулер — нет. Про то, как AI-поиск выбирает источники, подробнее — в разборе RAG.

Почему «Google же справляется» — слабый аргумент

Даже для Google рендеринг — не бесплатно.

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

Ресурсы и таймауты. Если API, из которого подтягиваются данные, отвечает медленно или требует авторизацию — робот получит пустой блок. Если скрипт падает с ошибкой — тоже.

Ссылки. Навигация, которая строится скриптом по клику (onclick вместо <a href>), для робота не существует. Страницы, на которые ведут только такие «ссылки», могут не найтись вообще. Это одна из причин, по которым страница не попадает в поиск.

Краулинговый бюджет. Рендеринг дороже обычной загрузки. На большом сайте это ощутимо.

Как проверить за пять минут

1. Исходный код. Откройте страницу, Ctrl+U, поиск по ключевой фразе из основного текста. Нашлась — хорошо. Не нашлась — содержимое рисуется скриптом.

2. curl с user-agent AI-краулера:

curl -s -A "Mozilla/5.0 (compatible; GPTBot/1.2; +https://openai.com/gptbot)" \
  https://example.ru/catalog/item-1 | grep -c "ключевая фраза"

Ноль — значит, ChatGPT этой фразы не увидит. Заодно проверка, что сервер или защита от ботов не отдаёт AI-краулерам заглушку.

3. Google Search Console → Проверка URL → «Проверить страницу на сайте» → «Просмотреть проверенную страницу». Там и HTML после рендеринга, и скриншот, и список ресурсов, которые не загрузились.

4. Яндекс.Вебмастер → Инструменты → «Проверка ответа сервера». Показывает, что получил робот Яндекса. В разделе индексирования есть и настройка рендеринга JavaScript для сайта.

5. Отключить JS в браузере (DevTools → Command Menu → «Disable JavaScript») и обновить страницу. Самый наглядный способ показать проблему заказчику или разработчику.

Что делать

Варианты в порядке надёжности.

SSR — серверная отрисовка. Сервер отдаёт готовый HTML, скрипты потом «оживляют» страницу. Next.js, Nuxt, Astro, SvelteKit делают это из коробки. Для нового проекта — выбор по умолчанию.

SSG — статическая генерация. HTML собирается заранее, при сборке. Идеально для блогов, документации, лендингов, каталогов с редко меняющимися данными. Этот блог, например, так и работает: страница отдаётся готовой, скрипта для отображения текста не нужно.

Пререндеринг для роботов. Отдельный сервис отдаёт ботам заранее отрендеренную версию, людям — обычную. Рабочий костыль для старого SPA, который не переписать быстро. Минусы: ещё одна система, которую нужно поддерживать, и риск, что версии разъедутся.

Гибрид. Критичное для поиска — заголовки, основной текст, цены, ссылки навигации, мета-теги, разметка Schema.org — в исходном HTML. Интерактив — фильтры, калькуляторы, корзина — скриптами. Часто это самый дешёвый путь для существующего сайта.

Что обязательно должно быть в исходном HTML

Даже если весь сайт на клиентском рендеринге, этот минимум надо вытащить на сервер:

  • <title> и <meta name="description">;
  • <link rel="canonical"> и <meta name="robots">;
  • og:-теги — иначе превью в мессенджерах будет пустым;
  • JSON-LD с Organization и основными сущностями;
  • H1 и первый абзац основного текста;
  • навигационные ссылки обычными <a href>.

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

Итог

Для Google клиентский рендеринг — замедление и риск. Для AI-краулеров — невидимость. Проверка занимает пять минут: curl с user-agent GPTBot и поиск по ключевой фразе. Если фразы нет — содержимое сайта для AI-поиска не существует, сколько бы ни было llms.txt и разметки.