瀏覽器怎么解析manifest?這里需要分兩種情況來(lái)討論。
在線的情況下,瀏覽器發(fā)現(xiàn)html頭部有manifest屬性,它會(huì)請(qǐng)求manifest文件,如果是第一次訪問(wèn)app,那么瀏覽器就會(huì)根據(jù)manifest文件的內(nèi)容下載相應(yīng)的資源并且進(jìn)行離線存儲(chǔ)。如果已經(jīng)訪問(wèn)過(guò)app并且資源已經(jīng)離線存儲(chǔ)了,那么瀏覽器就會(huì)使用離線的資源加載頁(yè)面,然后瀏覽器會(huì)對(duì)比新的manifest文件與舊的manifest文件,如果文件沒(méi)有發(fā)生改變,就不做任何操作,如果文件改變了,那么就會(huì)重新下載文件中的資源并進(jìn)行離線存儲(chǔ)。
離線的情況下,瀏覽器就直接使用離線存儲(chǔ)的資源。
這個(gè)過(guò)程中有幾個(gè)問(wèn)題需要注意:
如果服務(wù)器對(duì)離線的資源進(jìn)行了更新,那么必須更新manifest文件之后這些資源才能被瀏覽器重新下載,如果只是更新了資源而沒(méi)有更新manifest文件的話,瀏覽器并不會(huì)重新下載資源,也就是說(shuō)還是使用原來(lái)離線存儲(chǔ)的資源。
對(duì)于manifest文件進(jìn)行緩存的時(shí)候需要十分小心,因?yàn)榭赡艹霈F(xiàn)一種情況就是你對(duì)manifest文件進(jìn)行了更新,但是http的緩存規(guī)則告訴瀏覽器本地緩存的manifest文件還沒(méi)過(guò)期,這個(gè)情況下瀏覽器還是使用原來(lái)的manifest文件,所以對(duì)于manifest文件最好不要設(shè)置緩存。
瀏覽器在下載manifest文件中的資源的時(shí)候,它會(huì)一次性下載所有資源,如果某個(gè)資源由于某種原因下載失敗,那么這次的所有更新就算是失敗的,瀏覽器還是會(huì)使用原來(lái)的資源。
在更新了資源之后需要到下次再打開(kāi)app才會(huì)生效,如果需要資源馬上生效,可以使用window.applicationCache.swapCache()方法來(lái)使之生效,出現(xiàn)這種現(xiàn)象的原因是瀏覽器會(huì)先使用離線資源加載頁(yè)面,然后再去檢查manifest是否有更新,所以需要到下次打開(kāi)頁(yè)面才能生效。