2015-11-29 13 views
26

मैं अपने कंप्यूटर में सेवा कार्यकर्ता एपीआई के साथ खेल रहा हूं, इसलिए मैं समझ सकता हूं कि मैं अपने असली दुनिया ऐप्स में इससे कैसे लाभ उठा सकता हूं।मैं एक छोटी गाड़ी सेवा कार्यकर्ता को कैसे हटा सकता हूं, या "मारना स्विच" लागू कर सकता हूं?

मैं एक अजीब परिस्थिति में आया जहां मैंने एक सेवा कार्यकर्ता पंजीकृत किया जो ईवेंट लाने में हस्तक्षेप करता है ताकि यह उत्पत्ति के लिए अनुरोध भेजने से पहले अनुरोधित सामग्री के लिए अपने कैश की जांच कर सके। समस्या यह है कि इस कोड में एक त्रुटि है जो फ़ंक्शन को अनुरोध करने से रोकती है, इसलिए मेरा पृष्ठ खाली छोड़ दिया गया है; कुछ नहीं हुआ। सेवा कार्यकर्ता पंजीकृत होने के बाद, दूसरी बार जब मैं पृष्ठ लोड करता हूं तो यह पहला अनुरोध (जो HTML को लोड करता है) को रोकता है। क्योंकि मेरे पास यह बग है, यह घटना विफल हो जाती है, यह कभी भी HTML का अनुरोध नहीं करती है और मैं इसे एक खाली पृष्ठ देखता हूं।

इस स्थिति में, खराब सेवा कार्यकर्ता स्क्रिप्ट को हटाने का एकमात्र तरीका chrome://serviceworker-internals/ कंसोल के माध्यम से है। यदि यह त्रुटि किसी लाइव वेबसाइट पर जाती है, तो इसे हल करने का सबसे अच्छा तरीका कौन सा है?

धन्यवाद!

उत्तर

41

मैं यहां कुछ अन्य उत्तरों पर विस्तार करना चाहता हूं, और यह देखने के लिए कि मैं सेवा कार्यकर्ता को उत्पादन में लाने के दौरान किस रणनीति का उपयोग कर सकता हूं, यह सुनिश्चित करने के लिए कि मैं कोई आवश्यक परिवर्तन कर सकता हूं " उन परिवर्तनों में आपके द्वारा उत्पादन में खोजे जाने वाले किसी भी मामूली बग को ठीक करना शामिल हो सकता है, या यह हो सकता है (लेकिन उम्मीद है कि) में एक दुर्बल बग-तथाकथित "मार स्विच" के कारण सेवा कार्यकर्ता को बेअसर करना शामिल हो सकता है।

इस उत्तर के प्रयोजनों के लिए, मान लीजिए कि आप

navigator.serviceWorker.register('service-worker.js'); 
अपने पृष्ठों पर

फोन, आपकी सेवा कार्यकर्ता जावास्क्रिप्ट संसाधन service-worker.js है, जिसका अर्थ ग्रहण करते हैं।

मेरा पहला सलाह यह है कि मानक HTTP कैशिंग आपके सेवा कार्यकर्ता की जावास्क्रिप्ट को अद्यतित तरीके से कैसे प्रभावित करती है, इस पर पढ़ना है। इसके बारे में एक गलत मात्रा में गलत जानकारी है, और मुझे उम्मीद है कि this Stack Overflow answer इसमें से कुछ को साफ़ करता है, और बताता है कि अपडेट के लिए सेवा श्रमिकों की जांच कैसे की जाती है। उन लोगों के लिए सारांशित करने के लिए जो उस अन्य उत्तर पर क्लिक नहीं करते हैं, आपका ब्राउज़र HTTP सेवा कैश निर्देशों का सम्मान करेगा, अधिकतम 1 दिन तक, यह निर्धारित करते समय कि आपके सेवा कार्यकर्ता जावास्क्रिप्ट की ताजा प्रति का अनुरोध करना है या कैश की गई प्रतिलिपि का उपयोग करना है या नहीं । नतीजतन, यदि आप एक बग को ठीक करने के लिए नई सेवा कार्यकर्ता जावास्क्रिप्ट को त्वरित रूप से रोल करने के लिए लचीलापन चाहते हैं, तो HTTP कैशिंग निर्देशों के साथ service-worker.js पर सेवा करें, इसे कम या 0 अधिकतम आयु दें।

