استخدام "إحصاءات Google" بلا اتصال بالإنترنت

لقد أصبح لديك تطبيق ويب تقدّمي، وهو مكتمل بواسطة عامل خدمات يسمح له بالعمل بلا اتصال بالإنترنت. رائع! تم أيضًا إعداد "إحصاءات Google" حاليًا لتطبيق الويب الخاص بك، ولا تريد أن تفوتك أي إحصاءات تحليلية ناتجة عن الاستخدام الذي يحدث بلا اتصال بالإنترنت. ولكن إذا حاولت إرسال البيانات إلى "إحصاءات Google" أثناء عدم الاتصال بالإنترنت، ستتعذّر هذه الطلبات وستفقد البيانات.

الحل، ينبغي ألا يفاجئك أن تتعلمه، هو عاملو الخدمة! وعلى وجه التحديد، يضيف الرمز إلى مشغّل الخدمات لتخزين طلبات "إحصاءات Google" (باستخدام IndexedDB) وإعادة المحاولة في وقت لاحق عند توفّر شبكة. لقد شاركنا الرموز للتعامل مع هذا المنطق كجزء من تطبيق الويب المفتوح Google I/O، ولكنّنا أدركنا أنّ هذا النمط مفيد ويمكن أن يكون نسخ الرمز ولصقه قابلاً للكسر.

يسرّنا اليوم الإعلان عن أنّ كل ما تحتاج إليه للتعامل مع طلبات "إحصاءات Google" بلا اتصال بالإنترنت ضمن مشغّل الخدمات لديك قد تم تجميعه في حزمة 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". (تتجاهل المكتبة الطلبات غير التابعة لخدمة "إحصاءات Google"، ما يمنح معالِجات أحداث fetch الأخرى التابعة لعامل الخدمة فرصة لتنفيذ الاستراتيجيات المناسبة لهذه الموارد). وسيحاول أولاً تنفيذ الطلب ضد الشبكة. إذا كان المستخدم متصلاً بالإنترنت، سيسير ذلك كالمعتاد.

في حال تعذُّر طلب الشبكة، ستتضمّن المكتبة تلقائيًا معلومات حول الطلب المُرسَل إلى IndexedDB، بالإضافة إلى طابع زمني يشير إلى وقت تقديم الطلب. في كل مرة يبدأ تشغيل مشغّل الخدمات، ستتحقق المكتبة من الطلبات في قائمة الانتظار وتحاول إعادة إرسالها، إلى جانب بعض مَعلمات "إحصاءات Google" الإضافية:

  • مَعلمة qt، يتم ضبطها على مقدار الوقت المنقضي منذ محاولة الطلب للمرة الأولى، لضمان تحديد الوقت الأصلي بشكل صحيح.
  • أي مَعلمات إضافية وقيم تم تقديمها في السمة parameterOverrides لعنصر الإعداد الذي تم تمريره إلى goog.offlineGoogleAnalytics.initialize(). على سبيل المثال، يمكنك تضمين سمة مخصّصة للتمييز بين الطلبات التي تمت إعادة إرسالها من مشغّل الخدمة وتلك التي تم إرسالها على الفور.

إذا نجحت إعادة إرسال الطلب، فهذا أمر رائع! تمت إزالة الطلب من IndexedDB. إذا تعذّرت إعادة المحاولة وتم تقديم الطلب الأولي قبل أقل من 24 ساعة، سيتم الاحتفاظ به في "IndexedDB" لإعادته في المرة التالية التي يبدأ فيها مشغّل الخدمة. تجدر الإشارة إلى أنّه لا يمكن ضمان معالجة النتائج في "إحصاءات Google" التي مرّ عليها أكثر من أربع ساعات، إلا أنّ إعادة إرسال النتائج القديمة إلى حدّ ما "في حال حدوث ذلك" لن يضر.

implements sw-offline-google-analytics أيضًا استراتيجية "الشبكة أولاً، الرجوع إلى ذاكرة التخزين المؤقت" لرمز JavaScript analytics.js الفعلي اللازم لتشغيل "إحصاءات Google" تمهيدًا.

لا يزال هناك المزيد في المستقبل!

sw-offline-google-analytics هو جزء من مشروع sw-helpers الأكبر، وهو مجموعة من المكتبات التي تهدف إلى توفير تحسينات في عمليات تنفيذ مشغّلي الخدمات الحاليين.

وتندرج أيضًا ضمن هذا المشروع sw-appcache-behavior، وهي مكتبة تنفِّذ استراتيجيات التخزين المؤقت المحدّدة في بيان AppCache الحالي داخل مشغّل خدمات. ويهدف هذا الإصدار إلى مساعدتك في الانتقال من AppCache إلى مشغّلي الخدمات مع الحفاظ على استراتيجية تخزين مؤقت متسقة، على الأقل.

إذا كانت لديك أفكار أخرى للمكتبة، يسرّنا سماع رأيك. لذلك يُرجى تقديم طلب إلى أداة تتبُّع المشاكل.