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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

नई सुविधा: पेज को BFcache में सेव किए जाने पर मैसेज चैनल को बंद करना

Chrome 123 की शुरुआत में, जब ओपन एक्सटेंशन मैसेज पोर्ट वाला कोई पेज BFकैश में सेव होता है, तो कॉन्टेंट स्क्रिप्ट साइड से उस पर मौजूद मैसेज चैनल बंद हो जाता है. इस वजह से, सभी मैसेज पोर्ट बंद हो जाएंगे और एक्सटेंशन को एक onDisconnect इवेंट मिलेगा.

चैनल बंद है. इसलिए, BF cache में मौजूद होने पर पेज पर कोई मैसेज नहीं भेजा जाएगा. इसलिए, एक्सटेंशन की वजह से पेज को नहीं हटाया जाएगा.

पेज को BF cache से वापस लाने के बाद भी, बंद किए गए मैसेज चैनल को फिर से नहीं खोला जाएगा. एक्सटेंशन लेखकों को पेज के लाइफ़साइकल इवेंट को सुनने का सुझाव दिया जाता है. साथ ही, पेज को 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 चलाने के लिए बढ़ावा देते हैं, क्योंकि यह अनुमान लगाना मुश्किल हो सकता है कि एक्सटेंशन में कौन-कौनसी सुविधाएं समस्या पैदा कर सकती हैं.

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

    --disable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  3. उस पेज पर जाएं जो एक्सटेंशन न चलने पर भी BFकैश की ज़रूरी शर्तें पूरी करता हो. उदाहरण के लिए, https://example.com/ जैसी कोई सामान्य साइट. BFcache ट्यूटोरियल देखें और पक्का करें कि इसे BFकैश से वापस लाया गया है.

  4. एक्सटेंशन को इंस्टॉल और चालू करें. इसके बाद, BFcache की ज़रूरी शर्तें फिर से देखें. मैन्युअल तरीके से पेज पर नेविगेट किया जा सकता है. थोड़ा इंतज़ार करें, ताकि एक्सटेंशन को BFcached पेज पर मैसेज पोस्ट करने के लिए, वापस नेविगेट किया जा सके.

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

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

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

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

  1. नीचे दिए गए फ़्लैग के साथ Chrome को लॉन्च करें:

    --enable-features=DisconnectExtensionMessagePortWhenPageEntersBFCache
    
  2. उस पेज पर जाएं जिसे "ExtensionSentMessageToCachedFrame" की वजह से BFcache से वापस नहीं लाया गया.

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

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

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

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

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