今天看了離線緩存(manifest)
方面的資料,興沖沖地就想給自己的網站用上。待我把代碼都寫好部署上服務器,並測試過OK的時候,在SegmentFault刷了一把manifest方面的問答,才發現這個大坑:manifest除了緩存manifest.appcache
文件所指定的資源外,還必定會緩存當前的html頁面。
具體來說:
1. 當用戶第一次訪問頁面,會從服務器上拉取html頁面,以及其它靜態資源。
2. 瀏覽器會把html頁面,連同manifest.appcache
文件,連同manifest.appcache
文件裏所指定的靜態資源一併存入Application Cache
。
3. 當用戶第二次訪問該頁面,manifest.appcache
文件裏所指定的靜態資源就不需要重新加載了,直接從cache讀出。這很好,問題是,當前的html頁面也從cache直接讀出來了,根本就不管線上的版本呀!
4. 這造成的問題是,網站如果更新了,用戶的瀏覽器根本不知道,還顯示cache裏的版本。
網上有所謂的利用<iframe>
的方案,但由於年代久遠,已不適用於當前的瀏覽器了。
冷靜下來想想,這到底是不是個Bug呢?我認爲不是,正如manifest的中文譯名——離線緩存,這個功能根本就是設計給離線應用(例如Hybrid App
)的:用navagator.online
來判斷當前用戶是否聯網,如果離線則任由瀏覽器/WebView讀取緩存,如果在線則清空緩存後刷新頁面讓瀏覽器/WebView讀取線上最新版本的代碼。
另外,採取靜態化策略的網站,也很適合採用manifest,因爲靜態化後的網站實際上就已經屬於靜態網站了,讓瀏覽器讀緩存可比從服務器讀靜態html還省性能。而如果網站需要更新的時候,在重新做完靜態化(重新生成靜態html文件)後,更改一下manifest的版本號,就可以刷新緩存了,運維成本也不高。