JavaScript сам по себе SEO не ломает. Ломает его слепая вера в то, что если страница красиво открывается в браузере, то поисковики увидят ее точно так же. На практике между этими двумя вещами довольно часто лежит пропасть.
Этот материал построен вокруг простого, но показательного эксперимента: тестовой страницы, у которой большая часть важных SEO-элементов появлялась только после выполнения JavaScript на клиенте. Смысл был не в "громком кейсе", а в том, чтобы посмотреть, что именно видят Google, Bing и Yandex, и насколько по-разному они это обрабатывают.
Если вы работаете с React, Vue, Next.js, Nuxt или любой схемой, где клиентский рендеринг играет большую роль, тема сугубо практическая. А если хочется быстро проверить, что реально уходит в initial HTML, SEO Analyzer — нормальная отправная точка для таких проверок.
Сначала — про двухволновую индексацию
Google часто работает с JS-страницами не в один проход, а в два этапа:
- сначала забирает и индексирует исходный HTML
- потом, когда до страницы доходит очередь рендеринга, исполняет JavaScript и переоценивает финальный DOM
Именно здесь возникает главный нюанс: если важный контент появляется только после JS, в первой волне его просто нет.

Поэтому новые страницы нередко сначала попадают в поиск с кривыми или обрезанными snippets, а уже потом, через время, догоняют "нормальную" версию.
Как выглядел тест
Страница была сделана нарочно неудобной для поисковиков:
- минимальный initial HTML
title,H1, meta description и основной текст вставлялись JavaScript- данные подтягивались по AJAX
Articleschema тоже добавлялась скриптом
То есть без исполнения JS поисковику почти не за что было зацепиться.
1$(document).ready(function () { 2 $.ajax({ 3 url: '/api/get-article-data', 4 success: function(data) { 5 $('title').text(data.title); 6 $('h1#main-title').text(data.h1); 7 $('meta[name="description"]').attr('content', data.description); 8 $('#article-content').html(data.body); 9 10 var script = document.createElement('script'); 11 script.type = 'application/ld+json'; 12 script.text = JSON.stringify(data.schemaData); 13 document.head.appendChild(script); 14 } 15 }); 16});
Именно такой контраст между initial HTML и финальным DOM и делает эксперимент полезным: сразу видно, где поисковик работает с сырой версией, а где уже дошел до второй волны.
Что показали инструменты Google
До SERP уже было понятно, что технически Google страницу читать умеет. Rich Results Test корректно собирал финальный DOM и находил элементы, которые приходили только через JavaScript.

Это важный, но не окончательный сигнал. "Может отрендерить" не равно "быстро использует это в индексе".
Первая волна: что появилось в выдаче сразу
Через несколько часов URL уже был виден в Google, Bing и Yandex. Но snippets все еще опирались на начальный HTML, а не на то, что появлялось после рендера.

Вот и чистая первая волна. Формально страница уже в индексе, но еще не в той форме, в которой ее видит пользователь.
Особенно болезненно это там, где нужна скорость:
- новые посадочные страницы
- новости
- акции
- любые материалы, где время до попадания в выдачу критично
Вторая волна: Google догоняет, но не спешит
Через несколько дней site:-запрос уже показывал текст, который изначально существовал только после выполнения JavaScript. Значит, Google все-таки добрался до финального DOM.

Практический вывод простой: Google действительно умеет работать с CSR-контентом, в том числе загружаемым по AJAX. Но между "умеет" и "сделает быстро" — существенная разница.
Для одних проектов это терпимо. Для других — уже лишний риск.
Bing и Yandex: здесь разрыв заметен сильнее
В рамках того же теста Bing и Yandex гораздо дольше держались за initial HTML. По сравнению с Google они заметно хуже адаптировались к клиентскому рендерингу.
И это очень важный момент для рынков, где трафик идет не только из Google. В русскоязычном сегменте Яндекс все еще играет заметную роль, и там подобные ограничения уже нельзя списать как "теорию".
Что дало dynamic rendering
Следующий шаг — dynamic rendering:
- обычному пользователю отдаем стандартную JS-страницу
- боту — заранее отрендеренный HTML

После этого Yandex обновил snippet и начал использовать уже предрендеренную версию.

Это не значит, что dynamic rendering — идеальная архитектура для любого проекта. Но как тест он показывает очень наглядно: чем раньше поисковик получает готовый HTML, тем меньше трения.
Что из этого реально стоит вынести
1. Google умеет рендерить JS, но это не делает стратегию безрисковой
Одна из самых вредных интерпретаций звучит так: "Google же рендерит JavaScript, значит можно все вынести в клиент". Нет, нельзя считать это безопасным по умолчанию.
Да, Google рендерит. Но:
- есть очередь
- есть задержка
- скорость обработки страниц неравномерна
- важные элементы теряют оперативность, если они не в initial HTML
2. Initial HTML остается страховкой
Если страница важна для SEO, в исходной HTML-ответе лучше уже иметь:
<title>- meta description
- H1
- основной текст
- важные ссылки
- ключевую schema-разметку
Это банально надежнее и для Google, и для других движков.
3. SSR и SSG по-прежнему практичнее для критического контента
Если стек позволяет, SSR или SSG — более спокойный выбор для страниц, где важны индексация, snippet и ранжирование. Не потому, что CSR "запрещен", а потому, что не стоит отправлять главный смысл страницы в отложенную очередь рендеринга.
4. Dynamic rendering — скорее временная мера
Для легаси-архитектуры он может быть очень полезен. Для нового проекта — скорее компромисс. Он увеличивает сложность поддержки и требует аккуратности, чтобы не скатиться в опасные расхождения между бот- и юзер-версией.
Практические рекомендации командам SEO и разработки
Если перевести эксперимент в рабочие правила, получится примерно так:
- Не прячьте SEO-критичный контент только в клиентском JS.
- Всегда проверяйте, что реально видит краулер.
- Если важна скорость индексации, выбирайте SSR или SSG.
- Оставляйте CSR для интерактива, а не для семантического ядра страницы.
- Используйте dynamic rendering только там, где архитектура или наследие системы не дают другого выхода.
Для быстрой проверки полезно прогнать страницу через SEO Analyzer, а для snippet-сигналов дополнительно держать под контролем title и description через Meta-Tag Generator.
Вывод
Этот тест не про то, что JavaScript "портит SEO". Он про то, что зависимость от клиентского рендеринга для ключевого контента все еще означает задержки, разницу между поисковиками и менее предсказуемую индексацию.
Если нужен короткий практический принцип, то он такой: отдавайте богатую интерактивность JavaScript, но не откладывайте сам SEO-смысл страницы до момента рендера. Чем больше важного уже есть в HTML, тем спокойнее живет и SEO-команда, и разработка.

