上篇博客(在github上寫個人簡歷——最簡單卻又不容易的內容羅列)介紹了我在github上放的一個個人在線簡歷,有朋友看了后告訴我一個很大缺陷,使用github挺慢的,每次看的時候都很慢,第一反應這問題我可解決不了,后來想到是否可以利用緩存,至少第二次看的時候會快一些,但緩存機制大部分依賴於瀏覽器,而且默認都用了,還是很慢,所以此路不通。
application cache
忽然靈光一現(原諒我愚笨,其實應該很快想到的),前段日子在看html5的東西,當時覺得application cache沒有太大用處,又膚淺了,用在這個需求實在太合適了。那么是什么是application cache呢?
application cache是html5引入的本地存儲方案之一,和我們平常瀏覽器緩存類似,application cache在本地存儲頁面資源,我們先不用着急看application具體怎么使用,首先看看傳統瀏覽器緩存有哪些問題。
一:瀏覽器緩存是不可靠的,我們不直到當前哪些資源被緩存,也不知道會被緩存多久,因為瀏覽器會隨時因為空間或時間原因舍棄某些緩存,加入新的緩存文件。
二:雖然有瀏覽器緩存,但我們不能依賴瀏覽器緩存完全離線訪問web
application cache解決了這兩個主要問題,application cache允許開發者指定頁面哪些資源需要被緩存,雖然也有空間大小限制,但是可以通過程序更改,可以控制緩存生命周期,安全可靠的讓web離線使用,這么神奇,看看是怎么做到的吧
manifest 文件
要向使用application cache 需要為頁面的html標簽添加manifest屬性,屬性值是manifest文件路徑,可以使用同源的絕對地址,也可以使用相對地址。
<!doctype html> <html lang="zh" manifest="main.manifest"> </html>
application cache是通過mannifest文件來管理的,manifest文件是簡單的文本文件,內容是需要被緩存供離線使用的文件列表,及不需要被緩存或讀取緩存失敗的文件控制。mannifest文件可以使用任意拓展名,但需要在服務器中添加MIME類型匹配,使用apache比較簡單,如果使用.manifest作為拓展名在apache配置文件中添加
AddType text/cache-manifest .appcache
使用IIS的話通過界面找到添加MIME窗口添加即可
如何配置
下面是一個manifest文件的示例
main.manifest
1 CACHE MANIFEST 2 #version 0.2.0 3 #date: Nov 24 2013 4 5 CACHE: 6 css/reset.css 7 css/main.css 8 js/jquery.js 9 images/bg.png 10 images/bg_hl.jpg 11 images/icons/yes.png 12 images/icons/top.png 13 offline.html 14 15 NETWORK: 16 * 17 18 FALLBACK: 19 index.html offline.html
1. 文件的第一行必須是 CACHE MANIFEST
2. #開頭的行作為注釋語句,所以文件中關於版本和日期都是注釋,為了方便維護
3. 網站的緩存不能超過5M
4. 文件資源路徑可以使用絕對路徑也可以使用相對路徑
5. 文件列表中任意一個緩存失敗都會導致整個緩存失效,瀏覽器hui按沒有application cache處理
6. 既可以站點使用同一個minifest文件,也可以每個頁面使用一個
然后看一下CACHE、NETWORK、和FALLBACK三條指令語句
CACHE:指明需要緩存的資源文件,瀏覽器會自動緩存帶有manifest屬性的html頁面,所以yinyongwmanifest文件的頁面不用寫在里面
NETWORK:不需要緩存的文件,名字就叫網絡工作嘛,可以使用通配符
FALLBACK:無法訪問緩存文件的備選文件,也可以使用通配符,上邊例子的配置,讀取不到index.html的話就會跳轉至offline.html
看看效果
在在線簡歷中使用application cache后,訪問一下
可以在控制台看看application cache,果真我們希望緩存的內容都被緩存了,試試離線好不好使,由於不知道github是不是支持及其定義的manifest文件拓展名是什么,只好在自己本地試試了,在電腦上配置好,用手機訪問,然后斷開手機網絡,刷新一下。
刷新了八下依舊好使哎,手機離線也能看,就不截圖了。當清除掉application cache並且關掉網絡的時候,頁面果真到了offline.html
更新
這樣不依賴與瀏覽器的緩存機制也有個問題,怎么更新文件告知客戶端呢,總不能永遠使用一份緩存啊。簡單的方法我們可以更新manifest文件,修改注釋的版本號或者日期就可以,這樣瀏覽器就會重新緩存文件,值得注意的是需要minifest文件本身更改(注釋都可以),而緩存文件清單中的文件本身比如offline.html更新瀏覽器是不會重新緩存的。
這樣我們修改了服務器的manifest文件后用戶多刷幾遍頁面就可以了,但未免低級了一些,我們可以通過application cache 提供的接口來檢查更新
application cache 在window上注冊了一個applicationCache對象
status屬性標明當前application cache狀態
0:UNCACHED(未緩存)
1:IDEL(空閑的)
2:CHECKING(正在檢查)
3:DOWNLOADING(正在下載)
4:UPDATEREADY(准備更新)
5:OBSOLETE (已過時)
另外對象有幾個事件,看名字就能知道時做什么的。
對象有三個重要方法
update:嘗試檢查下載新application cache,當然得服務器更新了manifest文件才會下載
swapCache:當status變為UPDATEREADY時就可以更新本地application cache了
abort:取消正在進行的application cache更新
即使下載完新的緩存,也不意味這頁面會更新,我們需要重新加載一次頁面,可以通過這樣的方式來使頁面第一時間更新緩存
applicationCache.onupdateready=function(e) { applicationCache.swapCache(); if (confirm('頁面已更新,是否加載新內容?')) { window.location.reload(); } };
當然也可以設個輪詢函數定時調用update方法檢查更新,這里不演示了
最后
雖然沒有如願在github上使用application cache,但我已經把代碼push到了我的github上,有興趣同學可以down下來看看,了解到了application cache的使用也算是收獲頗豐,小伙兒伴兒在你的個人主頁上試試application cache吧。