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

عندما يطلب تطبيق موردًا يندرج ضمن نطاق مشغّل الخدمات، يعترض مشغّل الخدمات الطلب ويعمل كخادم وكيل للشبكة، حتى إذا كان المستخدم غير متصل بالإنترنت. ويمكنه بعد ذلك تحديد ما إذا كان يجب عرض المورد من ذاكرة التخزين المؤقت باستخدام Cache Storage API، أو عرضه من الشبكة كما لو لم يكن هناك عامل خدمة نشط، أو إنشاؤه من خوارزمية محلية. يتيح لك ذلك تقديم تجربة عالية الجودة مثل تجربة تطبيق المنصة، حتى عندما يكون تطبيقك غير متصل بالإنترنت.
تسجيل مشغّل خدمات
قبل أن يتحكّم مشغّل الخدمات في صفحتك، يجب تسجيله في تطبيق الويب التقدّمي. وهذا يعني أنّه في المرة الأولى التي يفتح فيها المستخدم تطبيق الويب التقدّمي، تنتقل جميع طلبات الشبكة مباشرةً إلى الخادم لأنّ مشغّل الخدمات لا يتحكّم في صفحاتك بعد.
بعد التحقّق مما إذا كان المتصفّح يتوافق مع Service Worker API، يمكن لتطبيق الويب التقدّمي تسجيل مشغّل خدمات. بعد تحميله، يضبط عامل الخدمة نفسه بين تطبيق الويب التقدّمي والشبكة، ويعترض الطلبات ويعرض الردود المناسبة.
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register("/serviceworker.js");
}
التحقّق مما إذا كان عامل الخدمة مسجّلاً
للتحقّق مما إذا كان قد تم تسجيل عامل خدمة، استخدِم أدوات المطوّرين في متصفّحك المفضّل.
في متصفّحات Firefox والمستندة إلى Chromium (Microsoft Edge أو Google Chrome أو Samsung Internet):
- افتح أدوات المطوّرين، ثم انقر على علامة التبويب التطبيق.
- في اللوحة اليمنى، اختَر برامج الخدمة.
- تأكَّد من ظهور عنوان URL لبرنامج service worker النصي مع الحالة "تم التفعيل". (لمزيد من المعلومات، اطّلِع على دورة الحياة). في Firefox، يمكن أن تكون الحالة "قيد التشغيل" أو "متوقّف".
في Safari:
- انقر على تطوير > برامج الخدمة.
- ابحث في هذه القائمة عن إدخال يتضمّن المصدر الحالي. يؤدي النقر على هذا الإدخال إلى فتح أداة فحص في سياق مشغّل الخدمات.

