記離線緩存(manifest)一大坑,斷定其只適用於靜態網站或離線應用

今天看了離線緩存(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的版本號,就可以刷新緩存了,運維成本也不高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章