2009-12-12 12 views
11

यदि मैं किसी भी updateready ईवेंट हैंडलर को लागू नहीं करता हूं और swapCache() पर कॉल नहीं करता, तो इसका मतलब यह है कि ब्राउज़र हमेशा एप्लिकेशन के पहले (सबसे पुराने) डाउनलोड किए गए संस्करण का उपयोग करेगा?क्या स्वैप कैश() HTML5 ऑफ़लाइन ऐप्स में आवश्यक है?

यदि नहीं, तो swapCache() विधि क्यों आवश्यक है?

उत्तर

3

स्वैप कैश विधि अनुप्रयोग के लिए एक तंत्र प्रदान करती है कि अपडेट कब लागू होते हैं। नियमित HTML ऐप्स में, यह निर्धारित करना मुश्किल हो सकता है कि क्लाइंट ब्राउज़र पर सही जेएस मौजूद है या नहीं। कैश अपडेट होने पर भी ब्राउज़र कार्यान्वयन अलग-अलग होते हैं, मैंने आईफोन को विशेष रूप से जिद्दी पाया। स्वैप कैश ने मुझे अपना ऐप अपडेट करने के तरीके में वापस रखा है यानी मैं पैच को स्वचालित रूप से लागू करना चुन सकता हूं या उपयोगकर्ता को आवेदन कब करना चुन सकता हूं।

+9

'अद्यतन पहले से' पर, मैं "अद्यतन अपडेट करें, अभी पुनरारंभ करने के लिए क्लिक करें" नोटिस दिखाता हूं और 'location.reload();' क्लिक पर क्लिक करता हूं। अगर वे क्लिक नहीं करते हैं, तो अगली बार लोड होने पर ऐप को अपडेट किया जाता है। मुझे समझ में नहीं आता कि मैं बिना स्वैप कैश() 'के साथ पुनः लोड किए बिना ऐप कैसे अपडेट कर सकता हूं। और * * पुनः लोड करने के साथ, मुझे वैसे भी 'swapCache()' की आवश्यकता नहीं है। मुझे अभी भी समझ में नहीं आता है जब इसकी आवश्यकता होती है। –

+1

इससे भी कमजोर हो जाता है: क्रोम में मुझे 'अपडेटेड' ईवेंट मिल रहा है और जब मैं हैंडलर के अंदर 'swapCache()' कहता हूं, तो क्रोम 'अनचाहे अमान्यस्टेट त्रुटि' को शिकायत करता है: 'एप्लिकेशन कैश' पर 'स्वैप कैश' निष्पादित करने में विफल: कोई नया एप्लिकेशन कैश नहीं है स्वैप करने के लिए। – Mati

2

मैं वही चीज़ सोच रहा था। मैं बस "window.applicationCache.update()" को कॉल करके एक सफल अद्यतन को ट्रिगर करने में सक्षम होना प्रतीत होता हूं। अगर मैनिफेस्ट फ़ाइल को संशोधित किया गया है, तो 'डाउनलोड' ईवेंट ट्रिगर होता है, फिर अंत में "अपडेट तैयार" होता है।

जब मैं इसे पुनः लोड करता हूं, ऐसा प्रतीत होता है। मुझे swapCache() को कॉल करने की आवश्यकता नहीं है। मेरे पास ऐप से कॉल करने का प्रावधान है, लेकिन अब तक अपडेट प्रक्रिया पर कोई प्रभाव नहीं पड़ा है।

कॉलिंग अपडेट() मूल रूप से एक रीलोड, AFAICS को समाप्त करता है।

7

मेरे पास एक बहुत बड़ा कैश (> 100 एमबी) वाला ऐप है। इसमें कैश को स्वैप करने में विशेष रूप से लंबा समय लगता है (और यह होने पर ब्राउज़र को बहुत अधिक ताले लगा देता है)। इसलिए मैं एक संदेश दिखाता हूं कि ऐप अपडेट हो रहा है (कृपया प्रतीक्षा करें ...), फिर swapCache() पर कॉल करें, फिर पूरा होने पर संकेत मिलने पर एक नया संदेश प्रदर्शित करें।

यह सुनिश्चित नहीं है कि यह आपके प्रश्न का उत्तर देता है (क्यों यह आवश्यक है कि आवश्यक), लेकिन मुझे लगता है कि यह कम से कम swapCache() के लिए वैध उपयोग केस प्रदान करता है।

+0

यह बहुत अच्छा है। यदि आप इसे कॉल नहीं करते हैं तो क्या होगा, क्या ब्राउज़र अगले पृष्ठ लोड पर लंबे समय तक फंस जाएगा? और, आप इसे बुलाए जाने के बाद क्या होता है, अगर आप कुछ नई फाइलें शामिल करते हैं ... क्या ऐसा हो सकता है कि फाइलों में से आधे (पहले से लोड हो चुके हैं) पुराने संस्करण से आते हैं, दूसरों को एक नए से? –

+0