النطاق
يحدّد المجلد الذي يتضمّن عامل الخدمة نطاقه. يمكن لأداة عامل الخدمة
الموجودة في example.com/my-pwa/sw.js
التحكّم في أي عملية تنقّل في المسار my-pwa أو ضمنه، مثل example.com/my-pwa/demos/
. يمكن لمشغّلي الخدمات التحكّم فقط في العناصر (الصفحات والمشغّلين، ويُشار إليها بشكل جماعي باسم "العملاء") ضمن نطاقهم.
ينطبق هذا النطاق على علامات تبويب المتصفّح ونوافذ تطبيقات الويب التقدّمية.
يُسمح باستخدام عامل خدمة واحد فقط لكل نطاق. عندما يكون أحد مشغّلي الخدمات نشطًا وقيد التشغيل، لا يتوفّر عادةً سوى مثيل واحد بغض النظر عن عدد العملاء (نوافذ تطبيقات الويب التقدّمية أو علامات تبويب المتصفّح) في الذاكرة.
تتضمّن متصفّح Safari إدارة نطاق أكثر تعقيدًا، تُعرف باسم الأقسام، وتؤثّر في طريقة عمل النطاقات مع إطارات iframe عبر النطاقات. لمزيد من المعلومات حول طريقة تنفيذ WebKit، يُرجى الاطّلاع على منشور المدونة.
مراحل النشاط
تتضمّن برامج الخدمة دورة حياة تحدّد طريقة تثبيتها بشكل منفصل عن عملية تثبيت تطبيق الويب التقدّمي.
تبدأ دورة حياة مشغّل الخدمات بتسجيل مشغّل الخدمات. يحاول المتصفّح بعد ذلك تنزيل ملف عامل الخدمة وتحليله. إذا نجحت عملية التحليل، يتم تشغيل حدث install
في مشغّل الخدمات. يتم تنشيط الحدث install
مرة واحدة فقط.
يتم تثبيت عامِل الخدمة تلقائيًا بدون الحاجة إلى إذن المستخدم، حتى إذا لم يثبّت المستخدم تطبيق الويب التقدّمي. تتوفّر واجهة برمجة التطبيقات Service Worker حتى على المنصات التي لا تتيح تثبيت تطبيقات الويب التقدّمية، مثل Safari وFirefox على أجهزة الكمبيوتر المكتبي.
بعد التثبيت، يجب تفعيل عامل الخدمة قبل أن يتمكّن من التحكّم في عملائه، بما في ذلك تطبيق الويب التقدّمي. عندما يصبح عامل الخدمة جاهزًا للتحكّم في عملائه، يتم تشغيل الحدث activate
. ومع ذلك، لا يمكن لمشغّل الخدمات المفعّل تلقائيًا إدارة الصفحة التي سجّلته إلا في المرة التالية التي تنتقل فيها إلى تلك الصفحة عن طريق إعادة تحميلها أو إعادة فتح تطبيق الويب التقدّمي.
يمكنك الاستماع إلى الأحداث في النطاق العام لبرنامج عامل الخدمة باستخدام العنصر 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");
});
تعديل عامل خدمة
يتم تعديل مشغّلات الخدمات عندما يرصد المتصفّح أنّ مشغّل الخدمات الذي يتحكّم في العميل والإصدار الجديد من ملف مشغّل الخدمات من الخادم يختلفان في عدد البايت.
بعد اكتمال عملية التثبيت بنجاح، ينتظر عامل الخدمة الجديد حتى يتم تفعيله إلى أن يتوقف عامل الخدمة القديم عن التحكّم في أي عملاء. تُعرف هذه الحالة باسم "في انتظار"، وهي الطريقة التي يضمن بها المتصفّح عدم تشغيل سوى إصدار واحد من عامل الخدمة في كل مرة.
لن تؤدي إعادة تحميل الصفحة أو إعادة فتح تطبيق الويب التقدّمي إلى أن يتحكّم مشغّل الخدمات الجديد في التطبيق. على المستخدم إغلاق جميع علامات التبويب والنوافذ التي تستخدم عامل الخدمة الحالي أو الانتقال بعيدًا عنها، ثم الرجوع إليها لمنح عامل الخدمة الجديد إذن التحكّم. لمزيد من المعلومات، اطّلِع على دورة حياة عامل الخدمة.
مدة بقاء مشغّل الخدمات
يمكن لعامل الخدمة المثبَّت والمسجَّل إدارة جميع طلبات الشبكة ضمن نطاقه. ويتم تشغيلها في سلسلة محادثات خاصة بها، ويتحكّم المتصفّح في تفعيلها وإيقافها، ما يتيح لها العمل حتى قبل فتح تطبيق الويب التقدّمي أو بعد إغلاقه. تعمل برامج الخدمة في سلسلة محادثات خاصة بها، ولكن قد لا تستمر حالة الذاكرة بين عمليات تشغيل برنامج الخدمة، لذا تأكَّد من أنّ أي شيء تريد إعادة استخدامه في كل عملية تشغيل متاح إما في IndexedDB أو في بعض مساحات التخزين الدائمة الأخرى.
إذا لم يكن عامل الخدمة قيد التشغيل، سيبدأ تشغيله عند إرسال طلب شبكة ضمن نطاقه، أو عند تلقّي حدث مشغِّل، مثل مزامنة دورية في الخلفية أو رسالة دفع.
يتم إنهاء عمل Service Workers إذا ظلّت غير نشطة لبضع ثوانٍ أو إذا كانت مشغولة لفترة طويلة جدًا. وتختلف المدة الزمنية لذلك بين المتصفّحات. إذا تم إنهاء عامل خدمة وحدث حدث يؤدي إلى بدء تشغيله، تتم إعادة تشغيله.
الإمكانات
يستخدم عامل الخدمة المسجَّل والنشط سلسلة محادثات ذات دورة حياة تنفيذ مختلفة تمامًا عن سلسلة المحادثات الرئيسية في تطبيق الويب التقدّمي. ومع ذلك، لا يتضمّن ملف مشغّل الخدمات أي سلوك تلقائيًا. لن يتم تخزين أي موارد مؤقتًا أو عرضها، بل يجب أن يتولّى الرمز الخاص بك تنفيذ ذلك، ويمكنك التعرّف على كيفية إجراء ذلك في الفصول التالية.
لا تقتصر إمكانات Service Worker على الخادم الوكيل أو عرض طلبات HTTP. تتوفّر ميزات أخرى بالإضافة إلى ذلك لأغراض أخرى، مثل تنفيذ الرموز البرمجية في الخلفية وإرسال إشعارات الويب الفورية ومعالجة الدفعات. سنتناول هذه الإضافات في قسم الإمكانات.