تاريخ النشر: 31 يوليو 2025
اعتبارًا من الإصدار 139 من Chrome، يمكنك المشاركة في تجربة مصدر جديدة للعاملين المشترَكين ذوي العمر الأطول. تضيف الفترة التجريبية خيار extendedLifetime: true جديدًا للسماح للعاملين المشتركين بالبقاء نشطين بعد إغلاق آخر مستند.
حالة استخدام ميزة "فترة صلاحية أطول"
تريد العديد من المواقع الإلكترونية تنفيذ بعض المهام أثناء انتقال المستخدم إلى صفحة أخرى. على سبيل المثال، الكتابة إلى وحدة التخزين أو إعادة إرسال البيانات إلى الخوادم لحفظ الحالة أو تسجيل الإحصاءات
توفّر منصة الويب بعض واجهات برمجة التطبيقات للتعامل مع بعض حالات الاستخدام الأبسط، ولكن لكل منها قيود:
- يتم تنفيذ واجهات برمجة تطبيقات JavaScript المتزامنة، مثل عمليات الكتابة
localStorage، إلى أن تكتمل قبل إلغاء تحميل الصفحة الحالية. - يتضمّن
fetch APIعددًا من الخيارات، مثلkeepalive، ومؤخرًاfetchLater، التي تتيح إرسال الطلبات بعد إلغاء تحميل المستند لفترة قصيرة.
ومع ذلك، لا تغطي هذه الطلبات سوى العمل المتزامن باستثناء طلب fetch النهائي. ولا تسمح باستخدام واجهات برمجة التطبيقات غير المتزامنة، مثل IndexedDB أو Compression Streams أو Web Crypto للتجزئة أو التشفير. تكون العديد من واجهات برمجة التطبيقات، وخاصةً الأحدث منها، غير متزامنة لتجنُّب حظر سلسلة التعليمات الرئيسية، لذا فإنّ عدم إمكانية استخدام هذه الواجهات عند إلغاء التحميل يُعدّ أمرًا مقيّدًا.
البديل هو استخدام برامج الخدمة التي تعمل خارج دورات حياة الصفحات الفردية. ومع ذلك، هذا الحلّ ثقيل إلى حدّ ما، ويتضمّن متطلبات أكثر تعقيدًا لدورة الحياة والإدارة بالنسبة إلى المطوّرين، فضلاً عن متطلبات إضافية للعمليات والذاكرة بالنسبة إلى المستخدمين. كما أنّها لا تتطابق مع حالة الاستخدام الرئيسية لبرامج الخدمة (العمل كخادم وكيل لطلبات الشبكة). يبدو أنّ استخدام جميع عاملي الخدمة فقط لحالة استخدام إكمال بعض العمل عند إلغاء تحميل الصفحة هو أمر مبالغ فيه.
الحل المقترَح
SharedWorker API هي واجهة برمجة تطبيقات أخفّ وزنًا تُستخدَم لتخفيف عبء العمل عن سلسلة التعليمات الرئيسية. ومع ذلك، لا تبقى هذه البيانات نشطة حاليًا بعد انتهاء عمر المصدر (عند إلغاء تحميل آخر صفحة لهذا المصدر). يقترح Chrome إضافة خيار جديد إلى واجهة برمجة التطبيقات SharedWorker للسماح للعاملين المشترَكين بالبقاء نشطين لفترة قصيرة بعد إيقاف المستند.
يشجّع معيار HTML حاليًا عمليات التنفيذ على إبقاء العاملين المشتركين نشطين لفترة قصيرة بعد إلغاء تحميل المستند، وذلك لكي لا يؤدي التنقّل بين الصفحات من المصدر نفسه إلى إيقاف العامل المشترك ثم إعادة إنشائه. يقترح عرض العمر الممتد إبقاء العامل المشترَك نشطًا لبعض الوقت حتى إذا لم ينتقل المستخدم إلى وجهة من المصدر نفسه، وذلك كي يتمكّن من إنهاء العمل غير المتزامن.
يقترح هذا التصميم السماح للعاملين المشتركين بالبقاء نشطين بعد إلغاء تحميل آخر مستند، وذلك للمدة الزمنية نفسها التي يُسمح فيها للعاملين على الخادم بالبقاء غير نشطين، وهي 30 ثانية في Chrome. يُرجى العِلم أنّ الحدّ الأقصى لمدة بقاء العامل المشترَك بعد إلغاء التحميل هو مدة البقاء، وليس مدة عدم النشاط. أي أنّ الحدّ الأقصى البالغ 30 ثانية يبدأ من وقت إلغاء التحميل، وليس من وقت عدم النشاط. سيتم إلغاء العمل الذي بدأ ولم يكتمل بعد خلال تلك الفترة الزمنية.
تفعيل فترة الصلاحية الممتدة
يمكن تفعيل هذه الميزة على المواقع الإلكترونية للمستخدمين من خلال التسجيل في تجربة المصدر للعاملين المشترَكين ذوي العمر الأطول. بدلاً من ذلك، يمكن للمطوّرين تفعيل هذه الميزة في متصفّحهم باستخدام العلامة chrome://flags/#enable-experimental-web-platform-features.
مثال على الرمز
بعد الموافقة على التجربة أو ميزة "العمر الافتراضي الممتد"، فعِّل هذه الميزة باتّباع الخطوات التالية:
const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });
بما أنّ Shared Workers تتيح أيضًا استخدام الكائنات الثنائية الكبيرة، يمكن تفعيل هذه الميزة بدون نص برمجي منفصل. على سبيل المثال، لكتابة البيانات في IndexedDb:
const sharedWorkerScript = `
const transaction = db.transaction("analytics", "readwrite");
const store = transaction.objectStore("analytics");
const request = store.get("visitCount");
request.onsuccess = (event) => {
const newCount = (event.target.result || 0) + 1;
store.put(newCount, "visitCount");
};
`;
document.addEventListener("pagehide", () => {
const blob = new Blob([sharedWorkerScript], { type: "text/javascript" });
const blobURL = URL.createObjectURL(blob);
new SharedWorker(blobURL, { extendedLifetime: true });
});
لدينا أيضًا تطبيق نموذجي هنا: https://sharedworker-extendedlifetime.netlify.app/. عند إعادة تحميل الصفحة (أو إغلاقها وإعادة فتحها في غضون 30 ثانية)، يظل الحساب السابق متاحًا.
يمكن الاطّلاع على العاملين المشتركين في موقع إلكتروني معيّن على الرابط: chrome://inspect/#workers، وسيتم تحسين هذه الميزة قريبًا لتوضيح ما إذا تم استخدام الخيار extendedLifetime. ستستمر أيضًا في الظهور على هذه الصفحة لمدة 30 ثانية بعد إلغاء تحميل الصفحة.
مشاركة ملاحظاتك
نتطلّع إلى تلقّي ملاحظاتك حول التجربة الأصلية الموسّعة لـ Shared Worker.
تتم مناقشة شكل واجهة برمجة التطبيقات على GitHub، كما يتوفّر لدينا شرح فني أكثر تفصيلاً.
لإرسال ملاحظات حول طريقة تنفيذ Chrome لهذه الميزة، يمكنك الإبلاغ عن خطأ في Chromium.