AJAX (Asynchronous JavaScript and XML) — это технический способ асинхронного обмена данными с сервером без полной перезагрузки страницы. Принцип работы прост: браузер отправляет HTTP-запрос, получает ответ (обычно в формате JSON) и обновляет только нужный элемент документа. Бесконечная подгрузка контента — лишь один из сценариев применения, а не основа технологии.
Фоновая передача информации улучшает пользовательский опыт. Клиенту не нужно тратить время на ожидание загрузки и нажатие кнопок пагинации. Для внедрения динамической подгрузки в шаблон сайта необходимо добавить соответствующий JS-код.
Впервые об этом методе разработки интерфейсов веб-приложений заговорили в 2005 году. Автором концепции принято считать Джесси Джеймса Гаррета.
- Как устроен AJAX технически
- Современный стек: Fetch, Axios и фреймворки
- AJAX и SEO: проблемы с индексированием
- Последовательность обращения к серверу: стандартный и AJAX
- Когда использовать AJAX, а когда — нет
- Достоинства AJAX
- Глоссарий терминов
- FAQ об AJAX
Как устроен AJAX технически
В основе технологии лежит объект XMLHttpRequest (XHR). Именно он позволяет языку программирования JavaScript отправлять запросы к серверу и получать ответ без обновления страницы. Сегодня XHR считается legacy-интерфейсом. Ему на смену пришел нативный Fetch API, реализованный во всех современных браузерах. Fetch строится на Promise и читается проще, чем колбэк-цепочки XHR.
Ниже представлены два эквивалентных примера асинхронного запроса.
Fetch API с обработкой ошибок и обновлением DOM:
// Отмена запроса через AbortController
const controller = new AbortController();
fetch('/api/items', { signal: controller.signal })
.then(response => {
if (!response.ok) throw new Error('HTTP error: ' + response.status);
return response.json();
})
.then(data => {
document.querySelector('#list').innerHTML =
data.map(item => `<li>${item.name}</li>`).join('');
})
.catch(error => console.error('Ошибка запроса:', error));
// Отменить запрос при необходимости:
// controller.abort();
XMLHttpRequest (классический подход):
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/items');
xhr.onload = function () {
if (xhr.status === 200) {
const data = JSON.parse(xhr.responseText);
document.querySelector('#list').innerHTML =
data.map(item => `<li>${item.name}</li>`).join('');
} else {
console.error('Ошибка:', xhr.status);
}
};
xhr.onerror = () => console.error('Сетевая ошибка');
xhr.send();
Fetch позволяет отменять ajax-запрос через AbortController. Это удобно при быстром поиске или смене маршрута в SPA до того, как сервер успеет дать ответ. XHR предоставляет событие onprogress для отслеживания загрузки файлов. Оба инструмента умеют обрабатывать форматы XML, JSON, обычный текст и стандартный HTML.
В связке с AJAX часто используют подход Dynamic HTML для изменения содержимого веб-страницы: динамическая генерация тегов img, script и побочных фреймов.
Современный стек: Fetch, Axios и фреймворки
Сегодня у разработчика есть три основных инструмента для работы с сетью: нативный XHR, современный Fetch и библиотека Axios. Каждый занимает свою нишу. Ниже представлена сравнительная таблица.
| Характеристика | XMLHttpRequest | Fetch API | Axios |
|---|---|---|---|
| Нативность | Да (legacy) | Да (современный стандарт) | Нет, внешняя зависимость |
| Promise-интерфейс | Нет (колбэки) | Да | Да |
| Интерсепторы запросов/ответов | Нет | Нет (нужна обёртка) | Да (встроено) |
| Отслеживание прогресса загрузки | Да (onprogress) |
Частично (через ReadableStream) | Да |
| Отмена запроса | Да (xhr.abort()) |
Да (AbortController) | Да (CancelToken / AbortController) |
| Автоматический JSON-парсинг | Нет | Нет (нужен .json()) |
Да |
| Когда уместен | Легаси-код, загрузка файлов с прогрессом | Большинство современных проектов | Сложные API, нужны интерсепторы и таймауты |
Если проект использует React, Vue или Angular, запросы обычно уходят через встроенные хуки. Однако под капотом работает Fetch или Axios. Для SEO-важных разделов ресурса необходимо использовать SSR (Server-Side Rendering) или SSG (Static Site Generation). Серверный рендеринг позволяет отдать краулеру готовый HTML-файл без ожидания выполнения клиентского скрипта.
AJAX и SEO: проблемы с индексированием
Может ли поисковик сканировать AJAX-контент? Если коротко, то да. Но краулерам делать это сложнее. Одностраничные приложения исторически создавали проблемы для продвижения. Выделим основные недостатки:
- Проблемы со сканированием. Важный контент скрыт внутри JS. Робот видит пустой экран.
- Проблемы с навигацией. Кнопка «Назад» в браузере работает некорректно без History API.
- Маскировка. Вебмастеры создавали две версии выдачи: для пользователя и для поисковой системы. Это запрещено правилами и ведет к санкциям.
Долгое время Google советовал использовать схему с параметром _escaped_fragment_. Она сообщала краулерам о наличии динамики и позволяла получать предварительно обработанную версию документа.
Такая страница имела статический HTML-код, который поисковый робот мог правильно индексировать. Сервер давал указание сканировать версию, отличную от исходного кода.
Ситуация изменилась в 2015 году. Google объявил, что краулеры научились выполнять рендеринг и анализировать содержимое внутри JavaScript. Схема hashbang (#!) и протокол _escaped_fragment_ перешли в статус исторических. Сегодня их использование не рекомендуется.
Как Google и «Яндекс» видят AJAX-страницы
По официальным заявлениям, Googlebot рендерит JS и индексирует динамику. На практике процесс происходит в два этапа: сначала краулер сканирует URL, затем ставит в очередь на рендеринг. Это ресурсоемкая операция, поэтому между обнаружением и реальной индексацией проходит время.
«Яндекс» работает иначе. Робот по умолчанию сам решает, выполнять ли обработку скриптов. В панели «Яндекс Вебмастер» можно задать нужный режим: «Рекомендую рендерить», «На усмотрение робота» или «Не рендерить». Последний вариант подойдет, если на сайте уже настроен SSR — дополнительная нагрузка со стороны поисковика не требуется.
Ниже представлена сравнительная таблица по подходу двух систем.
| Параметр | «Яндекс» | |
|---|---|---|
| Рендеринг JS | Всегда, на базе актуального Chromium | По умолчанию — на усмотрение робота; управляется через Вебмастер |
| Этапность обработки | Два этапа: crawl + render (рендер может быть отложен) | Рендеринг затратен, используется выборочно |
| Рекомендуемый подход | SSR / SSG / Dynamic Rendering как временное решение | SSR или пререндер; настройка режима рендеринга в Вебмастере |
| Инструмент проверки | Google Search Console → Проверка URL (Live Test) | «Яндекс Вебмастер» → Анализ обхода страниц |
| Требования к URL | Уникальный, читаемый URL для каждого состояния | Уникальный URL; History API для корректной маршрутизации |
| Частые ошибки | Контент в JS без SSR, блокировка Googlebot | Отсутствие рендеринга при JS-генерации контента |
Два фактора, напрямую влияющие на ранжирование:
- Скрытый текст. Если важная информация спрятана в JS, индексирование задерживается. Убедитесь, что критичный контент доступен в HTML-формате.
- Отсутствующие ссылки. Поисковики используют внутренние ссылки для понимания структуры. Внешние ссылки — это фактор ранжирования. Они должны быть доступны в коде, а не генерироваться скриптом.
Об индексации Google мы также писали в статье «9 причин, почему Google не индексирует сайт».
Как AJAX влияет на SEO
Означает ли это, что можно забыть об оптимизации? Обратимся к официальной справке:
«…пока вы не блокируете Googlebot от сканирования JavaScript или CSS, Google будет отображать ваши страницы в результатах поиска».
Формулировка прозрачна: поисковик умеет обрабатывать скрипты, но обеспечение доступности — задача вебмастера. Больше не нужно использовать «костыли», чтобы показать разницу между статикой и динамикой.
AJAX-подход может генерировать некорректные URL-адреса. Для краулера критично, чтобы адрес отражал реальную иерархию.
Чтобы решить эту проблему, необходимо использовать History API с методом pushState(). Он меняет URL на стороне клиента и добавляет запись в историю браузера без перезагрузки. Это сохраняет работоспособность кнопок навигации.
Как сделать AJAX-контент доступным для Google и «Яндекса»
Ниже представлен чек-лист из 10 шагов для настройки индексации.
- Настроить SSR или SSG. Серверный рендеринг — самый надежный способ. Робот получает готовый HTML без ожидания клиентского скрипта.
- Использовать Dynamic Rendering. Если SSR недоступен, настройте отдачу статики ботам через пререндер. Google называет это временным решением.
- Оптимизировать URL через History API. Применяйте
pushState()вместо устаревшего_escaped_fragment_. - Добавить canonical-теги. Укажите основную версию при наличии фильтров через
rel="canonical". - Не прятать контент в JS. Базовый текст должен быть в HTML.
- Оптимизировать скорость. Раздутый DOM снижает производительность и затрудняет обход.
Краулинговый бюджет — лимит поискового робота по количеству обращений к определённому домену.
- Удалить блокирующие ресурсы. Тяжелый код влияет на Core Web Vitals (LCP и INP).
- Обеспечить корректные HTTP-коды. API должно возвращать 404 при ошибке, исключая soft 404.
- Настроить микроразметку. Schema.org помогает формировать расширенные сниппеты.
- Обновить карту сайта. Сгенерируйте актуальный sitemap.xml.
Проблема индексирования решена, но полностью асинхронные сайты остаются сложными в продвижении. Используйте чек-лист выше, чтобы минимизировать риски. Пререндер поможет убедиться, что данные доступны при каждом обращении Googlebot.
Prerender (предварительная отрисовка) — процесс предварительной загрузки всех элементов на странице для подготовки к их просмотру поисковым роботом. Служба пререндеринга перехватывает запрос страницы, чтобы узнать, является ли user-agent (просматривающий ваш сайт) ботом.
Служба пререндеринга перехватывает запрос. Если клиент — бот, отдается кэшированная статика. Если обычный пользователь — стандартное приложение.
Как проверить, видит ли поисковик ваш контент
Перед релизом необходимо проверить доступность данных:
- Отключите JS в браузере. Используйте DevTools. Если страница пустая — робот увидит то же самое.
- Изучите исходный код. Нажмите Ctrl+U. Отсутствие текста означает генерацию на клиенте.
- Используйте Google Search Console. Инструмент Live Test покажет ререндеренный HTML.
- Проверьте рендеринг в «Яндекс Вебмастере». Раздел «Диагностика» покажет, как система обходит ресурс.
- Проанализируйте логи сервера. Убедитесь, что боты получают код 200.
Почему у поисковых систем возникали сложности? Чтобы ответить на этот вопрос, необходимо рассмотреть механику взаимодействия.
Последовательность обращения к серверу: стандартный и AJAX
Рассмотрим, как происходит обмен данными в классическом варианте:
- Пользователь открывает страницу сайта.
- Происходит взаимодействие с элементом.
- Браузер создает HTTP-запрос.
- Запрос отправляется на сервер.
- Сервер генерирует новую версию документа.
- Браузер получает ответ и выполняет полную перезагрузку.
AJAX-подход меняет эту последовательность:
- Пользователь открывает страницу.
- Происходит взаимодействие с элементом.
- Скрипт идентифицирует тип данных для обновления.
- Клиент посылает фоновый запрос.
- Сервер возвращает только нужную часть информации.
- Скрипт видоизменяет содержимое без перезагрузки.
Когда использовать AJAX, а когда — нет
Технология не универсальна. Разберем сценарии применения.
AJAX подходит, когда:
- нужно обновить часть интерфейса (корзина, форма);
- важна непрерывность медиапотока;
- требуется живой поиск (search) и автозаполнение;
- необходимо снизить нагрузку на серверный ресурс.
AJAX не подходит, когда:
- основной контент генерируется на клиенте (нужен SSR);
- высокий SEO-приоритет без настроенного рендеринга;
- аудитория работает с отключенным JavaScript;
- требуется простая навигация между статьями.
Отдельного внимания требует аналитика. В SPA смена состояния не создает новый просмотр автоматически. Необходимо отправлять событие page_view вручную.
Достоинства AJAX
Подход ценен для стриминга. YouTube использует асинхронные запросы для мини-плеера и рекомендаций.
Выделим три главных преимущества:
- Экономия трафика. Браузер не запрашивает весь документ. При этом итоговая скорость зависит от размера JS-бандла.
-
Динамические окна. Вывод остатков товара в интернет-магазине или подсказок. Контент выводится мгновенно.
AJAX позволяет добавить автозаполнение без перезагрузки страницы - Снижение нагрузки. Сервер обрабатывает только нужный объем информации.
Недостатки AJAX
Главный риск — трудности с индексацией при некорректной настройке плагинов.
Остальные недостатки:
- URL не отражает структуру сайта.
- Просмотры не фиксируются счетчиками веб-аналитики по умолчанию.
- Требуется включенный JS.
- Навигация ломается без History API.
- Риск клоакинга (маскировки).
Ниже представлена сводная таблица.
| Критерий | Преимущество | Недостаток / риск |
|---|---|---|
| UX / скорость | Страница не перезагружается, интерфейс отзывчив | Тяжёлый JS-бандл может ухудшить LCP и INP |
| Экономия трафика | Подгружается только изменённая часть данных | Реальная экономия зависит от размера ответа API и бандла |
| Нагрузка на сервер | Сервер возвращает только нужные данные, а не всю страницу | Множество мелких AJAX-запросов может создавать дополнительную нагрузку |
| SEO / индексация | При SSR/пререндере поисковик получает готовый HTML | Без SSR контент может не индексироваться или индексироваться с задержкой |
| История браузера | History API + pushState решают проблему навигации | Без pushState кнопка «Назад» работает непоследовательно |
| Веб-аналитика | Можно отслеживать детальные действия пользователя | Без ручной настройки маршруты SPA не фиксируются как отдельные pageview |
| Доступность без JS | — | Контент недоступен при отключённом JavaScript |
| Отладка | DevTools показывают все AJAX-запросы во вкладке Network | Сложнее отловить состояния гонки (race conditions) при параллельных запросах |
Резюме. Правильный AJAX для SEO
Подведем итоги:
-
Поисковики умеют работать с JS. Для вашей CMS существуют готовые плагины.
Огромная часть плагинов для WordPress так или иначе связана с AJAX-подходом - При проблемах настраивайте пререндер. Это гарантирует доступность HTML-кода.
- Обязательно обновляйте XML-карту. Сгенерируйте актуальный sitemap.xml после внедрения изменений.
Глоссарий терминов
- AJAX
- Asynchronous JavaScript and XML — подход к асинхронному обмену данными между браузером и сервером без полной перезагрузки страницы.
- XMLHttpRequest (XHR)
- Legacy-интерфейс браузера для отправки HTTP-запросов из JavaScript. Предшественник Fetch API.
- Fetch API
- Современный нативный интерфейс для выполнения HTTP-запросов, построенный на Promise. Поддерживается всеми актуальными браузерами.
- AbortController
- Встроенный механизм для отмены Fetch-запроса. Полезен в живом поиске и маршрутизации SPA.
- History API / pushState()
- Браузерный API, позволяющий изменять URL в адресной строке и управлять историей переходов без перезагрузки страницы.
- SSR (Server-Side Rendering)
- Серверный рендеринг: HTML страницы генерируется на сервере до отправки браузеру. Поисковик получает готовый контент.
- SSG (Static Site Generation)
- Статическая генерация страниц на этапе сборки проекта. Даёт максимальную скорость загрузки и предсказуемую индексацию.
- Dynamic Rendering
- Временное решение: сервер отдаёт разные версии страницы пользователям и поисковым ботам. Google называет его workaround, а не долгосрочной стратегией.
- Crawl Budget (краулинговый бюджет)
- Лимит поискового робота по количеству обращений к домену за единицу времени.
- Core Web Vitals
- Набор метрик Google для оценки пользовательского опыта: LCP (скорость загрузки основного контента), INP (отзывчивость на взаимодействие), CLS (стабильность вёрстки).
- SPA (Single Page Application)
- Одностраничное приложение. Весь интерфейс загружается однажды, навигация и обновление контента происходят через AJAX без перезагрузки.
FAQ об AJAX
Hfp,thtv самые популярные ответы про AJAX
Что такое AJAX простыми словами?
AJAX — это способ обновить часть страницы без её полной перезагрузки. Браузер отправляет запрос на сервер в фоновом режиме, получает данные (чаще всего в формате JSON) и обновляет только нужный блок интерфейса. Пользователь не замечает перехода — страница просто меняется.
Как поисковые системы индексируют AJAX-контент?
Google обрабатывает JS в два этапа: сначала сканирует страницу, затем отдельно её рендерит. Рендеринг может быть отложен, поэтому AJAX-контент иногда попадает в индекс с задержкой. «Яндекс» по умолчанию сам решает, рендерить ли JavaScript; режим можно задать вручную в «Яндекс Вебмастере». Надёжнее всего для SEO — использовать SSR или пререндер, чтобы робот получал готовый HTML без ожидания клиентского скрипта.
Чем Fetch API отличается от XMLHttpRequest?
Fetch API — современный стандарт для HTTP-запросов из JavaScript, построенный на Promise. Он удобнее в написании и поддерживает отмену запроса через AbortController. XMLHttpRequest — более старый интерфейс, работает на колбэках. XHR по-прежнему поддерживается браузерами и полезен в специфических случаях: например, для отслеживания прогресса загрузки файла через событие onprogress.
Нужно ли использовать pushState для SEO при AJAX?
Да. Без History API и pushState URL страницы не обновляется при смене контента через AJAX. Краулер не может идентифицировать уникальное состояние страницы — и, следовательно, не может правильно его проиндексировать. Функция pushState меняет адрес в браузере и добавляет запись в историю навигации без перезагрузки. Это обязательный шаг для AJAX-приложений с SEO-требованиями.
Когда лучше отказаться от AJAX и использовать SSR?
Если весь ключевой контент страницы генерируется на клиенте через JavaScript и при этом важна быстрая и предсказуемая индексация — лучше применять SSR или SSG. В этом случае сервер возвращает готовый HTML, который краулер получает сразу, без ожидания рендеринга. AJAX при этом остаётся полезным для отдельных динамических блоков: форм, счётчиков, подсказок, — но не для основного контента страницы.
Почему AJAX-страницы могут не учитываться в веб-аналитике?
В одностраничных приложениях смена состояния через pushState не создаёт новый просмотр страницы автоматически. Google Analytics 4 и другие системы аналитики фиксируют pageview только при явной отправке события. Без настройки SPA-трекинга часть визитов будет занижена или неверно атрибутирована. Решение: отправлять событие page_view вручную при каждом изменении маршрута.
Комментарии
Комментариев пока нет. Будьте первым!
Оставить комментарий