مشغّلو الخدمات

يتوقّع المستخدمون أن تبدأ التطبيقات على اتصالات الشبكة البطيئة أو غير المستقرة، أو حتى عندما تكون غير متصلة بالإنترنت. ويتوقعون أن يكون المحتوى الذي تفاعلوا معه مؤخرًا، مثل المقاطع الصوتية أو التذاكر وبرامج الرحلات، متاحًا وسهل الاستخدام. في حال تعذّر تنفيذ طلب معيَّن، يتوقّع المستخدم أن يخبره بذلك بدلاً من أن يفشل أو يتعطل بدون تنبيه صوتي. ويرغب المستخدمون في القيام بذلك بسرعة. ويتبيّن لنا في هذه الدراسة أنّ بالمللي ثانية تُحقّق الملايين، فإنّ أي تحسين في أوقات التحميل تبلغ 0.1 ثانية يمكن أن يؤدي إلى زيادة الإحالات الناجحة بنسبة تصل إلى 10%. باختصار: يتوقع المستخدمون أن تكون تطبيقات الويب التقدّمية (PWA) موثوقة، وهذا هو السبب وراء توفير موفّري الخدمات.

مرحبًا عمال الخدمة

مشغّل الخدمات كخادم وكيل وسيط، يعمل من جهة الجهاز بين تطبيق الويب التقدّمي (PWA) والخوادم، ويشمل ذلك الخوادم الخاصة بك والخوادم على مستوى النطاقات.

عندما يطلب أحد التطبيقات موردًا يغطي نطاق مشغّل الخدمة، بما في ذلك عندما يكون المستخدم غير متصل بالإنترنت، يعترض عامل الخدمة الطلب، ويعمل كخادم وكيل للشبكة. بعد ذلك، يمكنها تحديد ما إذا كان يجب عرض المورد من ذاكرة التخزين المؤقت عبر واجهة برمجة تطبيقات تخزين ذاكرة التخزين المؤقت، من الشبكة كما يحدث عادةً بدون عامل خدمات، أو إنشاؤه من خوارزمية محلية. يتيح لك ذلك توفير تجربة مماثلة لتلك التي يوفّرها تطبيق نظام أساسي، ويمكن أن يعمل تمامًا بلا اتصال بالإنترنت.

تسجيل عامل خدمات

قبل أن يتحكّم مشغّل الخدمات في صفحتك، يجب أن تكون مسجَّلة في تطبيق الويب التقدّمي الخاص بك. وهذا يعني أنّه في المرة الأولى التي يصل فيها المستخدم إلى تطبيق الويب التقدّمي (PWA)، ستنتقل طلبات الشبكة مباشرةً إلى الخادم لأنّ مشغّل الخدمة لا يتحكم في صفحاتك بعد.

بعد التحقّق مما إذا كان المتصفِّح يتوافق مع Service Worker API، يمكن لتطبيق PWA تسجيل مشغّل خدمات. عند تحميل التطبيق، ينشئ مشغّل الخدمة متجرًا بين تطبيق الويب التقدّمي (PWA) والشبكة، مع اعتراض الطلبات وعرض الاستجابات المقابلة.

if ('serviceWorker' in navigator) {
   navigator.serviceWorker.register("/serviceworker.js");
}

التحقّق مما إذا كان مشغّل الخدمات مسجَّلاً

للتحقّق مما إذا كان مشغّل الخدمات مسجَّلاً، استخدِم أدوات المطوّرين في متصفّحك المفضّل.

في المتصفّحات التي تستخدم Firefox وChromium (مثل Microsoft Edge أو Google Chrome أو Samsung Internet):

  1. افتح أدوات المطوّرين، ثم انقر على علامة التبويب التطبيق.
  2. في اللوحة اليمنى، اختَر مشغِّلو الخدمات.
  3. تحقَّق من أنّ عنوان URL للنص البرمجي لمشغّل الخدمة يظهر بالحالة "تم التفعيل". (ستتعرف على معنى هذه الحالة في قسم دورة الحياة في هذا الفصل). في متصفّح Firefox، يمكن أن تكون الحالة "قيد التشغيل" أو "متوقفة".

في Safari:

  1. انقر على قائمة تطوير، ثم القائمة الفرعية عاملو الخدمات.
  2. تحقَّق من أنّ الإدخال يتضمّن المصدر الحالي يظهر في القائمة الفرعية. حيث يفتح المفتش على سياق عامل الخدمة.
أدوات المطوّرين المخصصة لـ "مشغّلي الخدمات" على Chrome وFirefox وSafari
أدوات المطوّرين المخصصة لمشغّلي الخدمات على Chrome وFirefox وSafari

النطاق

ويحدِّد المجلد الذي يضم مشغّل الخدمات نطاقه. يمكن لمشغّل الخدمات المتواجد في example.com/my-pwa/sw.js التحكّم في أي عملية تنقّل في مسار my-pwa أو في أسفله، مثل example.com/my-pwa/demos/. يمكن لمشغّلي الخدمات التحكّم فقط في العناصر (الصفحات والعاملين، ويُشار إليهم جميعًا باسم "العملاء") ضمن نطاقهم. ينطبق النطاق على علامات تبويب المتصفِّح ونوافذ تطبيق الويب التقدّمي (PWA).

يُسمح فقط بمشغّل خدمات واحد لكل نطاق. عندما تكون السياسة نشطة وقيد التشغيل، لا يتوفّر عادةً سوى مثيل واحد بغض النظر عن عدد البرامج العميلة في الذاكرة (مثل نوافذ PWA أو علامات تبويب المتصفِّح).

