1、應用場景 css
咱們一般使用瀏覽器緩存在用戶磁盤上存儲web單頁,在用戶再次瀏覽的時候已節省帶寬,但即使這樣,依然沒法在沒有Internet的狀況下訪問Web。爲了讓web應用程序在離線狀態也能被訪問。html5經過application cache API提供離線存儲功能。前提是你須要訪問的web頁面至少被在線訪問過一次。 html
離線本地存儲和傳統的瀏覽器緩存有什麼不一樣呢? html5
一、瀏覽器緩存主要包含兩類: web
a.緩存協商:Last-modified,Etag 面試
瀏覽器向服務器詢問頁面是否被修改過,若是沒有修改就返回304,瀏覽器直接瀏覽本地緩存文件。不然服務器返回新內容。 ajax
b.完全緩存:cache-control,Expires 瀏覽器
經過Expires設置緩存失效時間,在失效以前不須要再跟服務器請求交互。 緩存
二、離線存儲爲整個web提供服務,瀏覽器緩存只緩存單個頁面; 服務器
三、離線存儲能夠指定須要緩存的文件和哪些文件只能在線瀏覽,瀏覽器緩存沒法指定; app
四、離線存儲能夠動態通知用戶進行更新。
2、如何實現
離線存儲是經過manifest文件來管理的,須要服務器端的支持,不一樣的服務器開啓支持的方式也是不一樣的。
CACHE MANIFEST//必須以這個開頭 version 1.0 //最好定義版本,更新的時候只需修改版本號 CACHE: m.png test.js test.css NETWORK: * FALLBACK online.html offline.html
CACHE指定須要緩存的文件;NETWORK指定只有經過聯網才能瀏覽的文件,*表明除了在CACHE中的文件;FALLBACK每行分別指定在線和離線時使用的文件
要讓manifest管理存儲,還須要在html標籤中定義manifest屬性,以下:
<!DOCTYPE HTML> <html lang="en" manifest='test.manifest'> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> </html>
最後別忘了,這些應用須要服務器支持。
Apache服務器開啓支持的方式是:在conf/mime.types中添加一段代碼:
test/cache-manifest manifest
IIS服務器開啓方式:
右鍵--HTTP---MIME映射下,單擊文件類型---新建---擴展名輸入manifest,類型中輸入test/cache-manifest
3、經過JS動態控制更新
applicationCache對象提供個了一些方法和事件,管理離線存儲的交互過程。經過在firefox8.0的控制檯中輸入window.applicationCache能夠看到這個對象的所
有屬性和事件方法。
applicationCache.onchecking = function(){ //檢查manifest文件是否存在 } applicationCache.ondownloading = function(){ //檢查到有manifest或者manifest文件 //已更新就執行下載操做 //即便須要緩存的文件在請求時服務器已經返回過了 } applicationCache.onnoupdate = function(){ //返回304表示沒有更新,通知瀏覽器直接使用本地文件 } applicationCache.onprogress = function(){ //下載的時候週期性的觸發,能夠經過它 //獲取已經下載的文件個數 } applicationCache.oncached = function(){ //下載結束後觸發,表示緩存成功 } application.onupdateready = function(){ //第二次載入,若是manifest被更新 //在下載結束時候觸發 //不觸發onchched alert("本地緩存正在更新中。。。"); if(confirm("是否從新載入已更新文件")){ applicationCache.swapCache(); location.reload(); } } applicationCache.onobsolete = function(){ //未找到文件,返回404或者401時候觸發 } applicationCache.onerror = function(){ //其餘和離線存儲有關的錯誤 }
4、瀏覽器與服務器的交互
曾經有面試題是這樣的:"描述在瀏覽器的地址欄中輸入:http://www.baidu.com 後發生了什麼?"。
一、服務端返回baidu頁面資源,瀏覽器載入html
二、瀏覽器開始解析
三、發現link,發送請求載入css文件
四、瀏覽器渲染頁面
五、發現圖片,發送請求載入圖片,並從新渲染
六、發送請求js文件,阻塞渲染。若是js對dom進行了操做,則會進行rerender
對於支持離線存儲的頁面,瀏覽器和服務器的交互又是如何呢?
首次載入頁面:
1-6 : 同上
7:請求頁面中須要緩存的頁面和數據,就算在以前的步驟中已經請求過(這是個耗能的地方)
8:服務器返回全部請求文件,瀏覽器進行本地存儲
再次載入頁面:
1:發送請求
2:使用本地存儲的離線文件
3:解析頁面
4:請求服務端的manifest文件,判斷是否有改變,返回304則表示沒有改變進入步驟5,不然進入步驟6(jaykon:這裏是否是錯了?304時會進入6纔對)
5:進入首次載入頁面的7-8(jaykon:這裏注意,就算這次請求manifest文件更新了,也只是在頁面宣染完成後從新下載裏面路徑的文件,這些新文件要在下一次訪問時纔會體現出來,好比再次刷新時。)
6:使用本地存儲,不從新請求