मैं क्या हासिल करने की कोशिश कर रहा हूँ:कैसे: ServiceWorker जांच करता है, तो अद्यतन करने के लिए तैयार
लोडर/स्पिनर
अगर साथ पेज प्रस्तुत करना
service-worker.js
पंजीकृत है और सक्रिय है, तो अद्यतन के लिए जाँच- यदि कोई अपडेट नहीं है, तो लोडर
- हटाएंऔर नया संस्करण स्थापित किया है, तो रजिस्टर
service-worker.js
- जब
updatefound
, नया अर्थ स्थापित किया गया था, लोडर
- जब
मैं के लिए
sw-precache
मॉड्यूल का उपयोग कर रहा हटाने पेज
service-worker.js
उत्पन्न करने और पंजीकरण कोड के बाद: window.addEventListener('load', function() {
// show loader
addLoader();
navigator.serviceWorker.register('service-worker.js')
.then(function(swRegistration) {
// react to changes in `service-worker.js`
swRegistration.onupdatefound = function() {
var installingWorker = swRegistration.installing;
installingWorker.onstatechange = function() {
if(installingWorker.state === 'installed' && navigator.serviceWorker.controller){
// updated content installed
window.location.reload();
} else if (installingWorker.state === 'installed'){
// new sw registered and content cached
removeLoader();
}
};
}
if(swRegistration.active){
// here I know that `service-worker.js` was already installed
// but not sure it there are changes
// If there are no changes it is the last thing I can check
// AFAIK no events are fired afterwards
}
})
.catch(function(e) {
console.error('Error during service worker registration:', e);
});
});
spec पढ़ने के बाद यह स्पष्ट है कि updatenotfound
जैसे कुछ के लिए कोई हैंडलर नहीं हैं। ऐसा लगता है कि serviceWorker.register
जांचता है कि service-worker.js
get-newest-worker-algorithm चलाकर आंतरिक रूप से बदल गया है, लेकिन मैं सार्वजनिक एपीआई के माध्यम से सामने आने वाले समान तरीकों को नहीं देख सकता।
मुझे लगता है कि मेरी विकल्प हैं: सेवा कार्यकर्ता पंजीकरण के बाद कुछ सेकंड के लिए
- इंतजार हो जाता है सक्रिय देखने के लिए अगर
onupdatefound
service-worker.js
कोड से -
आग कस्टम घटनाओं निकाल दिया जाता है, तो कैश अपडेट नहीं किए जाने
कोई अन्य सुझाव?
संपादित करें:
मैं कुछ कोड है जो दप पंजीकरण और दप ग्राहक के बीच
postMessage()
का उपयोग करके इस समस्या को हल करती है के साथ आया है (के रूप में @pate सुझाव)
डेमो एसडब्ल्यू क्लाइंट और एसडब्ल्यू पंजीकरण के बीच postMessage
के माध्यम से चेक प्राप्त करने का प्रयास करता है, लेकिन विफल रहता है क्योंकि एसडब्ल्यू कोड पहले ही कैश किया गया है DEMO
संपादित करें:
तो अब से ऐसा लगता है कि मैं लागू नहीं कर सकते जो मैं चाहता है क्योंकि:
- जब सेवा कार्यकर्ता सक्रिय है आप दप में कुछ कोड का मूल्यांकन करके अद्यतनों की जाँच नहीं कर सकते हैं - यह अभी भी एक ही कैश किए गए एसडब्ल्यू है,
- में आपको कोई बदलाव नहीं है, आपको
onupdatefound
के लिए प्रतीक्षा करने की आवश्यकता है, एसडब्ल्यू - में परिवर्तनों की अधिसूचना कुछ भी नहीं है पुराने दप कीआता
onupdatefound
- अगर कोई परिवर्तन होता है से पहले, कुछ भी आग के बाद
activation
- दप पंजीकरण
update()
अपरिपक्व है, बदलता रहता है,Starting with Chrome 46, update() returns a promise that resolves with 'undefined' if the operation completed successfully or there was no update
- स्थगित करने के लिए दृश्य प्रतिपादन करने से इनकी है के रूप में वहाँ कोई स्पष्ट उत्तर नहीं है समय-समाप्ति सेट इसे कब तक सेट किया जाना चाहिए, यह एसडब्ल्यू आकार पर भी निर्भर करता है, साथ ही
यह देखा जैसे कि यह एक मुद्दे को हल करना चाहिए, लेकिन इस घटना के केवल कार्यकर्ता परिवर्तन करता है, तो निकाल दिया जाता है। https://w3c.github.io/ServiceWorker/#service-worker-global-scope-install-event –