एक बार आपके service-worker.js उचित HTTP कैशिंग निर्देशों के साथ परोसा जाता है, तो प्रश्न आपके service-worker.js कोड में प्रारंभिक समस्या को हल करने के तरीके के बारे में बताता है। यदि यह एक छोटा बग फिक्स है, तो आप स्पष्ट रूप से केवल बदलाव कर सकते हैं और अपने होस्टिंग वातावरण में अपने service-worker.js को फिर से तैनात कर सकते हैं। यदि कोई स्पष्ट बग फिक्स नहीं है, और आप अपने उपयोगकर्ताओं को एक समाधान करने के लिए समय निकालते समय बग्गी सेवा कार्यकर्ता कोड नहीं छोड़ना चाहते हैं, यह एक अच्छा विचार है, no-opservice-worker.js आसान, जैसे निम्नलिखित:

// A simple, no-op service worker that takes immediate control. 

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); 
    }); 
    }); 
}); 
*/ 

अपने सभी कोई सेशन service-worker.js शामिल करने की जरूरत है होना चाहिए कि। चूंकि कोई fetch हैंडलर पंजीकृत नहीं है, इसलिए नियंत्रित पृष्ठों से सभी नेविगेशन और संसाधन अनुरोध सीधे नेटवर्क के खिलाफ जा रहे हैं, प्रभावी रूप से आपको वही व्यवहार दे रहे हैं जो बिना किसी सेवा कर्मचारी थे।

आगे बढ़ना संभव है, और Cache Storage API, या explicitly unregister the service worker का उपयोग करके संग्रहीत सब कुछ जबरन हटा दें। सबसे आम मामलों के लिए, शायद यह अधिक हो जाएगा, और उपर्युक्त अनुशंसाओं के बाद आपको ऐसे राज्य में लाने के लिए पर्याप्त होना चाहिए जहां आपके वर्तमान उपयोगकर्ताओं को अपेक्षित व्यवहार मिल जाए, और आप अपनी बग तय करने के बाद अपडेट को पुन: नियोजित करने के लिए तैयार हों । नो-ऑप सेवा कार्यकर्ता शुरू करने के साथ कुछ डिग्री ओवरहेड भी शामिल है, इसलिए यदि आप सार्थक सेवा कार्यकर्ता कोड को फिर से तैनात करने की कोई योजना नहीं रखते हैं तो आप unregistering the service worker के मार्ग पर जा सकते हैं।

यदि आप पहले से ही ऐसी परिस्थिति में हैं जिसमें आप service-worker.js की सेवा कर रहे हैं, तो HTTP कैशिंग निर्देशों के साथ यह आपके जीवनकाल की प्रतीक्षा कर रहा है जो आपके उपयोगकर्ताओं की प्रतीक्षा कर सकता है, ध्यान रखें कि डेस्कटॉप ब्राउज़र पर Shift + Reload पृष्ठ को मजबूर करेगा सेवा कार्यकर्ता नियंत्रण के बाहर पुनः लोड करें। प्रत्येक उपयोगकर्ता को यह नहीं पता होगा कि यह कैसे करें, और मोबाइल उपकरणों पर यह संभव नहीं है। इसलिए एक व्यवहार्य रोलबैक योजना के रूप में Shift + Reload पर भरोसा न करें।

6

यह वास्तव में एक बुरा स्थिति है, उम्मीद है कि उत्पादन में आपके साथ ऐसा नहीं होगा।

