Сайт на JavaScript может быть технически безупречным в браузере — и при этом полностью невидимым для AI-поисковиков. Проблема не в самом JavaScript, а в том, что краулер получает пустой HTML-документ и не видит никакого контента для цитирования. Ниже — разбор механики сбоя, диагностика и рабочие решения.
Что такое «rendering gap» и почему он критичен для AI-ответов?
Rendering gap — это разрыв между тем, что видит пользователь в браузере, и тем, что получает краулер в initial HTML. В классическом SPA (Single Page Application) сервер отдаёт документ вида <div id="root"></div> плюс бандл скриптов. Браузер загружает JS, выполняет его, собирает DOM и отображает контент. Краулер, который не выполняет JS или выполняет его с ограничениями, видит только пустую оболочку.1
Для попадания в AI-ответы требуется, чтобы краулер получил страницу с HTTP 200, увидел индексируемый контент и смог его передать дальше.2 Пустой div#root этому требованию не отвечает.
Умеет ли Google рендерить JavaScript?
Да, Google обрабатывает JavaScript-приложения в три фазы: crawling, rendering, indexing.1 Но это не означает отсутствия ограничений — они есть, и они задокументированы.3 Rendering происходит асинхронно и с задержкой: страница сначала индексируется по initial HTML, а полноценный рендеринг в очереди. Если initial HTML пуст — в индекс попадает пустая страница.
Для AI Search (Google AI Overviews, AI Mode) требования те же, что и для обычного Search: Googlebot должен получить страницу, получить HTTP 200 и увидеть индексируемый контент.2 Никаких специальных AI-краулеров или дополнительных требований нет — но и поблажек тоже.
Какие AI-боты вообще могут краулить мой сайт?
Три User-Agent OpenAI
OpenAI использует три отдельных User-Agent:4
- OAI-SearchBot — для поиска и цитирования в ChatGPT Search;
- GPTBot — для улучшения моделей (обучение);
- ChatGPT-User — триггерируется пользователем в диалоге.
Каждый управляется отдельным токеном в robots.txt. Если вы заблокировали GPTBot, это не означает, что OAI-SearchBot тоже заблокирован — и наоборот.
Что неизвестно про остальные боты
Данные о рендеринге JS другими AI-ботами (PerplexityBot, ClaudeBot и т.д.) в публичной документации не раскрыты в деталях.5 Именно поэтому безопаснее не полагаться на JS-рендеринг со стороны бота, а отдавать готовый HTML.
Какой initial HTML должен получать краулер?
Это минимальный набор, без которого страница недоступна для AI-систем. Если хотя бы один пункт отсутствует в initial HTML (до выполнения JS) — страница с высокой вероятностью не попадёт в AI-ответы.
| Элемент | Зачем нужен | Типичная ошибка SPA |
|---|---|---|
<title> | Идентификация страницы | Генерируется только через JS |
<meta name="description"> | Фрагмент в выдаче | Ставится через Helmet после загрузки |
<link rel="canonical"> | Деление сигналов, дедупликация | Не существует до гидрации |
<h1> с текстом | Главный заголовок-тема | Пустой или отсутствует |
| Основной абзац текста | Контент для цитирования | Только skeleton/loader |
JSON-LD (Article/Organization) | Структурированные данные | Вставляются клиентским JS |
Именно этот список стоит проверять в первую очередь при диагностике.
Как быстро проверить, что видит AI-краулер?
Эмуляция краулера через curl
Самый прямой способ — эмулировать краулер через curl без рендеринга JS. Это покажет ровно то, что получает бот до выполнения скриптов.
# Проверить, что видит OAI-SearchBot
curl -A "OAI-SearchBot" https://example.com/page
# Найти признак пустого SPA в ответе
curl -s https://example.com/page | grep -E "div#root|<div id=\"app\""
Если в выводе нет текста статьи, заголовков <h1>, описания или структурированных данных — краулер видит пустую страницу.
Что проверить дополнительно
Дополнительно стоит проверить:
- не режет ли CDN или WAF запросы с AI User-Agent (Cloudflare, например, может отдавать challenge вместо HTML);
- какой HTTP-статус возвращают deep links (роуты типа
/blog/article-slugдолжны отдавать 200 с контентом, а не пустой shell).
Подробнее о том, как выстроить полную проверку доступности сайта для AI-поисковиков, читайте в статье «Как проверить, что ChatGPT «видит» на вашем сайте» и в «Технический аудит сайта под AI-поисковики».
Какие решения реально работают?
Проблема решается на уровне рендеринга — нужно, чтобы сервер отдавал готовый HTML. Динамический рендеринг (dynamic rendering) — когда сервер определяет, бот или человек, и отдаёт разный ответ — Google явно не рекомендует как основное решение.6
Надёжные варианты:
SSR — рендеринг на сервере при запросе
SSR (Server-Side Rendering) — сервер генерирует полный HTML при каждом запросе, снижая количество round trips на клиенте.7 Подходит для динамического контента (каталоги с реальным временем, персонализированные данные).
SSG — статика, собранная заранее
SSG (Static Site Generation) — HTML генерируется заранее при сборке. Краулер сразу получает готовую страницу. Подходит для блогов, лендингов, документации — любого контента, который не меняется по запросу.
ISR — фоновая пересборка статики
ISR (Incremental Static Regeneration) — гибрид: страницы пересобираются в фоне по расписанию или по триггеру, но отдаются как статика. Доступен в Next.js и ряде других фреймворков.
Pre-rendering — снимки HTML для маршрутов
Pre-rendering — генерация статических снимков HTML для отдельных маршрутов без полного SSR. Компромисс при невозможности переписать весь стек.
Во всех случаях гидрация (hydration) — подключение JS-интерактивности к уже готовому HTML — остаётся доступной для пользователя. Для краулера важен только initial HTML.
Если вы разбираетесь с тем, какие технические параметры вообще влияют на видимость в AI-поиске, полезно прочитать «Семантическая вёрстка HTML5 для нейросетей» — там разобрано, как структура разметки влияет на извлечение фрагментов.
Какие ошибки допускают чаще всего?
Большинство проблем SPA-сайтов в AI-поиске возникают из одного источника: разработчики проверяют сайт в браузере, где всё работает, и считают, что краулер видит то же самое.
Типичные ошибки:5
title,description,canonicalформируются только клиентским JS (через react-helmet, vue-meta и т.п.);- deep links (маршруты) возвращают HTTP 200, но отдают пустой shell без контента;
- sitemap содержит URL, которые без JS возвращают только
div#root; - structured data (
JSON-LD) вставляются только после гидрации; - CDN или WAF блокирует запросы с AI User-Agent, отдавая challenge или 403;
- API, откуда SPA берёт данные, закрыт CORS-политиками или bot-protection и недоступен для краулера.
Ещё одна распространённая ошибка — блокировать OAI-SearchBot вместе с GPTBot в robots.txt. Это разные токены с разными функциями: GPTBot — для обучения модели, OAI-SearchBot — для показа в результатах ChatGPT Search.4 Блокировка OAI-SearchBot исключает сайт из ChatGPT Search целиком.
Как связаны чанки и рендеринг?
Даже если страница технически доступна краулеру, контент должен быть структурирован так, чтобы AI-система могла извлечь из него автономный фрагмент-ответ. Это называется чанком. Если <h2> и первый абзац генерируются JS — краулер не видит структуры, не видит заголовков-вопросов, не может выделить passage для цитирования.
Подробнее о том, как писать контент, который AI-системы умеют извлекать, — в статье «Что такое чанк и как писать автономные чанки». О том, почему структура заголовков имеет значение именно для нейросетей, — в «Понятные заголовки для нейросетей».
Итог: что проверить прямо сейчас
Если ваш сайт — SPA, и вы подозреваете, что AI-поисковики его не видят, начните с трёх проверок:
- Выполните
curl -A "OAI-SearchBot" <ваш-URL>и убедитесь, что в ответе есть<h1>, текст и<title>— не пустойdiv. - Откройте Google Search Console → URL Inspection → посмотрите на «Rendered page»: совпадает ли он с тем, что видит пользователь?
- Проверьте
robots.txtна наличие блокировки OAI-SearchBot или Bingbot — оба нужны для попадания в ChatGPT Search.
Если initial HTML пуст — решение одно: переходить на SSR, SSG или ISR. Это не GEO-оптимизация в узком смысле, это базовое условие доступности контента для любого краулера.
Платформа GeoWatch позволяет проверить, насколько ваш сайт виден в ответах ChatGPT, Яндекс Нейро и других AI-поисковиков — включая то, какой контент они цитируют и что остаётся недоступным из-за технических ограничений рендеринга. Если хотите понять точку старта, запросите GEO-аудит.
Источники
Footnotes
- Google Search Central — «JavaScript SEO basics» — developers.google.com ↗ (дата доступа: 2026-06-03) ↩ ↩2
- Google Search Central Blog — «Succeeding in AI Search» — developers.google.com ↗ (21 мая 2025) ↩ ↩2
- Google Search Central — «Fix JavaScript SEO issues» — developers.google.com ↗ (дата доступа: 2026-06-03) ↩
- OpenAI Developer Docs — «Bots» — developers.openai.com ↗ (дата доступа: 2026-06-03) ↩ ↩2
- Практический вывод из ограничений документации: поведение PerplexityBot, ClaudeBot и других AI-ботов в части JS-рендеринга не раскрыто детально в публичных первоисточниках; рекомендация — не полагаться на рендеринг и отдавать готовый HTML. ↩ ↩2
- Google Search Central — «Dynamic rendering» — developers.google.com ↗ (дата доступа: 2026-06-03) ↩
- web.dev — «Rendering on the Web» — web.dev ↗ (дата доступа: 2026-06-03) ↩
