🧩JS-сайты и индексация: что видят Яндекс, Google и AI-краулеры
Почему сайт на React или Vue может быть полным для Google и пустым для ChatGPT: кто из роботов исполняет JavaScript, кто нет, и как проверить за пять минут.
Сайт на 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 и разметки.