Manifest 是 H5提供的一種應用緩存機制, 基於它web應用能夠實現離線訪問(offline cache). 爲此, 瀏覽器還提供了應用緩存的api--applicationCache. 雖然manifest的技術已被web標準廢棄, 但這不影響咱們嘗試去了解它. 也正是由於manifest的應用緩存機制如此誘人, 餓了麼 和 office 365郵箱都還在使用着它!javascript
通讀本文, 你將瞭解到以下內容: css
對manifest熟悉的同窗能夠跳過此節.html
鑑於manifest應用緩存的技術, 咱們能夠作到:html5
manifest緩存的過程以下(來自網絡):java
主流瀏覽器都支持manifest應用緩存技術. 以下表格:ios
IE | Edge | Firefox | Chrome | Safari | Opera | ios | Android |
---|---|---|---|---|---|---|---|
10+ | 12+ | 3.5+ | 4+ | 4+ | 11.5+ | 7.1+ | 2.3+ |
H5標準中, Offline Web applications 部分有以下描述:git
This feature is in the process of being removed from the Web platform. (This is a long process that takes many years.) Using any of the offline Web application features at this time is highly discouraged. Use service workers instead. [SW]github
所以後續我將在其餘文章中繼續介紹 service workers, 本篇繼續關注manifest.web
manifest使用緩存清單進行管理, 緩存清單須要與html標籤進行關聯. 以下:chrome
<html manifest="test.appcache">
...
</html>複製代碼
在html標籤中指定manifest文件, 便表示該網頁使用manifest進行離線緩存. 該網頁內須要緩存的文件列表須要在 test.appcache 文本文件中指定.
就像寫做文同樣, manifest採用經典的三段式. 分別爲: CACHE
, NETWORK
和 FALLBACK
. 以下, 先看一個栗子🌰:
CACHE MANIFEST
# v1.0.0
content.css
NETWORK:
app.js
FALLBACK:
/other 404.html複製代碼
其中第一行必須以 CACHE MANIFEST
開頭, 後可跟若干字符註釋, 註釋從#號開始. 跟在 CACHE MANIFEST
行後的文件, 每行列出一個, 這些文件是須要緩存的文件. 所以 content.css 會被緩存, 不須要訪問網絡.
第二段內容以 NETWORK:
開始, 跟在該行後的文件表示須要訪問網絡. 如: app.js 將直接從網絡上下載, 並不走manifest cache, 若是除了第一段中緩存的文件之外, 其餘文件都從網絡上獲取, 那麼此時可將 app.js 改成 * (通配符).
第三段內容以 FALLBACK:
開始, 跟在該行後的文件表示會有一個替代方案. 如: 當訪問 /other 路徑時, 若是訪問失敗, 那麼將自動加載 404.html 做爲替代.
每一個manifest緩存都有一個狀態, 標示着緩存的狀況. 一份緩存清單隻有一個緩存狀態, 即便它被多個頁面引用. 如下是各個緩存狀態:
上述緩存狀態常量依次取值0, 1, 2, 3, 4, 5.
applicationCache是操做應用緩存的瑞士軍刀, 也是惟一的一把刀.
首先咱們來獲取該對象.
//webview下
var cache = window.applicationCache;
//shared worker中
var cache = self.applicationCache;複製代碼
如下是其屬性和方法介紹(大神請繞過):
status: 返回當前頁面的應用緩存的狀態, 一般開啓應用緩存的頁面可能返回1, 其餘頁面則返回0.
update(): 手動觸發應用緩存的更新.
(1) 如有更新, 則依次觸發①檢查事件(Checking event), ②下載事件(Downloading event), ③下載進度事件(Progress event), ④更新完成事件(UpdateReady event);
(2) 若無更新, 則依次觸發①檢查事件(Checking event), ②無更新事件(NoUpdate event);
(3) 在未開啓應用緩存的頁面調用將拋出Uncaught DOMException
錯誤.
update() 方法一般在長時間不關閉的頁面使用, 好比說郵箱應用, 用於按期檢測可能的更新.
abort(): 取消應用緩存的更新. 可用於節省有限的網絡帶寬.
swapCache(): 若是存在一個更新版本的應用緩存, 那麼它將切換過去, 不然將拋出 Uncaught DOMException
錯誤. 一般, 咱們會在updateready事件觸發以後手動調用swapCache()方法, swapCache的切換隻對後續加載的緩存文件有效, 已經加載成功的資源並不會從新加載.
那麼如何利用好上述api更新一個頁面的應用緩存呢? 別急, Beginner's Guide to Using the Application Cache 一文中提供了以下的樣板方法:
// Check if a new cache is available on page load.
window.addEventListener('load', function(e) {
window.applicationCache.addEventListener('updateready', function(e) {
if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
// Browser downloaded a new app cache.
// Swap it in and reload the page to get the new hotness.
window.applicationCache.swapCache();
if (confirm('A new version of this site is available. Load it?')) {
window.location.reload();
}
} else {
// Manifest didn't changed. Nothing new to server.
}
}, false);
}, false);複製代碼
一般, webview的緩存有以下三種現象:
NETWORK
段落後須要訪問網絡的文件, 將繼續走 http cache.若是緩存的文件須要加參數運行, 建議將參數內容加到hash中, 如:cached-page.html#parameterName=value
manifest 的引入可使用絕對路徑或者相對路徑, 若是你使用的是絕對路徑, 那麼你的manifest文件必須和你的站點處於同一個域名下.
manifest文件你能夠保存爲任意的擴展名, 可是響應頭中如下字段須取如下定值, 以保證manifest文件正確被解析, 而且它沒有http緩存.
Content-Type: text/cache-manifest
Cache-Control: max-age=0
Expires: [CURRENT TIME]複製代碼
chrome瀏覽器下經過訪問 chrome://appcache-internals/ 能夠查看緩存在本地的資源文件.
另外, 除了本文參考的一篇 MDN 的文章以及 HTML5 Rocks的 Beginner's Guide to Using the Application Cache 一文, 還有以下三個連接可供您比較閱讀, 謝謝.
本問就討論這麼多內容,你們有什麼問題或好的想法歡迎在下方參與留言和評論.
本文做者: louis
本文連接: louiszhai.github.io/2016/11/25/…
參考文章