बग्गी सर्विस वर्कर को हटाया जा रहा है

कभी-कभी कोई बग्गी सर्विस वर्कर काम पर लग जाता है, समस्याएं आती हैं. उदाहरण के लिए, सर्विस वर्कर को रजिस्ट्रेशन के समय पार्स किया जा सकता है और इंस्टॉलेशन को पूरा किया जा सकता है. हालांकि, fetch इवेंट में गड़बड़ी वाले कोड की वजह से, हो सकता है कि वह अनुरोधों का जवाब न दे, जिससे एक खाली पेज खुलता है. एक और संभावना यह है कि पेज मार्कअप को बहुत ज़्यादा कैश मेमोरी में सेव किया जाता है, और सर्विस वर्कर, सिर्फ़ अगली विज़िट के लिए Cache इंस्टेंस से पुरानी जानकारी वाले मार्कअप रिस्पॉन्स दिखाता है.

सर्विस वर्कर कई तरह से नुकसान पहुंचा सकता है, प्रोडक्शन वेबसाइट पर काम करना बहुत भयानक समस्या है. इसके बावजूद, सभी चीज़ें गायब नहीं होती हैं. स्थिति को ठीक करने और ट्रैक पर वापस आने के तरीके हैं.

नो-ऑप सर्विस वर्कर को डिप्लॉय करें

आम तौर पर, किसी बगी सर्विस वर्कर से निपटने के लिए, no-op सर्विस वर्कर, जो fetch इवेंट हैंडलर के बिना तुरंत इंस्टॉल और चालू हो जाता है:

// sw.js

self.addEventListener('install', () => {
  // Skip over the "waiting" lifecycle state, to ensure that our
  // new service worker is activated immediately, even if there's
  // another tab open controlled by our older service worker code.
  self.skipWaiting();
});

self.addEventListener('activate', () => {
  // Optional: Get a list of all the current open windows/tabs under
  // our service worker's control, and force them to reload.
  // This can "unbreak" any open windows/tabs as soon as the new
  // service worker activates, rather than users having to manually reload.
  self.clients.matchAll({
    type: 'window'
  }).then(windowClients => {
    windowClients.forEach((windowClient) => {
      windowClient.navigate(windowClient.url);
    });
  });
});

यह सर्विस वर्कर, कॉल करने पर तुरंत इंस्टॉल और चालू हो जाएगा install इवेंट में self.skipWaiting(). इसके अलावा, activate इवेंट में अलग से कोड को डिप्लॉय किया जा सकता है, ताकि WindowClient की मदद से खुले हुए किसी अन्य टैब को सर्विस वर्कर के ज़रिए अपने-आप फिर से लोड किया जा सके.

यह बहुत ज़रूरी है कि किसी नो-ऑप सर्विस वर्कर में कोई fetch इवेंट हैंडलर न हो. जब कोई सर्विस वर्कर अनुरोधों को हैंडल नहीं करता है, वे अनुरोध इस तरह ब्राउज़र से होकर गुज़रते हैं जैसे कोई सर्विस वर्कर मौजूद न हो. नो-ऑप सर्विस वर्कर के डिप्लॉय होने के बाद, गड़बड़ी ठीक करने वाले सर्विस वर्कर को ठीक किया जा सकता है. साथ ही, इसे बाद में अपडेट के तौर पर डिप्लॉय किया जा सकता है.

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

उठाए जाने वाले दूसरे कदम

किसी गड़बड़ी को ठीक करने के लिए नो-ऑप सर्विस वर्कर को डिप्लॉय करना काफ़ी होना चाहिए, हालांकि, ज़रूरत पड़ने पर कुछ और कदम उठाए जा सकते हैं.

अगर आपको पुराने सर्विस वर्कर का यूआरएल नहीं पता है, तो क्या करना चाहिए?

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

अच्छी बात यह है कि सर्विस वर्कर स्क्रिप्ट के लिए अनुरोध के साथ एक काम का एचटीटीपी अनुरोध हेडर भेजा जाता है: Service-Worker. वेब सर्वर पर, इस हेडर की जांच करें और इसके बजाय नो-ऑप सर्विस वर्कर को सेवा देने के अनुरोध को बीच में रोकें. वेब सर्वर और बैकएंड स्टैक की ज़रूरत के हिसाब से यह काम किया जा सकता है. इसलिए, इस काम को करने का तरीका जानने के लिए संबंधित भाषा का दस्तावेज़ देखें.

आने वाले समय में सर्विस वर्कर के डिप्लॉयमेंट के लिए, उन ऐसेट के नामों का इस्तेमाल करें जिन्हें वर्शन नहीं किया गया है. जैसे, sw.js. इससे, बाद में चीज़ें थोड़ी कम मुश्किल हो जाएंगी.

Clear-Site-Data हेडर सेट करें

कुछ ब्राउज़र, ऑरिजिन के लिए सभी सर्विस वर्कर का रजिस्ट्रेशन रद्द कर देंगे, अगर 'storage' वैल्यू के साथ Clear-Site-Data रिस्पॉन्स हेडर सेट किया गया. हालांकि, इस तरीके से आपको कुछ चीज़ों के बारे में जानकारी होनी चाहिए:

  • ध्यान रखें कि ऐसा करने से, संबंधित ऑरिजिन के लिए पूरा स्टोरेज खाली हो जाएगा. इसमें localStorage, IndexedDB, sessionStorage, और अन्य स्टोरेज शामिल है (इसमें ऑरिजिन के लिए एचटीटीपी कैश शामिल नहीं है).
  • यह हेडर सभी ब्राउज़र पर काम नहीं करता.

चूंकि इस हेडर के लिए समर्थन उपलब्ध नहीं है, इसलिए समस्या को ठीक करने के लिए अकेले इस पर भरोसा नहीं किया जा सकता. इसलिए, नो-ऑप सर्विस वर्कर को डिप्लॉय करने के अलावा, Clear-Site-Data को अपनाए जाने वाले उपाय के तौर पर देखना बेहतर होगा.

नुकसान स्थायी नहीं होता है

यह किसी गड़बड़ी की वजह से उपयोगकर्ता के अनुभव को खराब कर सकता है. खास तौर पर, बड़ी और जानी-मानी वेबसाइटों के लिए. हालांकि, यह नुकसान कुछ समय के लिए ही होता है और इसे पहले जैसा भी किया जा सकता है!

अगर स्थिति को ठीक करने के लिए नो-ऑप सर्विस वर्कर की ज़रूरत पड़ती है, गलती को ठीक करने में समय लगाएं. आने वाले समय में, यह पक्का करें कि सर्विस वर्कर सिर्फ़ उन अनुरोधों पर कार्रवाई कर रहा हो जिनकी उसे उम्मीद है. स्टेजिंग में समय-समय पर टेस्ट करें और अपडेट तभी डिप्लॉय करें, जब लोग भरोसेमंद हों.