मुझे नहीं लगता कि आप कभी ऐसे मामले में भाग लेंगे जहां आपके पास कैश फाइलों का एक मिश्रित बैग है। 'swapCache()' केवल तभी चलाएगा जब 'status =' updateready '' (अन्यथा यह कोई त्रुटि फेंकता है या मुझे विश्वास नहीं है)। यदि आपने नई फाइलें जोड़ दी हैं, तो उन्हें सामान्य तंत्र के माध्यम से डाउनलोड किया जाएगा और एक बार पूरा हो जाएगा, एक नया 'अपडेटेड' घटना शुरू करें। मैं ऐसे परिदृश्य के बारे में नहीं सोच सकता जिसमें आप विभिन्न कैश संस्करणों से फ़ाइलों को जोड़ सकते हैं। यकीन नहीं है कि अगर मैं इसे कॉल नहीं करता तो क्या होगा। मुझे लगता है कि आवेदन कभी कैश नहीं किया जाएगा। हो सकता है कि मैं इस सप्ताह के अंत में परीक्षण करूंगा और आपको वापस ले जाऊंगा। – ggutenberg

+3

परीक्षण किया गया। यदि 'swapCache() 'नहीं कहा जाता है, तो एप्लिकेशन तुरंत अपडेट नहीं होता है, लेकिन अगली बार पृष्ठ रीफ्रेश होने पर अपडेट किया जाता है।इसलिए मूल रूप से आप उपयोगकर्ता को अभी अपडेट करने या बाद में अपडेट करने का विकल्प दे सकते हैं। अगर वे कुछ करने के बीच में हैं, तो यह एक अच्छा विकल्प है। – ggutenberg

0

swapCache नए सेट में कैश मैनिफेस्ट (जब चल रहा वेबपैप लोड किया गया था) में सूचीबद्ध संसाधनों के पिछले सेट से स्विच करेगा। आप updateready के जवाब में ऐसा कर रहे हैं, जो संकेत देता है कि एक नया मैनिफेस्ट लोड हो गया है।

यह व्यक्तिगत संसाधनों को लोड करने में भ्रमित नहीं होना चाहिए, जिसके लिए सामान्य ब्राउज़र कैशिंग नीतियां अभी भी लागू होती हैं। दूसरे शब्दों में आप संसाधनों का सेट स्वैप करेंगे, लेकिन अलग-अलग संसाधनों को अपने कैश प्रबंधन की आवश्यकता होती है ताकि यह सुनिश्चित किया जा सके कि उन्हें आपकी आवश्यकता होने पर पुनः लोड किया जा सके।

मैंने अभी तक यह कोशिश नहीं की है, लेकिन ऐसा लगता है कि कोड को "अद्यतन नियंत्रक" जावास्क्रिप्ट फ़ाइल के रूप में संरचित करने का सुझाव दिया जाएगा जो अद्यतन प्रक्रिया को संभालता है, और ज्ञात प्रविष्टि बिंदुओं के साथ एक संस्करण वाले फ़ाइल नाम (या यूआरएल) के साथ जावास्क्रिप्ट स्रोत ।

12

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

यदि आप अपने पृष्ठ में संसाधनों की कोई गतिशील लोडिंग नहीं करते हैं, तो स्वैपैच का कोई प्रभाव नहीं पड़ता है।

विशेष रूप से, यदि आप अपडेटेड इवेंट हैंडलर कॉलिंग में पेज को फिर से लोड करते हैं, तो swapcache पहले पृष्ठ पर पुनः लोड करने से कोई प्रभाव नहीं पड़ता है, वैसे भी इसे नए कैश से प्राप्त होगा।

4

चलो 2 अलग-अलग परिदृश्यों की कल्पना करें।

  1. नई सामग्री उपलब्ध होने पर आप location.reload() पर कॉल करते हैं। पृष्ठ अपनी सभी नई सामग्री का उपयोग करके पुनः लोड होगा। इस मामले में applicationCache.swapCache() की आवश्यकता नहीं है।

  2. आपका उपयोगकर्ता बिना किसी रीलोड के आपके पृष्ठ से बातचीत करना जारी रखता है। यह बातचीत एक परिसंपत्ति को गतिशील रूप से लोड करने का कारण बनती है। तर्क के लिए, आइए कल्पना करें कि यह रोलओवर छवि है, और आइए कल्पना करें कि आपने अभी इस रोलओवर छवि को अपडेट किया है। applicationCache.swapCache() के बिना, आपका उपयोगकर्ता पुरानी रोलओवर छवि को देखना जारी रखेगा। applicationCache.swapCache() के बाद, वह नई रोलओवर छवि देखेंगे।

तो applicationCache.swapCache()एक रीलोड बिना कहते हैं: "जैसे ही पेज उनके लिए पूछता है के रूप में जिस तरह से यह जब यह लोड किया गया था था देख पेज रखें, लेकिन अब किसी भी नए संपत्ति का उपयोग,"।

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