HTML5離線緩存(Application Cache)

HTML5離線緩存又名Application Cache,是從瀏覽器的緩存中分出來的一塊緩存區,要想在這個緩存中保存數據,可使用一個描述文件(manifest file),列出要下載和緩存的資源。javascript

Manifest 文件css

manifest 文件是簡單的文本文件,它告知瀏覽器被緩存的內容(以及不緩存的內容)。html

manifest 文件可分爲三個部分:java

CACHE MANIFEST - 在此標題下列出的文件將在首次下載後進行緩存web

NETWORK - 在此標題下列出的文件須要與服務器的鏈接,且不會被緩存瀏覽器

FALLBACK - 在此標題下列出的文件規定當頁面沒法訪問時的回退頁面(好比 404 頁面)緩存

相關JavaScript API服務器

核心是applicationCache對象,有個status屬性,表示應用緩存的當前狀態:app

0(UNCACHED) :  無緩存, 即沒有與頁面相關的應用緩存spa

1(IDLE) : 閒置,即應用緩存未獲得更新

2 (CHECKING) : 檢查中,即正在下載描述文件並檢查更新

3 (DOWNLOADING) : 下載中,即應用緩存正在下載描述文件中指定的資源

4 (UPDATEREADY) : 更新完成,全部資源都已下載完畢

5 (IDLE) :  廢棄,即應用緩存的描述文件已經不存在了,所以頁面沒法再訪問應用緩存

相關的事件

表示應用緩存狀態的改變:

checking : 在瀏覽器爲應用緩存查找更新時觸發

error : 在檢查更新或下載資源期間發送錯誤時觸發

noupdate : 在檢查描述文件發現文件無變化時觸發

downloading : 在開始下載應用緩存資源時觸發

progress:在文件下載應用緩存的過程當中持續不斷地下載地觸發

updateready : 在頁面新的應用緩存下載完畢觸發

cached : 在應用緩存完整可用時觸發

瀏覽器支持

IE10+、Firefox3+、Safari4+、Opera10.六、Chrome、iOS3.2+、Android Webkit

注意事項

1. manifest文件須要配置正確的MIME-type,即 "text/cache-manifest",必須在web服務器上進行配置。

例如Tomcat,須要修改web.xml文件,添加以下:

<mime-mapping>
     <extension>manifest</extension>
     <mime-type>text/cache-manifest</mime-type>
</mime-mapping>

2. 更新完版本後,必須刷新一次纔會啓動新版本(會出現重刷一次頁面的狀況)。

因此頁面須要加上這js,監聽到版本更新後,刷新頁面:

applicationCache.addEventListener('updateready', function(e) {

    if (applicationCache.status == applicationCache.UPDATEREADY) {
       
        applicationCache.swapCache(); //使用新版本資源
        window.location.reload(); //刷新頁面
    }
}, false);

3. 瀏覽器對緩存數據的容量限制可能不太同樣(某些瀏覽器設置的限制是每一個站點 5MB)。

4. 瀏覽器會自動緩存引用manifest文件的HTML文件,這就致使若是改了HTML內容,也須要更新版本才能作到更新。

5. 當一個資源被緩存後,該瀏覽器直接請求這個絕對路徑也會訪問緩存中的資源,其餘頁面即便沒有設置manifest屬性,請求的資源若是在緩存中也從緩存中訪問。

6. 若是manifest文件,或者內部列舉的某一個文件不能正常下載,整個更新過程將視爲失敗,瀏覽器繼續所有使用老的緩存。

離線緩存優勢

1. 減小服務器負載,提升資源加載速度

2. 離線瀏覽,用戶可在應用離線時使用

離線緩存缺點

1. 更新完版本後,必須刷新一次纔會啓動新版本(會出現重刷一次頁面的狀況)

2. 進入離線存儲的頁面,若是不更新版本,是會將其當成靜態頁面不請求。

3. 沒法進行灰度發佈等策略。

PS:灰度發佈,一部分使用舊版,一部分人用新版。

4. 沒法增量更新。

PS:少許代碼修改,全量更新。

離線緩存與傳統瀏覽器緩存區別

1. 離線緩存是針對整個應用,瀏覽器緩存是單個文件

2. 離線緩存斷網了仍是能夠打開頁面,瀏覽器緩存不行

3. 離線緩存能夠主動通知瀏覽器更新資源

離線緩存示例

manifest

CACHE MANIFEST
#v1.0.1

CACHE:
js/app.js
css/app.css

NETWORK:
*

FALLBACK:
404.html

demo.html

<!DOCTYPE html>
<html manifest="app.manifest">
<head>
<title>Demo</title>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/app.css" />
<link rel="stylesheet" type="text/css" href="css/demo.css" />
<script type="text/javascript" src="js/app.js"></script>
<script type="text/javascript" src="js/demo.js"></script>
</head>
<script>
    applicationCache.addEventListener('updateready', function(e) {
        if (applicationCache.status == applicationCache.UPDATEREADY) {
 
            applicationCache.swapCache(); //使用新版本資源
            window.location.reload(); //刷新頁面
        }
    }, false);
</script>
<body>
俯首江左有梅郎~
</body>
</html>

app.css

body {color: blue;} 

demo.css

body {font-size: 60px;} 

app.js

alert('我是app.js'); 

demo.js

alert('我是demo.js');

示例效果

本地直接打開沒有效果的,離線緩存是無效的。

部署在Web服務器,第一次訪問:

第二次訪問:

 

本文爲原創文章,轉載請保留原出處,方便溯源,若有錯誤地方,謝謝指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5021992.html

相關文章
相關標籤/搜索