एक्सटेंशन मैसेज पोर्ट के साथ BFcache के व्यवहार में बदलाव

Mingyu Lei
Mingyu Lei

बैक/फ़ॉरवर्ड कैश मेमोरी (या BFCache), ब्राउज़र का ऐसा ऑप्टिमाइज़ेशन है जो तुरंत पीछे और आगे जाने की सुविधा देता है. हम Chrome BFCache में बदलाव कर रहे हैं. इन बदलावों का असर, मैसेज पोर्ट का इस्तेमाल करने वाले एक्सटेंशन पर पड़ सकता है. अगर आपके पास ऐसा Chrome एक्सटेंशन है जो कॉन्टेंट स्क्रिप्ट और आपके एक्सटेंशन के बीच मैसेज भेजने के लिए इस्तेमाल किया जाता है, तो अपने एक्सटेंशन को टेस्ट करने और उसे अडैप्ट करने के तरीके के बारे में जानने के लिए आगे पढ़ें.

एक्सटेंशन मैसेज पोर्ट

एक्सटेंशन, मैसेज पास करने की सुविधा की मदद से कॉन्टेंट स्क्रिप्ट या दूसरे एक्सटेंशन से संपर्क करते हैं. runtime.sendMessage() और tabs.sendMessage() को कॉल करके, एक बार के अनुरोधों का इस्तेमाल करके मैसेज भेजे जा सकते हैं. इसके अलावा, फिर से इस्तेमाल किए जा सकने वाले मैसेज पोर्ट का इस्तेमाल करके भी मैसेज भेजे जा सकते हैं. जब तक पोर्ट चालू रहता है, तब तक कॉन्टेंट स्क्रिप्ट और एक्सटेंशन बैकग्राउंड स्क्रिप्ट, दोनों एक-दूसरे को मैसेज भेजने के लिए पोर्ट का फिर से इस्तेमाल कर सकती हैं.

ज़्यादा जानकारी के लिए, मैसेज पास करना लेख पढ़ें.

बैक/फ़ॉरवर्ड कैश मेमोरी

BFCache की ज़रूरी शर्तें पूरी करने वाले पेज से दूसरे पेज पर जाने पर, ब्राउज़र उस पेज को मेमोरी में सेव रखता है. हालांकि, वह पेज पूरी तरह से चालू नहीं रहता. अगर उपयोगकर्ता, कैश मेमोरी में सेव किए गए पेज पर इतिहास नेविगेशन (वापस या आगे) करता है, तो ब्राउज़र उस पेज को BFCache से वापस लाने की कोशिश करेगा. इससे नेविगेशन तेज़ी से होता है और उपयोगकर्ता को ब्राउज़ करने का बेहतर अनुभव मिलता है.

जब पेज BFCache में होता है, तब वह फ़्रीज़ हो जाता है. इस दौरान, JavaScript को चलाने की अनुमति नहीं होती. इसका मतलब है कि यह उन मैसेज को प्रोसेस नहीं कर सकता जो उसे मिलते हैं.

ज़्यादा जानकारी के लिए, बैक/फ़ॉरवर्ड कैश मेमोरी देखें.

एक्सटेंशन मैसेज पोर्ट का BFCache पर असर

कम शब्दों में, BFCache में किसी पेज पर मैसेज भेजने वाले एक्सटेंशन की वजह से, कैश मेमोरी खाली हो सकती है और परफ़ॉर्मेंस पर असर पड़ सकता है.

जब किसी ऐसे पेज को BFCache में सेव किया जाता है जिसमें एक्सटेंशन मैसेज पोर्ट खुला होता है, तो पोर्ट खुला रहता है. BFCache से पेज को वापस लाने के बाद भी, एक्सटेंशन सेवा वर्कर्स, कॉन्टेंट स्क्रिप्ट में मैसेज पोस्ट करने के लिए, मैसेज पोर्ट के पुराने रेफ़रंस का इस्तेमाल कर सकते हैं.

