JS не индексируется Яндексом
SPA на React/Vue — Яндекс хуже Google рендерит JS. SSR и pre-render как решение.
Симптом
- В Яндекс.Вебмастере страницы с динамическим контентом не попадают в индекс.
- Поисковые запросы показывают только заглушку «404» или «страница не найдена», хотя в браузере контент виден.
- В Google Search Console страницы индексируются, но в Яндекс нет.
- При просмотре исходного кода (Ctrl+U) виден только базовый шаблон, а скрипты React/Vue не выполняются.
- В отчёте «Проблемы с индексацией» указано «Содержимое генерируется JavaScript».
- При запросе
curl -I https://example.com/pageзаголовокX-Requested-With: XMLHttpRequestотсутствует, а тело ответа содержит только<div id="app"></div>.
Причина
Яндекс использует собственный движок рендеринга, который не всегда полностью поддерживает современные фреймворки.
- Отсутствие серверного рендеринга (SSR): контент создаётся только в браузере, а Яндекс видит только статический шаблон.
- Неправильная настройка robots.txt или X-Robots-Tag: запрещённый доступ к скриптам или к страницам, где контент генерируется JS.
- Отсутствие pre-render: Яндекс не «запускает» JavaScript, поэтому не видит динамический контент.
- Слишком медленный рендеринг: если скрипт загружается долго, Яндекс может прекратить ожидание и оставить пустую страницу.
- Неправильная конфигурация сервера: отдача index.html для всех путей без корректного Content-Type может сбивать Яндекс.
Как проверить
-
Проверка исходного кода
bash curl -L https://example.com/page | head -n 20
Если виден только<div id="app"></div>, контент генерируется JS. -
Проверка в Яндекс.Вебмастере
- В разделе «Проверка URL» введите адрес страницы.
- Посмотрите, какие ресурсы загружает Яндекс и есть ли ошибки JavaScript. -
Проверка
robots.txt
bash curl -L https://example.com/robots.txt
Убедитесь, что нет правилDisallow: /для скриптов. -
Проверка заголовков ответа
bash curl -I https://example.com/page
Должен бытьContent-Type: text/html; charset=utf-8. -
Проверка скорости загрузки
- Включитеperformance.now()вindex.htmlи посчитайте время до полной загрузки.
- Если > 5 секунд, возможно, Яндекс прерывает рендеринг. -
Проверка
pre-render
- Откройте страницу в режиме «Инспектор» и посмотрите, генерируется ли контент сервером (доступен ли__PRELOADED_STATE__).
Решение
1. Внедрить SSR (Server‑Side Rendering)
React (Next.js)
npx create-next-app myapp
cd myapp
npm run dev
Next.js автоматически рендерит страницы на сервере.
В pages/index.js можно использовать getServerSideProps:
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return { props: { data } };
}
Vue (Nuxt.js)
npx nuxi init mynuxt
cd mynuxt
npm install
npm run dev
Nuxt генерирует серверный рендеринг по умолчанию.
2. Использовать pre‑rendering (если SSR не подходит)
- VitePress:
vitepress buildгенерирует статические страницы. - VuePress:
vuepress buildсоздаёт готовые HTML‑файлы. - React Static:
react-static build.
3. Настроить robots.txt
User-agent: *
Allow: /
Если нужно запретить скрипты, уточните путь:
Disallow: /static/js/
4. Добавить X‑Robots‑Tag в ответ сервера
location / {
add_header X-Robots-Tag "index, follow" always;
}
5. Оптимизировать загрузку скриптов
- Code‑splitting: разделяйте большие бандлы.
- Preload: указывайте важные ресурсы.
html <link rel="preload" href="/static/js/main.js" as="script"> - Минификация:
npm run build --prod.
6. Проверка после изменений
- Перезапустите сервер.
- В Яндекс.Вебмастере повторно проверьте URL.
- Убедитесь, что в исходном коде виден готовый HTML, а не только
<div id="app"></div>. - Через 24–48 ч проверьте, появился ли URL в индексе.
Связанные
Не хотите разбираться сами?
Запустите технический аудит сайта за 5 минут — получите PDF-отчёт с разбором всех 64 параметров и конкретными точками роста. Или закажите комплексное SEO-продвижение сайта — починим всё это и возьмём на себя дальнейшую оптимизацию.