Сайт на 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-поисковики его не видят, начните с трёх проверок:

  1. Выполните curl -A "OAI-SearchBot" <ваш-URL> и убедитесь, что в ответе есть <h1>, текст и <title> — не пустой div.
  2. Откройте Google Search Console → URL Inspection → посмотрите на «Rendered page»: совпадает ли он с тем, что видит пользователь?
  3. Проверьте robots.txt на наличие блокировки OAI-SearchBot или Bingbot — оба нужны для попадания в ChatGPT Search.

Если initial HTML пуст — решение одно: переходить на SSR, SSG или ISR. Это не GEO-оптимизация в узком смысле, это базовое условие доступности контента для любого краулера.

Платформа GeoWatch позволяет проверить, насколько ваш сайт виден в ответах ChatGPT, Яндекс Нейро и других AI-поисковиков — включая то, какой контент они цитируют и что остаётся недоступным из-за технических ограничений рендеринга. Если хотите понять точку старта, запросите GEO-аудит.

Источники

Footnotes

  1. Google Search Central — «JavaScript SEO basics» — developers.google.com ↗ (дата доступа: 2026-06-03) 2
  2. Google Search Central Blog — «Succeeding in AI Search» — developers.google.com ↗ (21 мая 2025) 2
  3. Google Search Central — «Fix JavaScript SEO issues» — developers.google.com ↗ (дата доступа: 2026-06-03)
  4. OpenAI Developer Docs — «Bots» — developers.openai.com ↗ (дата доступа: 2026-06-03) 2
  5. Практический вывод из ограничений документации: поведение PerplexityBot, ClaudeBot и других AI-ботов в части JS-рендеринга не раскрыто детально в публичных первоисточниках; рекомендация — не полагаться на рендеринг и отдавать готовый HTML. 2
  6. Google Search Central — «Dynamic rendering» — developers.google.com ↗ (дата доступа: 2026-06-03)
  7. web.dev — «Rendering on the Web» — web.dev ↗ (дата доступа: 2026-06-03)