2009-12-12 37 views

回答

3

SwapCache方法爲應用程序提供了一種控制應用更新時機的機制。在普通的HTML應用程序中,可能很難確定客戶端瀏覽器中是否存在正確的JS。 另外瀏覽器的實現方式也不盡相同,當緩存更新時,我發現iPhone特別固執。 swapCache讓我重新控制如何更新我的應用程序,即我可以選擇自動應用修補程序或讓用戶選擇何時應用等。

+9

在'updateready'上,我顯示「Update available,點擊立即重新啓動」通知,並執行'location.reload();'點擊。如果他們沒有點擊,則下次加載時應用程序會自行更新。 我不明白我怎麼可以更新應用程序而無需重新加載,'swapCache()'。 *用*重載,反正我不需要'swapCache()'。 我還是不明白什麼時候需要它。 – 2010-01-16 11:09:26

+1

得到的甚至比這更奇怪:在Chrome Im獲取'updateready'事件並且當我在內部處理程序中調用'swapCache()'時,Chrome會抱怨'Uncaught InvalidStateError:無法執行'ApplicationCache'上的'swapCache':沒有新的應用程序緩存交換。「 – Mati 2014-11-20 11:39:46

2

我想知道同樣的事情。我似乎能夠通過調用「window.applicationCache.update()」來觸發成功的更新。如果清單文件已被修改,則會觸發「下載」事件,然後最終「更新就緒」。

當我重新加載它時,它似乎已被應用。我似乎不需要調用swapCache()。我有規定從應用程序調用它,但到目前爲止還沒有注意到對更新過程有任何影響。

調用update()基本上消除了一次重載,AFAICS。

7

我有一個相當大的緩存(> 100MB)的應用程序。這需要特別長的時間來交換緩存(並且在發生這種情況時幾乎鎖定了瀏覽器)。因此,我會顯示一條消息,指示該應用正在更新(請稍候...),然後撥打swapCache(),然後在完成時顯示一條新消息。

不知道這是否回答您的問題(至於爲什麼它必然需要),但我認爲它至少提供了swapCache()的有效用例。

+0

這很酷。如果你沒有調用它,會發生什麼情況,瀏覽器是否會在下一頁加載時被卡住很長時間?而且,如果包含一些新文件,在調用它之後會發生什麼情況......是否會發生一半文件(已加載的文件)來自舊版本,其他文件來自新版本? – 2010-09-17 11:46:32

+0

我不認爲你會遇到一個混合了緩存文件的情況。 ''swapCache()'只會在'status ='updateready''時運行(否則它會拋出一個錯誤或者只是不會做我認爲的任何事情)。如果您添加了新文件,它們將通過正常機制下載,一旦完成,就會發起一個新的「更新準備」事件。我無法想象可以將不同緩存版本中的文件組合起來的場景。不知道如果我不打電話會發生什麼。我認爲應用程序永遠不會被緩存。也許我會在本週末測試一下並回復你。 – ggutenberg 2010-09-17 13:13:34

+3

經過測試。如果未調用'swapCache()',則應用程序不會立即更新,而會在下次刷新頁面時更新。所以基本上你可以給用戶一個選擇來更新或稍後更新。如果他們正在做某件事情,那麼這是一個很好的選擇。 – ggutenberg 2010-09-18 19:28:18

0

swapCache將從緩存清單中列出的上一組資源(當運行webapp加載時)切換到新組。畢竟這是爲了響應updateready這樣做,這表示新的清單已被加載。

這不會與加載單個資源相混淆,通常的瀏覽器緩存策略仍然適用。換句話說,您將交換資源集合,但個別資源需要自己的緩存管理以確保在需要時重新加載它們。

我還沒有嘗試過,但它似乎建議將代碼構建爲處理更新過程的「更新控制器」JavaScript文件,以及具有已知入口點的版本化文件名(或URL)的JavaScript源代碼。

12

Swapcache確保從新緩存中獲取「後續」對緩存資源的調用。 swapcache之後的後續含義。 要在動作中看到此操作,請嘗試在updateready事件中調用 swapcache調用後動態設置img的src屬性(以便瀏覽器在特定的 時間加載它)。確保此圖像尚未加載到頁面中的其他位置,因爲 會扭曲此測試。 現在更改圖像並更改清單文件(強制重新加載緩存的文件)。 在您的瀏覽器中重新加載頁面。 您現在應該在您的渲染頁面中看到圖像的新版本。 現在註釋掉對swapcache的調用。 對清單文件進行更改並重新加載頁面,從而重新加載所有資源。 再次刷新頁面(以確保您擁有新緩存中的版本)。 現在再次更改圖像並更改清單。 再次重新加載頁面:現在您看到舊版本的圖像。 在最後一種情況下,瀏覽器完成將新版本加載到緩存中,但由於未調用 swapcache,因此圖像仍舊從舊緩存中獲取。

如果您不在頁面中進行任何動態的資源加載,則swapcache不起作用。

特別是,如果您重新加載updateready事件處理程序中的頁面,則調用swapcache 首先自重新加載後無效,該頁面將無論如何都會從新緩存中獲取該頁面。

4

讓我們想象2種不同的場景。

  1. 當新內容可用時您致電location.reload()。該頁面將使用其全新內容重新加載。在這種情況下不需要applicationCache.swapCache()

  2. 您的用戶繼續與您的頁面進行交互,無需重新加載。這種交互會導致資產動態加載。爲了爭辯,讓我們假設這是一個翻轉圖像,讓我們假設你剛剛更新了這個翻轉圖像。如果沒有applicationCache.swapCache(),您的用戶將繼續看到舊的翻轉圖像。在applicationCache.swapCache()之後,他/她將看到新的翻轉圖像。

所以applicationCache.swapCache()無需重裝說:「讓網頁是當它被裝載的方式,但現在使用任何新的資產,只要頁面要求他們」。

相關問題