Почему navigator.sendBeacon — это не просто альтернатива AJAX

Когда речь заходит об отправке аналитических данных на сервер, большинство разработчиков автоматически вспоминают `fetch` или `XMLHttpRequest`. Но в действительности эти методы не всегда подходят — особенно в тех случаях, когда пользователь покидает страницу. Именно здесь на сцену выходит `navigator.sendBeacon`, созданный специально для надёжной отправки данных даже в момент выгрузки документа (unload).
В отличие от традиционных методов, `sendBeacon` работает асинхронно и не блокирует переход пользователя на другую страницу. Это делает его идеальным инструментом для сбора аналитики, особенно при отслеживании событий, происходящих на границе жизненного цикла страницы: клики по внешним ссылкам, закрытие вкладки, переходы по внутренней навигации и т.д.
Как работает navigator.sendBeacon под капотом

Когда вы вызываете `navigator.sendBeacon(url, data)`, браузер помещает ваш запрос в специальную очередь фоновой отправки. Он не ожидает ответа от сервера и не блокирует основной поток. Это особенно важно в мобильных сетях или при слабом соединении, где задержка может повлиять на UX.
Технически, данные отправляются с заголовком `Content-Type: text/plain;charset=UTF-8`, если передано строковое тело, или `application/x-www-form-urlencoded`, если FormData. Максимальный размер полезной нагрузки зависит от браузера, но, как правило, безопасный предел — около 64 КБ.
Пример использования sendBeacon для аналитики
Вот базовый пример, как организовать отправку пользовательского события при уходе со страницы:
```javascript
window.addEventListener('unload', function () {
const data = JSON.stringify({
event: 'page_exit',
timestamp: Date.now(),
userId: 'abc123'
});
navigator.sendBeacon('/analytics', data);
});
```
Этот код гарантирует, что даже если пользователь закроет вкладку или нажмёт "Назад", информация о событии всё равно попадёт на сервер. Такие сценарии не всегда надёжно обрабатываются через `fetch`, так как соединение может быть прервано до завершения запроса.
Кейсы из реальной практики: кто и как использует sendBeacon

Одним из ярких примеров использования `navigator.sendBeacon для аналитики` является применение в крупных медиа-платформах. Например, в The New York Times реализована отправка аналитических событий при закрытии статьи: данные о времени чтения, глубине прокрутки и последнем видимом параграфе передаются на сервер с помощью `sendBeacon`.
Другой пример — e-commerce проекты, такие как Shopify. Аналитика о действиях пользователя, например, просмотр товара или добавление в корзину, отправляется с помощью `sendBeacon` при закрытии вкладки, чтобы получить более полную картину поведения даже в случае незавершённой сессии.
Такие подходы позволяют:
- Снизить потери данных при резком завершении сессии
- Увеличить точность расчёта показателей вовлечённости
- Освободить основной поток от лишних сетевых вызовов
navigator.sendBeacon примеры: что важно учесть
Хотя отправка аналитики с `navigator.sendBeacon` кажется простой, есть несколько нюансов, о которых стоит помнить:
- Безопасность: `sendBeacon` работает только с тем же происхождением (same-origin), если явно не разрешить CORS на сервере.
- Ограничения данных: лучше отправлять только критически важную информацию — объём тела должен быть минимален.
- Формат данных: предпочтительнее использовать `JSON.stringify`, однако поддерживается и `FormData`.
Вот что нужно обязательно учесть при реализации:
- Используйте `navigator.sendBeacon` для событий, которые происходят *на выходе* со страницы.
- Не полагайтесь на него для важных транзакций (например, финализации покупки) — он не гарантирует доставку.
- Тестируйте поведение в разных браузерах: в Safari, например, есть ограничения на размер и частоту вызовов.
Лучшие практики использования sendBeacon для аналитики
Чтобы использовать `sendBeacon` эффективно, следуйте этим практикам:
- Собирайте данные заранее: агрегируйте события в течение сессии и отправляйте всё одним пакетом при выгрузке.
- Минимизируйте нагрузку: не отправляйте слишком крупные JSON-объекты; вырежьте ненужные поля.
- Добавьте резервный механизм: в случае, если `navigator.sendBeacon` недоступен, предусмотрите запасной метод (например, `fetch` с коротким таймаутом).
Когда sendBeacon — это must-have
Использование sendBeacon для аналитики оправдано в следующих случаях:
- Отслеживание времени на странице, если пользователь закрывает вкладку
- Последнее действие перед уходом со страницы (например, scroll depth)
- Сбор информации о кликах по рекламе или внешним ссылкам
- Завершение пользовательского сценария, который не привёл к конверсии
Вывод: стоит ли внедрять sendBeacon в ваш проект
Если вы хотите минимизировать потери в аналитике и получить более полную картину поведения пользователей, `navigator.sendBeacon` — ваш инструмент. Он прост в применении, не мешает пользовательскому опыту и идеально подходит для отправки данных в фоновом режиме. В сочетании с другими методами, такими как `fetch`, он становится мощным элементом современной фронтенд-аналитики.
Поддержка технологии высока: по состоянию на начало 2024 года `navigator.sendBeacon` поддерживается во всех современных браузерах, включая Chrome, Firefox, Safari и Edge. Это делает его надёжным стандартом для сбора аналитики, особенно в условиях динамичного поведения пользователей.



