最近因爲找工做一直沒時間也沒有精力更新博客,找工做真是一件苦逼的事情啊。。。不抱怨了,咱們來看看HTML5的新特性---離線存儲吧。javascript
隨着Web App的發展,愈來愈多的移動端App使用HTML5的方式來開發,除了一些HybridApp之外,其餘一部分Web App仍是經過瀏覽器來訪問的,經過瀏覽器訪問就須要聯網發送請求,這樣就使得用戶在離線的狀態下沒法使用App,同時Web App中一部分資源並非常常改變,並不須要每次都向服務器發出請求,出於這些緣由,HTML5提出的一個新的特性:離線存儲。經過離線存儲,咱們能夠經過把須要離線存儲在本地的文件列在一個manifest配置文件中,這樣即便在離線的狀況下,用戶也能夠正常使用App。css
首先來說解下離線存儲的使用方法,提及來也很簡單。只要在你的頁面頭部像下面同樣加入一個manifest
的屬性就能夠了。html
<!DOCTYPE HTML> <html manifest = "cache.manifest"> ... </html>
而後cache.manifest
文件的書寫方式,就像下面這樣:html5
CACHE MANIFEST #v0.11 CACHE: js/app.js css/style.css NETWORK: resourse/logo.png FALLBACK: / /offline.html
離線存儲的manifest通常由三個部分組成:
1.CACHE:表示須要離線存儲的資源列表,因爲包含manifest文件的頁面將被自動離線存儲,因此不須要把頁面自身也列出來。
2.NETWORK:表示在它下面列出來的資源只有在在線的狀況下才能訪問,他們不會被離線存儲,因此在離線狀況下沒法使用這些資源。不過,若是在CACHE和NETWORK中有一個相同的資源,那麼這個資源仍是會被離線存儲,也就是說CACHE的優先級更高。
3.FALLBACK:表示若是訪問第一個資源失敗,那麼就使用第二個資源來替換他,好比上面這個文件表示的就是若是訪問根目錄下任何一個資源失敗了,那麼就去訪問offline.html。java
那麼瀏覽器是怎麼對離線的資源進行管理和加載的呢?這裏須要分兩種狀況來討論。node
在線的狀況下,瀏覽器發現html頭部有manifest屬性,它會請求manifest文件,若是是第一次訪問app,那麼瀏覽器就會根據manifest文件的內容下載相應的資源而且進行離線存儲。若是已經訪問過app而且資源已經離線存儲了,那麼瀏覽器就會使用離線的資源加載頁面,而後瀏覽器會對比新的manifest文件與舊的manifest文件,若是文件沒有發生改變,就不作任何操做,若是文件改變了,那麼就會從新下載文件中的資源並進行離線存儲。瀏覽器
離線的狀況下,瀏覽器就直接使用離線存儲的資源。緩存
這個過程當中有幾個問題須要注意。服務器
若是服務器對離線的資源進行了更新,那麼必須更新manifest文件以後這些資源才能被瀏覽器從新下載,若是隻是更新了資源而沒有更新manifest文件的話,瀏覽器並不會從新下載資源,也就是說仍是使用原來離線存儲的資源。app
對於manifest文件進行緩存的時候須要十分當心,由於可能出現一種狀況就是你對manifest文件進行了更新,可是http的緩存規則告訴瀏覽器本地緩存的manifest文件還沒過時,這個狀況下瀏覽器仍是使用原來的manifest文件,因此對於manifest文件最好不要設置緩存。
瀏覽器在下載manifest文件中的資源的時候,它會一次性下載全部資源,若是某個資源因爲某種緣由下載失敗,那麼此次的全部更新就算是失敗的,瀏覽器仍是會使用原來的資源。
在更新了資源以後,新的資源須要到下次再打開app纔會生效,若是須要資源立刻就能生效,那麼可使用window.applicationCache.swapCache()
方法來使之生效,出現這種現象的緣由是瀏覽器會先使用離線資源加載頁面,而後再去檢查manifest是否有更新,因此須要到下次打開頁面才能生效。
說了這麼多,不如本身動手來試試。這裏須要說明的是,若是須要看到離線存儲的效果,那麼你須要把你的網頁部署到服務器上,不論是本地仍是生產環境服務器中,經過本地文件打開網頁是沒法體驗到離線存儲的。
我在個人電腦上跑了一個本地node服務器,經過localhost訪問。個人manifest文件向下面這樣:
CACHE MANIFEST #v0.11 CACHE: lib/ionic/js/ionic.bundle.js lib/angular-ui-router.js js/app.js lib/ionic/css/ionic.css css/style.css views/login_header.html views/login.html lib/ionic/fonts/ionicons.ttf?v=1.5.2 lib/ionic/fonts/ionicons.woff?v=1.5.2 NETWORK: lib/ionic/fonts/ionicons.ttf?v=1.5.2 lib/ionic/fonts/ionicons.woff?v=1.5.2 css/style.css
而後咱們訪問網頁看看效果。
能夠看出瀏覽器根據manifest文件下載相應資源而且緩存在本地,如今咱們來試試再次訪問網頁
資源已經離線存儲在本地,因此瀏覽器不須要再次下載資源,能夠直接使用本地緩存的資源。接着,咱們更新下服務器上的資源,好比我修改下app.js
,結果我這裏就不顯示了,跟上面那張圖是同樣的,更新的資源並無生效,如今咱們更新下manifest文件,好比把版本改成0.12
很顯然,只有更新了manifest文件,對離線資源的更新才能在瀏覽器上生效。
最後,咱們來試試離線狀態下是什麼狀況,這纔是離線存儲的重頭戲。經過Chrome設置離線狀態,刷新頁面
因爲在離線狀態,因此瀏覽器沒法訪問到manifest文件,可是網頁仍是能夠正常訪問,這就是離線存儲的威力。
對於HTML5中離線存儲對象window.applicationCache
有幾個事件須要咱們關注下:
1.oncached
:當離線資源存儲完成以後觸發這個事件,這個是文檔的說法,我在Chrome上面測試的時候並無觸發這個事件。
2.onchecking
:當瀏覽器對離線存儲資源進行更新檢查的時候會觸發這個事件
3.ondownloading
:當瀏覽器開始下載離線資源的時候會觸發這個事件
4.onprogress
:當瀏覽器在下載每個資源的時候會觸發這個事件,每下載一個資源就會觸發一次。
5.onupdateready
:當瀏覽器對離線資源更新完成以後會觸發這個事件
6.onnoupdate
:當瀏覽器檢查更新以後發現沒有資源更新的時候觸發這個事件
參考文章:
https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache
http://diveintohtml5.info/offline.html