تاريخ النشر: 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 ثانية بعد إلغاء تحميل الصفحة.
مشاركة ملاحظاتك
نتطلّع إلى تلقّي ملاحظاتك حول الإصدار التجريبي من ميزة "مصدر العامل المشترَك" التي تم تمديد مدة صلاحيتها.
تتم مناقشة شكل واجهة برمجة التطبيقات على GitHub، ويتوفّر لدينا شرح فني أكثر تفصيلاً.
لإرسال ملاحظات حول طريقة تنفيذ Chrome لهذه الميزة، يُرجى إرسال تقرير عن خلل في Chromium.