हालांकि, अगर पेज अब भी BFCache में है, तो एक्सटेंशन उस मैसेज पोर्ट से मैसेज पोस्ट करने की कोशिश करता है. ऐसा करने पर, मैसेज भेजा जाता है, लेकिन पूरी तरह से डिलीवर नहीं होता, क्योंकि हैंडलर फ़्रीज़ हो जाता है. एक्सटेंशन के लिए, इस स्थिति की वजह जानना और उसे ठीक करना मुश्किल है. इसकी वजह यह है कि मैसेज को सूची में जोड़ने और उसे छोड़ने, दोनों में अलग-अलग समस्याएं होती हैं.

मैसेज खोने से जुड़ी समस्याओं से बचने के लिए, Chrome के मौजूदा वर्शन में, होस्ट पेज को BFCache से हटा दिया जाता है और मैसेज को खारिज कर दिया जाता है. अगर उपयोगकर्ता उस पेज पर वापस जाता है, तो वह नए सिरे से लोड हो जाएगा. इससे, एक्सटेंशन को नया कनेक्शन सेट अप करने में मदद मिलेगी.

दूसरी ओर, इस तरीके को लागू करने से उन स्थितियों पर असर पड़ता है जहां BFCache लागू होता है. इससे परफ़ॉर्मेंस में होने वाली बढ़ोतरी पर भी असर पड़ता है. खास तौर पर, ब्रॉडकास्ट या हार्टबीट मैकेनिज्म वाले एक्सटेंशन पर, जो सभी कनेक्शन पर नियमित तौर पर मैसेज भेजते हैं. इसके अलावा, एक्सटेंशन जब कॉन्टेंट स्क्रिप्ट को मैसेज भेजता है, तब पेज हटाने की प्रोसेस शुरू होती है. इसलिए, वेब डेवलपर के पास अपने पेजों को हटाए जाने से रोकने का कोई तरीका नहीं होता.

पूरी परफ़ॉर्मेंस को बेहतर बनाने के लिए, हम मैसेज पोर्ट के नए वर्शन को लॉन्च करने जा रहे हैं.

नई सुविधा: जब पेज को BFCache में सेव किया जाता है, तो मैसेज चैनल बंद करना

Chrome 123 से, जब किसी ऐसे पेज को 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 पर जाएं.

क्या इसका असर मुझ पर पड़ेगा?

Chrome 123 में, नए वर्शन के काम करने का तरीका फ़्लैग के पीछे उपलब्ध होगा, ताकि आप अपने कोड की जांच कर सकें. ज़्यादा जानकारी के लिए, टाइमलाइन देखें. अपने एक्सटेंशन की जांच करने के लिए, यह तरीका अपनाएं. ध्यान दें कि यह सिर्फ़ एक आसान जांच करता है. हमारा सुझाव है कि आप Chrome को कुछ समय के लिए इस सुविधा के साथ चलाएं, क्योंकि यह अनुमान लगाना मुश्किल है कि एक्सटेंशन की कौनसी सुविधाओं से समस्याएं आ सकती हैं.

नए व्यवहार की जांच करना

Chrome 123 में एक्सपेरिमेंट को जबरदस्ती चालू करने के लिए:

  1. Chrome को इस फ़्लैग के साथ लॉन्च करें, जो नए व्यवहार को लागू करता है:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. किसी पेज पर जाएं और ज़रूरत पड़ने पर अपने एक्सटेंशन से इंटरैक्ट करें, ताकि कॉन्टेंट स्क्रिप्ट आपके एक्सटेंशन के लिए पोर्ट खोल सके.

  3. किसी दूसरे पेज पर जाएं और फिर वापस आएं. अब पेज वापस आ जाना चाहिए. हालांकि, कॉन्टेंट स्क्रिप्ट और सर्विस वर्कर के बीच मैसेज चैनल बंद हो जाना चाहिए.

  4. देखें कि एक्सटेंशन अब भी पहले की तरह काम कर रहा है या नहीं. अगर नहीं, तो आपको पिछले सेक्शन में बताए गए तरीके से मैन्युअल तरीके से फिर से कनेक्ट करना होगा.

