離線緩存(manifest)

Html5 引入了應(yīng)用程序緩存,這意味著web應(yīng)用可以進(jìn)行緩存,并且可以在沒有網(wǎng)絡(luò)連接的時(shí)候進(jìn)行訪問。
1.1 什么是Cache Manifest
首先manifest是一個(gè)后綴名為minifest
或者appcache
,的文件,在文件中定義那些需要緩存的文件,支持manifest的瀏覽器,會(huì)將按照manifest文件的規(guī)則,像文件保存在本地,從而在沒有網(wǎng)絡(luò)鏈接的情況下,也能訪問頁面。
當(dāng)我們第一次正確配置appcache后,當(dāng)我們?cè)俅卧L問該應(yīng)用時(shí),瀏覽器會(huì)首先檢查manifest文件是否有變動(dòng),如果有變動(dòng)就會(huì)把相應(yīng)的變得跟新下來,同時(shí)改變?yōu)g覽器里面的appcache,如果沒有變動(dòng),就會(huì)直接把a(bǔ)ppcache的資源返回,基本流程是這樣的。



1.2 應(yīng)用緩存的優(yōu)勢(shì):
(1) 離線瀏覽:用戶可以在應(yīng)用離線時(shí)使用它們
(2) 速度更快:已緩存資源,加載得更快
(3) 減少服務(wù)器負(fù)載:瀏覽器只需從服務(wù)器刪下載更改過或更新過的資源就可以了。
二、如何使用
有一個(gè)web應(yīng)用有三個(gè)文件index.html,a.js,b.css,現(xiàn)在需要把js和css文件緩存起來
1.在index.html里加上<html manifest="test.manifest">

2.test.manifest
清單格式如下
CACHE MANIFEST#上面一句必須#v1.0.0#需要緩存的文件CACHE:a.jsb.css#不需要緩存的文件NETWORK:*#無法訪問頁面FALLBACK:404.html

3.manifest文件的mime-type必須是 text/cache-manifest
類型 manifest文件,基本格式為三段: CACHE, NETWORK,與 FALLBACK,其中NETWORK和FALLBACK為可選項(xiàng)。
而第一行CACHE MANIFEST為固定格式,必須寫在前面。
以#號(hào)開頭的是注釋,一般會(huì)在第二行寫個(gè)版本號(hào),用來在緩存的文件更新時(shí),更改manifest的作用,可以是版本號(hào),時(shí)間戳或者md5碼等等。
CACHE:(必須)
標(biāo)識(shí)出哪些文件需要緩存,可以是相對(duì)路徑也可以是絕對(duì)路徑。
CACHE:a.csshttp://yanhaijing.com/a.css

NETWORK:(可選)
這一部分是要繞過緩存直接讀取的文件,可以使用通配符*。
下面的代碼 “l(fā)ogin.asp” 永遠(yuǎn)不會(huì)被緩存,且離線時(shí)是不可用的:
NETWORK:login.asp

可以使用星號(hào)來指示所有其他資源/文件都需要因特網(wǎng)連接:NETWORK:*

FALLBACK:(可選)
指定了一個(gè)后備頁面,當(dāng)資源無法訪問時(shí),瀏覽器會(huì)使用該頁面。該段落的每條記錄都列出兩個(gè)URI—第一個(gè)表示資源,第二個(gè)表示后備頁面。兩個(gè) URI 都必須使用相對(duì)路徑并且與清單文件同源。可以使用通配符。
下面的例子中,如果無法建立因特網(wǎng)連接,則用 “404.html” 替代 /html5/ 目錄中的所有文件。
FALLBACK:/html5/ /404.html

下面的例子中,則用 “404.html” 替代所有文件。
FALLBACK:*.html /404.html

如何更新緩存
如下三種方式,可以更新緩存:

更新manifest文件
通過javascript操作
清除瀏覽器緩存

給manifest添加或刪除文件,都可更新緩存,如果我們更改了js,而沒有新增或刪除,前面例子中注釋中的版本號(hào),可以很好的用來更新manifest文件。
html5中引入了js操作離線緩存的方法,下面的js可以手動(dòng)更新本地緩存。
window.applicationCache.update();

如果用戶清除了瀏覽器緩存(手動(dòng)或用其他一些工具)都會(huì)重新下載文件。
注意事項(xiàng)
瀏覽器對(duì)緩存數(shù)據(jù)的容量限制可能不太一樣(某些瀏覽器設(shè)置的限制是每個(gè)站點(diǎn) 5MB)。

如果manifest文件,或者內(nèi)部列舉的某一個(gè)文件不能正常下載,整個(gè)更新過程都將失敗,瀏覽器繼續(xù)全部使用老的緩存。

引用manifest的html必須與manifest文件同源,在同一個(gè)域下。

FALLBACK中的資源必須和manifest文件同源。

當(dāng)一個(gè)資源被緩存后,該瀏覽器直接請(qǐng)求這個(gè)絕對(duì)路徑也會(huì)訪問緩存中的資源。

站點(diǎn)中的其他頁面即使沒有設(shè)置manifest屬性,請(qǐng)求的資源如果在緩存中也從緩存中訪問。

當(dāng)manifest文件發(fā)生改變時(shí),資源請(qǐng)求本身也會(huì)觸發(fā)更新。

對(duì)于每個(gè)index.html?id=1或index.html?id=2都會(huì)分別緩存index.html頁面,可以通過chrome瀏覽器Resources/Application Cache
觀察

如果想更新緩存內(nèi)容,只要修改下manifest文件即可,如改版本號(hào)v1.0.1

離線存儲(chǔ)如果資源有更新,可以通過如下代碼來監(jiān)聽,但第一次加載還會(huì)是原來的版本
window.applicationCache.addEventListener('updateready',function(e){ if(window.applicationCache.status == window.applicationCache.UPDATEREADY){ window.applicationCache.swapCache(); if(confirm("loding new?")){ window.location.reload() } }},false);

實(shí)踐代碼

html代碼

<!DOCTYPE html>
<html manifest="test.manifest">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <link rel="stylesheet" type="text/css" href="css/test.css"/>
        <link rel="stylesheet" type="text/css" href="css/network.css"/>
        <script type="text/javascript" src="js/test.js" ></script>
    </head>
    <body>
        <div id="box"></div>
    </body>
</html>

test.manifest代碼

CACHE MANIFEST
## v 1.3

CACHE:
./css/test.css
./js/test.js
NETWORK: 
./css/network.css
FALLBACK:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容