تعديلات على cache.addAll() وImportScripts() لإدخال التعديلات في الإصدار Chrome 71

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

عدم السماح باستيراد النصوص البرمجية غير المتزامنة()

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

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

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

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

بدلاً من تعليمة برمجية مثل هذه:

// This only works in Chrome 70 and below.
self.addEventListener('fetch', event => {
  importScripts('my-fetch-logic.js');
  event.respondWith(self.customFetchLogic(event));
});

يجب أن يظهر رمز مشغّل الخدمات على النحو التالي:

// Move the importScripts() to the top-level scope.
// (Alternatively, import the same URL in the install handler.)
importScripts('my-fetch-logic.js');
self.addEventListener('fetch', event => {
  event.respondWith(self.customFetchLogic(event));
});

الإيقاف النهائي لعناوين URL المتكرّرة التي يتم تمريرها إلى cache.addAll()

إذا كنت تستخدم واجهة برمجة التطبيقات Cache Storage API إلى جانب أحد مشغّلي الخدمات، هناك تغيير بسيط آخر في الإصدار 71 من Chrome للتوافق مع المواصفات ذات الصلة. عند تمرير عنوان URL نفسه في عدة مرات إلى استدعاء واحد إلى cache.addAll()، تنص المواصفات على أنّه يجب رفض الوعود التي تعرضها المكالمة.

قبل الإصدار 71 من Chrome، لم يتم اكتشاف ذلك، وكان يتم تجاهل عناوين URL المكرّرة.

لقطة شاشة لرسالة التحذير في "وحدة تحكّم Chrome"
بدءًا من الإصدار 71 من Chrome، ستظهر لك رسالة تحذير تم تسجيلها في وحدة التحكّم.

هذا التسجيل هو مقدّمة عن الإصدار 72 من Chrome، حيث تؤدي عناوين URL المكرّرة إلى رفض cache.addAll() بدلاً من مجرد إرسال تحذير مسجَّل. في حال طلب استدعاء cache.addAll() كجزء من سلسلة الوعود التي تم إرسالها إلى InstallEvent.waitUntil()، كممارسة شائعة، قد يؤدي رفض الخدمة إلى تعذُّر تثبيت عامل الخدمة.

إليك بعض الأمثلة على المشاكل التي قد تواجهها:

const urlsToCache = [
  '/index.html',
  '/main.css',
  '/app.js',
  '/index.html', // Oops! This is listed twice and should be removed.
];

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open('my-cache').then(cache => cache.addAll(urlsToCache))
  );
});

لا ينطبق هذا الشرط إلا على عناوين URL الفعلية التي يتم تمريرها إلى cache.addAll()، ولن يؤدي التخزين المؤقت إلى رفض ما يؤدي تخزينه مؤقتًا إلى ردَّين متكافئَين لهما عنوانَي URL مختلفَين، مثل '/' و'/index.html'.

اختبار تنفيذ عامل الخدمة على نطاق واسع

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