يتميز Safari بإدارة نطاق أكثر تعقيدًا، تُعرَف باسم الأقسام، ما يؤثر في طريقة عمل النطاقات إذا كان لديك إطارات iframe عبر النطاقات. لقراءة المزيد حول تنفيذ WebKit، يمكنك قراءة مشاركة المدونة.

دورة الحياة

لدى مقدّمي الخدمات دورة حياة توضّح طريقة تركيبهم، ويكون ذلك منفصلاً عن عملية تثبيت تطبيق الويب التقدّمي (PWA). تبدأ دورة حياة عامل الخدمة بتسجيل عامل الخدمات. بعد ذلك، يحاول المتصفِّح تنزيل ملف مشغّل الخدمات وتحليله. إذا نجحت عملية التحليل، يتم تنشيط حدث "install" الخاص به. يتم تنشيط حدث "install" مرّة واحدة فقط.

يتم تثبيت مشغّل الخدمات بدون طلب إذن من المستخدم، حتى إذا لم يثبِّت المستخدم تطبيق الويب التقدّمي (PWA). تتوفّر Service Worker API أيضًا على الأنظمة الأساسية التي لا تتيح تثبيت تطبيق الويب التقدّمي (PWA)، مثل متصفّح Safari وFirefox على أجهزة الكمبيوتر المكتبي.

بعد التثبيت، لا يتحكم عامل الخدمات في عملائه بعد، بما في ذلك تطبيق الويب التقدّمي (PWA). يجب تفعيله أولاً. عندما يكون مشغّل الخدمات جاهزًا للتحكّم في عملائه، سيتم تنشيط حدث "activate". مع ذلك، لا يعني هذا أنّ الصفحة التي سجّلت مشغّل الخدمات ستتم إدارتها. ولن يتحكّم مشغّل الخدمات تلقائيًا إلى أن تنتقل إلى تلك الصفحة في المرة التالية، إما من خلال إعادة تحميل الصفحة أو إعادة فتح تطبيق الويب التقدّمي (PWA).

يمكنك رصد الأحداث في النطاق العمومي لمشغّل الخدمات باستخدام العنصر self.

serviceworker.js

// This code executes in its own worker or thread
self.addEventListener("install", event => {
   console.log("Service worker installed");
});
self.addEventListener("activate", event => {
   console.log("Service worker activated");
});

تعديل عامل خدمات

يتم تحديث مشغّلي الخدمات عندما يكتشف المتصفِّح أنّ مشغّل الخدمات الذي يتحكّم حاليًا في العميل والنسخة الجديدة (من الخادم) من الملف نفسه تختلف عن بعضها بالبايت.

بعد إجراء التثبيت بنجاح، سينتظر مشغّل الخدمات الجديد ليتم تفعيله إلى أن يتوقف مشغّل الخدمات الحالي (القديم) عن التحكّم في أي عملاء. تُسمى هذه الحالة "قيد الانتظار"، وهي الطريقة التي يضمن بها المتصفِّح تشغيل إصدار واحد فقط من مشغّل الخدمات في كل مرة. لن يؤدي إعادة تحميل صفحة أو إعادة فتح تطبيق الويب التقدّمي (PWA) إلى فرض سيطرتك على مشغّل الخدمة الجديد. على المستخدم إغلاق جميع علامات التبويب والنوافذ أو الانتقال إليها باستخدام مشغّل الخدمات الحالي ثم الرجوع إلى الصفحة السابقة. وعندها فقط سيتولى عامل الخدمات الجديد التحكم. يمكنك الانتقال إلى مقالة مراحل نشاط عاملي الخدمات هذه للحصول على مزيد من المعلومات.

عمر عامل الخدمة

وبمجرد التثبيت والتسجيل، يمكن لعامل الخدمات إدارة جميع طلبات الشبكة ضمن نطاقه. ويعمل هذا البرنامج على سلسلة محادثات خاصة به، كما يتيح المتصفِّح إمكانية تفعيلها وإنهائها. ويتيح ذلك العمل حتى قبل فتح تطبيق الويب التقدّمي (PWA) أو بعده. وعلى الرغم من أنّ مشغّلي الخدمات يستخدمون سلسلة التعليمات الخاصة بهم، ليس هناك ما يضمن استمرار حالة الذاكرة بين عمليات تشغيل مشغّل الخدمات، لذا تأكَّد من أنّ أي عنصر تريد إعادة استخدامه في كل عملية تشغيل متاح إما في IndexedDB أو مساحة تخزين دائمة أخرى.

وإذا لم يكن مشغّل الخدمات قيد التشغيل، سيبدأ عند طلب ذلك طلب شبكة في نطاقه، أو عند تلقّي حدث تشغيل، مثل المزامنة الدورية في الخلفية أو رسالة فورية.

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

الإمكانات

بالنسبة إلى مشغّل خدمات مسجَّل ونشط، لديك سلسلة محادثات بدورة حياة تنفيذ مختلفة تمامًا عن المرحلة الرئيسية في تطبيق الويب التقدّمي (PWA). ومع ذلك، ليس هناك أي سلوك تلقائي لملف مشغّل الخدمات. ولن يخزن أو يعرض أي موارد في ذاكرة التخزين المؤقت، حيث يجب أن يتم ذلك من خلال التعليمات البرمجية. يمكنك التعرّف على كيفية إجراء ذلك في الفصول التالية.

لا تقتصر إمكانات مشغّل الخدمة على استخدام الخادم الوكيل أو تقديم طلبات HTTP فحسب، بل تتوفّر ميزات أخرى فوقه لأغراض أخرى، مثل تنفيذ رمز الخلفية والإشعارات الفورية على الويب ومعالجة عمليات الدفع. سنناقش هذه الإضافات في فصل الإمكانات.

المراجِع