उस मामले में, यदि आप अलग अलग ब्राउज़रों के डेवलपर उपकरण के माध्यम से जाना नहीं चाहते हैं, chrome://serviceworker-internals/ फ़ायरफ़ॉक्स में आधारित ब्राउज़र, या about:serviceworkers (about:debugging#workers भविष्य में) झपकी के लिए, वहाँ दो चीजें हैं जो करने के लिए आ रहे हैं मेरे दिमाग:

  1. सेवा कार्यकर्ता अद्यतन तंत्र का उपयोग करें। आपका उपयोगकर्ता एजेंट जांच करेगा कि पंजीकृत कर्मचारी पर कोई बदलाव है या नहीं, इसे फिर से लाएगा और activate चरण फिर से जाएगा। तो संभावित रूप से आप सेवा कार्यकर्ता स्क्रिप्ट को बदल सकते हैं, किसी भी अजीब परिस्थिति को ठीक कर सकते हैं (कैश, आदि को शुद्ध कर सकते हैं) और काम करना जारी रख सकते हैं। एकमात्र नकारात्मक पक्ष आपको तब तक इंतजार करना होगा जब तक कि ब्राउज़र उस कार्यकर्ता को अद्यतन न करे जो 1 दिन हो सकता है।
  2. किसी भी प्रकार के अपने कार्यकर्ता को स्विच स्विच करें। एक विशेष यूआरएल जहां उपयोगकर्ता को ले जाना है कि अपने कैश की स्थिति बहाल कर सकते हैं इंगित कर सकते हैं, आदि

मैं आपके ब्राउज़र डेटा को साफ़ करने कार्यकर्ता निकाल देंगे अगर यकीन नहीं आ रहा है, तो यह है कि एक और विकल्प हो सकता है।

+1

आपके उत्तर के लिए धन्यवाद। विकल्प 1 लाइव वेबसाइट के लिए सस्ती नहीं है। मैं विकल्प 2 पर एक नज़र डालेगा, लेकिन मुझे पूरा भरोसा नहीं है कि अगर आप अपनी सेवा कार्यकर्ता को अपनी वेबसाइट शीर्ष स्तर ("/") – PaquitoSoft

2

लाइव परिस्थितियों के लिए आपको बाइट-लेवल पर सेवा कार्यकर्ता को बदलने की आवश्यकता है (उदाहरण के लिए पहली पंक्ति पर एक टिप्पणी डालें) और it will be updated in the next 24 hours बटन पर क्लिक करके आप इसे Chrome: // serviceworker-internals/क्रोम में क्रोम में अनुकरण कर सकते हैं।

यह उन स्थितियों के लिए भी काम करना चाहिए जब सेवा कार्यकर्ता को अद्यतन एल्गोरिदम के चरण 9 के रूप में कैश किया गया है, सेवा कार्यकर्ता को बाईपास करने के लिए ध्वज सेट करें।

3

मैंने इसका परीक्षण नहीं किया है, लेकिन सेवावर्कर पंजीकरण ऑब्जेक्ट पर unregister() और update() विधि है। आप इसे navigator.serviceWorker से प्राप्त कर सकते हैं।

navigator.serviceWorker.getRegistration('/').then(function(registration) { 
    registration.update(); 
}); 

अपडेट तत्काल जांचें कि क्या कोई नया सेवा कर्मचारी है और यदि ऐसा है तो इसे इंस्टॉल करें। यह 24 घंटे प्रतीक्षा अवधि को छोड़ देता है और हर बार इस जावास्क्रिप्ट का सामना करने के दौरान serviceworker.js डाउनलोड करेगा।

2

आप जावास्क्रिप्ट का उपयोग कर सेवा कार्यकर्ता को 'अनधिकृत' कर सकते हैं। यहां एक उदाहरण है:

if ('serviceWorker' in navigator) { 
    navigator.serviceWorker.getRegistrations().then(function (registrations) { 
    //returns installed service workers 
    if (registrations.length) { 
     for(let registration of registrations) { 
     registration.unregister(); 
     } 
    } 
    }); 
} 
+0

पर पंजीकृत करते हैं तो यह काम करेगा। इसे'registe' विधि से पहले रखा जाना चाहिए, इसलिए कि यह रजिस्टर करने से पहले सभी को अनधिकृत कर देगा या इसे कहीं भी चलाया जा सकता है? –

संबंधित मुद्दे