因此,您擁有一個漸進式網頁應用程式,並搭配Service Worker,可讓應用程式離線運作。太好了!您也已為網頁應用程式設定 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
參數:設為自首次嘗試要求以來經過的時間長度,以便正確歸因原始時間。- 傳遞至
goog.offlineGoogleAnalytics.initialize()
的設定物件parameterOverrides
屬性中提供的任何額外參數和值。舉例來說,您可以加入自訂維度,區分從服務工作者重新傳送的要求,與立即傳送的要求。
如果重新傳送要求成功,那就太好了!系統會從 IndexedDB 中移除該要求。如果重試失敗,且初始要求是在 24 小時前提出,則會保留在 IndexedDB
中,以便在服務工作者下次啟動時重試。請注意,Google Analytics 不會保證處理 四小時前觸發的命中記錄,但「以防萬一」重傳較舊的命中記錄應該不會造成問題。
sw-offline-google-analytics
也implements「網路優先,備用快取」策略,用於啟動 Google Analytics 所需的實際 analytics.js
JavaScript 程式碼。
我們還會推出更多功能!
sw-offline-google-analytics
是較大規模的 sw-helpers
專案的一部分,該專案是一系列程式庫,旨在為現有的服務工作者實作提供即插即用功能強化。
sw-appcache-behavior
也是該專案的一部分,這個程式庫會實作服務工作站中現有 AppCache 資訊清單中定義的快取策略。這項工具旨在協助您從 AppCache 遷移至服務工作者,同時維持一致的快取策略 (至少在初期)。
如果你有其他媒體庫的想法,歡迎與我們分享。因此,請在問題追蹤工具中提出要求!