पुराने व्यवहार का इस्तेमाल करके, आसान समस्याओं की पहचान करना

इस बदलाव से पहले, अगर bfcache में मौजूद किसी पेज से जुड़े पोर्ट पर मैसेज भेजने की कोशिश की जाती थी, तो Chrome आपको चेतावनी दिखाता था. इससे, बैकग्राउंड से पेज पर मैसेज भेजने से जुड़ी कुछ समस्याओं की पहचान की जा सकती है. हालांकि, इससे सभी समस्याओं की पहचान नहीं की जा सकती.

  1. पक्का करें कि आपके पास Chrome का कम से कम 123 वर्शन हो. आम तौर पर, Chrome Canary का इस्तेमाल करें. इसमें टेस्टिंग को आसान बनाने के लिए, एक और चेतावनी होती है.
  2. Chrome को इस फ़्लैग के साथ लॉन्च करें, जो पुराने वर्शन के तरीके को लागू करता है:

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. ऐसे पेज पर जाएं जो एक्सटेंशन के बिना BFCache के लिए ज़रूरी शर्तें पूरी करता हो. उदाहरण के लिए, https://example.com/ जैसी कोई आसान साइट. BFCache ट्यूटोरियल का पालन करके, पक्का करें कि इसे BFCache से वापस लाया गया है.

  4. एक्सटेंशन को इंस्टॉल और चालू करें. इसके बाद, BFCache की ज़रूरी शर्तों की फिर से जांच करें. मैन्युअल तरीके से किसी दूसरे पेज पर जाकर, कुछ समय इंतज़ार करें. यह समय इतना होना चाहिए कि आपका एक्सटेंशन, BFCached पेज पर मैसेज पोस्ट कर सके. इसके बाद, उस पेज पर वापस जाएं.

  5. अगर कैश मेमोरी खाली करने की वजह से, पेज को BFCache से लोड करने के बजाय, नए सिरे से लोड करना पड़ा और पेज को वापस लाने में समस्या होने की वजह "ExtensionSentMessageToCachedFrame" है, तो इस बदलाव का असर एक्सटेंशन पर पड़ सकता है.

    Chrome Canary 124.0.6315.0 और उसके बाद के वर्शन में, आपको पेज पर यह चेतावनी भी दिखेगी:

    जब किसी पेज को BFCache से वापस नहीं लाया जाता है, तब दिखाई जाने वाली चेतावनी.
    BFCache से पेज को वापस न लाने पर दिखने वाली चेतावनी.

जब यह पुष्टि हो जाए कि एक्सटेंशन, BFCache पेज पर मैसेज पोस्ट कर रहा है, तो एक्सपेरिमेंट को ज़बरदस्ती चालू करने के लिए, पिछले सेक्शन में दिया गया तरीका अपनाएं. साथ ही, देखें कि कोई लॉजिक तो नहीं टूट रहा है.

रिलीज़ की समयावधि

हम Chrome 123 से, धीरे-धीरे इस नए व्यवहार को बेहतर बनाने की योजना बना रहे हैं. यहां प्लान के बारे में पूरी जानकारी दी गई है:

तारीख प्लान किया गया माइलस्टोन
15 फ़रवरी Chrome 123 Canary और Dev में, नए वर्शन के काम करने के तरीके के लिए एक्सपेरिमेंट शुरू करें.
7 मार्च Chrome 123 के बीटा वर्शन में, नए वर्शन के लिए प्रयोग शुरू करें.
18 मार्च Chrome 123 के स्टेबल वर्शन में, चार प्रतिशत उपयोगकर्ताओं के लिए नई सुविधा रिलीज़ करें.
25 मार्च Chrome 123 के स्टेबल वर्शन में, 50 प्रतिशत उपयोगकर्ताओं के लिए नई सुविधा रिलीज़ करें.
2 अप्रैल एक्सपेरिमेंट खत्म हो जाता है और नया व्यवहार डिफ़ॉल्ट रूप से लागू हो जाता है.