تغييرات في سلوك BFcache باستخدام منافذ رسائل الإضافات

Mingyu Lei
Mingyu Lei

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

منفذ إضافة الرسائل

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

لمزيد من المعلومات، يُرجى الاطّلاع على تمرير الرسائل.

ميزة "التخزين المؤقت للصفحات"

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

عندما تكون الصفحة في BFCache، تكون في حالة تجميد لا يُسمح فيها بتنفيذ JavaScript. وهذا يعني أنّه لا يمكنه معالجة الرسائل التي يتلقّاها.

لمزيد من المعلومات، يُرجى الاطّلاع على التخزين المؤقت للصفحات السابقة أو اللاحقة.

تأثير منافذ رسائل الإضافات على BFCache

باختصار، قد تؤدي إضافة تُرسِل رسائل إلى صفحة في BFCache إلى إزالة ذاكرة التخزين المؤقت والتأثير في الأداء.

عند تخزين صفحة تتضمّن منفذ رسالة إضافة مفتوحًا في BFCache، يبقى المنفذ مفتوحًا. بعد استعادة الصفحة من BFCache، سيظل بإمكان عمال خدمة الإضافة استخدام المرجع القديم لقناة الرسائل لنشر الرسائل في نص المحتوى.

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

لتجنُّب مواجهة المشاكل المتعلّقة بفقدان الرسائل، يتم في التنفيذ الحالي لمتصفّح Chrome إزالة الصفحة المضيفّة من BFCache وتجاهل الرسالة. إذا عاد المستخدم إلى الصفحة، سيتم تحميلها من جديد، ما يسمح للإضافة بإعداد اتصال جديد.

من ناحية أخرى، يفرض هذا التنفيذ قيودًا على السيناريوهات التي تنطبق فيها BFCache، ما يحدّ من المكاسب في الأداء، خاصةً في الإضافات التي تتضمّن آليات البث أو آليات فحص الاتصال التي تُرسِل الرسائل بانتظام إلى جميع عمليات الربط. بالإضافة إلى ذلك، بما أنّ عملية الاستبعاد يتم تفعيلها عندما ترسل الإضافة رسالة إلى البرنامج النصي للمحتوى، لا تتوفّر لمطوّري الويب أي وسيلة لمنع استبعاد صفحاتهم.

لتحسين الأداء العام، نخطّط لإدخال سلوك جديد لميناء الرسائل.

السلوك الجديد: إغلاق قناة الرسائل عند تخزين الصفحة في BFCache

بدءًا من الإصدار 123 من Chrome، عند تخزين صفحة تتضمّن منفذ رسالة إضافة مفتوحًا في BFCache، يتم إغلاق قناة الرسائل الأساسية بشكل استباقي من جانب نص المحتوى. نتيجةً لذلك، سيتم إغلاق جميع منافذ الرسائل، وستتلقّى الإضافة حدث onDisconnect.

بما أنّ القناة مغلقة، لن يتم إرسال أي رسائل إلى الصفحة عندما تكون في BFCache. وبالتالي، لن يتمّ إزالة الصفحة بسبب الإضافة.

حتى بعد استعادة الصفحة من BFCache، لن تتم إعادة فتح قناة الرسائل المغلقة. إنّ الإجراء المقترَح لمؤلفي الإضافات هو الاستماع إلى أحداث دورة حياة الصفحة وإعداد اتصال جديد عند استعادة الصفحة من BFCache، كما هو موضّح في المثال التالي.

// content script

let port;

window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    // The page is restored from BFCache, set up a new connection.
    port = chrome.runtime.connect();
  }
});

يمكنك الاطّلاع على مزيد من المعلومات عن محادثة WECG من ممثّلي المتصفحات المختلفة (ضمن المشكلة 474).

هل سيؤثّر ذلك عليّ؟

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

اختبار السلوك الجديد

لتفعيل التجربة بشكلٍ قسري في Chrome 123:

  1. شغِّل Chrome مع العلامة التالية التي تفرض السلوك الجديد:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. انتقِل إلى صفحة، وتفاعل مع إضافتك إذا لزم الأمر، لكي يفتح ملف محتوى مكتوب منفذًا لإضافة المحتوى.

  3. انتقِل بعيدًا ثم ارجع. من المفترض أن تظهر الصفحة الآن، ولكن من المفترض أن يتم إيقاف قناة الرسائل بين نص المحتوى ومشغّل الخدمة.

  4. اختبِر ما إذا كانت الإضافة لا تزال تعمل كالمعتاد، وإذا لم تكن كذلك، عليك إعادة الربط يدويًا كما هو موضّح في القسم السابق.

تحديد المشاكل البسيطة باستخدام السلوك القديم

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

  1. تأكَّد من أنّ إصدار Chrome هو 123 على الأقل. من الأفضل استخدام Chrome Canary، الذي يتضمّن تحذيرًا إضافيًا لتسهيل الاختبار.
  2. شغِّل Chrome باستخدام العلامة التالية التي تفرض السلوك القديم:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. انتقِل إلى صفحة مؤهَّلة لاستخدام BFCache بدون تشغيل الإضافة (على سبيل المثال، موقع إلكتروني بسيط مثل https://example.com/). اتّبِع الدليل التعليمي لميزة BFCache للتأكّد من استعادتها من BFCache.

  4. ثبِّت الإضافة وفعِّلها، ثم اختبِر أهلية BFCache مرة أخرى. يمكنك الانتقال يدويًا إلى صفحة أخرى والانتظار لبعض الوقت إلى أن تنشر الإضافة رسالة في صفحة BFCached، ثم الانتقال مرة أخرى إلى الصفحة الأصلية.

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

    في الإصدار 124.0.6315.0 من Chrome Canary والإصدارات الأحدث، سيظهر لك أيضًا التحذير التالي في الصفحة:

    تحذير يظهر عند عدم استعادة صفحة من BFCache
    تحذير يظهر عند عدم استعادة صفحة من BFCache

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

المخطط الزمني للإصدار

ونخطّط لزيادة استخدام السلوك الجديد تدريجيًا بدءًا من الإصدار 123 من Chrome. في ما يلي الخطة التفصيلية:

التاريخ الإنجاز المخطَّط
‫15 شباط (فبراير) ابدأ تجربة السلوك الجديد في الإصدار 123 من Chrome Canary وDev.
‫7 آذار (مارس) ابدأ تجربة السلوك الجديد في الإصدار التجريبي من Chrome 123.
18 آذار (مارس) طرح السلوك الجديد لنسبة %4 من المستخدمين في الإصدار الثابت من Chrome 123
‫25 مارس طرح السلوك الجديد لـ 50% من المستخدمين في الإصدار الثابت من Chrome 123
2 نيسان (أبريل) تنتهي التجربة، ما يجعل السلوك الجديد هو السلوك التلقائي.