JavaScript (JS) — язык программирования, выполняемый в браузере и добавляющий интерактивность к веб-страницам. Если HTML — скелет страницы, CSS — внешний вид, то JavaScript — поведение: слайдеры, выпадающие меню, динамическая загрузка контента, формы без перезагрузки и многое другое. В современном вебе JavaScript используется повсеместно, а многие приложения построены целиком на JS-фреймворках (React, Vue, Angular, Next.js).
Для SEO JavaScript создаёт специфические вызовы: поисковые роботы традиционно хорошо читают HTML, но с JavaScript у них были проблемы. Понимание принципов работы поисковиков с JS-контентом критически важно для SEO современных сайтов.
Как Google обрабатывает JavaScript
Google использует двухэтапный процесс краулинга JS-страниц:
- Первый проход — Googlebot скачивает HTML и отправляет его в индекс «как есть» (без рендеринга JS).
- Рендеринг — Googlebot ставит страницу в очередь рендеринга. Используя безголовый Chromium, он выполняет JavaScript и получает конечный DOM. После рендеринга страница переиндексируется с полным контентом.
Задержка между первым проходом и рендерингом может составлять от нескольких часов до нескольких недель. Это означает, что JS-контент попадает в индекс позже HTML-контента.
Проблемы JavaScript для SEO
- Задержка индексации — JS-контент индексируется позже. Для новых страниц это критично.
- Бюджет рендеринга — Google не рендерит все страницы сразу. Сайты с большим количеством JS-страниц могут ждать рендеринга долго.
- Ошибки JavaScript — если JS-скрипт падает с ошибкой, контент, зависящий от него, не будет проиндексирован.
- Ссылки в JS — ссылки, добавляемые JavaScript (а не присутствующие в HTML), обнаруживаются только после рендеринга.
- Яндекс — хуже справляется с JS, чем Google. Контент, зависящий от JS, может вообще не индексироваться Яндексом.
Лучшие практики для JS и SEO
- Server-Side Rendering (SSR) — сервер отдаёт полностью отрендеренный HTML. Контент виден сразу без рендеринга на клиенте. Next.js (React), Nuxt.js (Vue) — популярные SSR-фреймворки.
- Static Site Generation (SSG) — HTML генерируется при сборке. Максимальная скорость и SEO. Gatsby, Next.js, Hugo.
- Прогрессивное улучшение — базовый контент доступен без JS, JavaScript добавляет интерактивность поверх.
- Предварительный рендеринг (Prerendering) — специальный сервер рендерит страницы для ботов. Решение без SSR.
Часто задаваемые вопросы
Индексирует ли Яндекс контент, загружаемый через JavaScript?
Частично и непредсказуемо. Яндекс значительно хуже справляется с JavaScript, чем Google. Контент, который отображается только после выполнения JS (SPA на React/Vue без SSR), может вообще не попасть в индекс Яндекса или попасть значительно позже. Для русскоязычных сайтов, ориентированных на Яндекс, SSR или SSG — обязательны. Проверить: использовать инструмент «Проверка индексирования» в Яндекс.Вебмастере и посмотреть на кеш страницы.
Как проверить, видит ли Google JS-контент на странице?
Инструменты: 1) Google Search Console → Проверка URL → «Просмотреть проверенную страницу» — показывает скриншот и HTML после рендеринга Googlebot. 2) Fetch as Google (устаревший, но концептуально: GSC показывает рендеринг). 3) Chrome DevTools → Отключить JavaScript (Settings → Debugger → Disable JavaScript) — посмотреть, что видит бот без рендеринга. 4) Поиск в Google: «site:example.com JS-контент» — если найдено, значит проиндексировано.
Влияют ли JS-фреймворки (React, Vue) на скорость сайта?
Да, и существенно. SPA (Single Page Application) на чистом React/Vue без оптимизации могут отгружать несколько мегабайт JavaScript, что катастрофично для Core Web Vitals. Проблемы: большой bundle → долгий Time to Interactive; гидратация (hydration) → задержка отклика. Решения: code splitting (разбивка на чанки), lazy loading компонентов, Server Components (Next.js 13+), Island Architecture. Хорошо настроенный Next.js с SSG даёт результаты лучше, чем классический WordPress.
Нужно ли делать ссылки в HTML, если они добавляются через JavaScript?
Да, желательно. Ссылки в HTML-коде (статические) обнаруживаются Googlebot на первом проходе без рендеринга — это гарантирует краулинг связанных страниц. Ссылки, добавляемые через JavaScript (document.createElement, innerHTML), видны только после рендеринга. Для критически важных навигационных ссылок (главное меню, внутренние ссылки на ключевые страницы) используйте статический HTML. JavaScript может дублировать их или добавлять динамические ссылки к второстепенному контенту.