Итак, у вас есть прогрессивное веб-приложение с сервис-воркером , позволяющим ему работать в автономном режиме. Большой! У вас также есть существующая настройка Google Analytics для вашего веб-приложения, и вы не хотите пропустить какие-либо аналитические данные, полученные в результате использования, происходящего в автономном режиме. Но если вы попытаетесь отправить данные в Google Analytics в автономном режиме, эти запросы не будут выполнены, и данные будут потеряны.
Решение, которое вас не должно удивить, — это сервисные работники! В частности, он добавляет код в ваш сервис-воркер для хранения запросов Google Analytics (с использованием IndexedDB
) и повторной их попытки позже, когда, возможно, будет доступна сеть. Мы поделились кодом для обработки этой логики в рамках веб-приложения Google I/O с открытым исходным кодом , но поняли, что это полезный шаблон, а копирование и вставка кода могут быть ненадежными.
Сегодня мы рады сообщить, что все, что вам нужно для обработки автономных запросов Google Analytics в вашем сервис-воркере, объединено в пакет npm : npm install --save-dev sw-offline-google-analytics
Использование sw-offline-google-analytics
В существующем коде сервисного работника добавьте следующее:
// This code should live inside your service worker JavaScript, ideally
// before any other 'fetch' event handlers are defined:
// First, import the library into the service worker global scope:
importScripts('path/to/offline-google-analytics-import.js');
// Then, call goog.offlineGoogleAnalytics.initialize():
// See https://github.com/GoogleChrome/workbox/tree/main/packages/workbox-google-analytics
goog.offlineGoogleAnalytics.initialize();
// At this point, implement any other service worker caching strategies
// appropriate for your web app.
Вот и все!
Что происходит под капотом?
sw-offline-google-analytics
настраивает новый обработчик событий fetch
в вашем сервис-воркере, который отвечает на запросы, отправленные в домен Google Analytics . (Библиотека игнорирует запросы, не относящиеся к Google Analytics, давая другим обработчикам событий fetch
вашего сервис-воркера возможность реализовать соответствующие стратегии для этих ресурсов.) Сначала она попытается выполнить запрос к сети. Если пользователь онлайн, все будет происходить как обычно.
Если сетевой запрос завершается неудачей , библиотека автоматически сохраняет информацию о запросе к IndexedDB
вместе с меткой времени , указывающей, когда запрос был первоначально сделан. Каждый раз при запуске вашего сервис-воркера библиотека будет проверять наличие запросов в очереди и пытаться отправить их повторно вместе с некоторыми дополнительными параметрами Google Analytics:
- Параметр
qt
, для которого установлено количество времени, прошедшее с момента первоначальной попытки запроса, чтобы гарантировать правильное присвоение исходного времени. - Любые дополнительные параметры и значения, указанные в
parameterOverrides
объекта конфигурации, передаваемого вgoog.offlineGoogleAnalytics.initialize()
. Например, вы можете включить специальный параметр , чтобы отличать запросы, отправленные работником службы повторно, от запросов, отправленных немедленно.
Если повторная отправка запроса увенчалась успехом, то отлично! Запрос удален из IndexedDB. Если повторная попытка не удалась и первоначальный запрос был сделан менее 24 часов назад, он будет сохранен в IndexedDB
, чтобы его можно было повторить при следующем запуске сервисного работника. Обратите внимание, что обращения Google Analytics старше четырех часов не гарантированно будут обработаны, но повторная отправка более старых обращений «на всякий случай» не должна повредить.
sw-offline-google-analytics
также реализует стратегию «сначала сеть, возврат к кэшу» для фактического кода analytics.js
необходимого для загрузки Google Analytics.
Это еще не все!
sw-offline-google-analytics
является частью более крупного проекта sw-helpers
, который представляет собой набор библиотек, предназначенных для внесения дополнительных улучшений в существующие реализации сервис-воркеров.
Также частью этого проекта является sw-appcache-behavior
— библиотека, реализующая стратегии кэширования, определенные в существующем манифесте AppCache внутри сервис-воркера. Он предназначен для того, чтобы помочь вам перейти с AppCache на Service Workers, сохраняя при этом согласованную стратегию кэширования, по крайней мере, на начальном этапе.
Если у вас есть другие идеи по созданию библиотеки, мы будем рады услышать ваше мнение. Поэтому, пожалуйста, отправьте запрос в систему отслеживания проблем !