前言
支援離線Web應用開發是HTML5的一個重點。離線Web應用就是在裝置不能上網的時候仍然可以執行的應用。開發離線Web應用需要幾個步驟,其中一個就是離線下必須能訪問一定的資源(影像 JS css等)
HTML5引入了應用程式快取,這意味著 web 應用可進行快取,並可在離線時進行訪問。
?應用程式快取為應用帶來三個優勢:
- 離線瀏覽 – 使用者可在應用離線時使用它們
- 速度 – 已快取資源載入得更快
- 減少伺服器負載 – 瀏覽器將只從伺服器下載更新過或更改過的資源。
原理和環境
- 線上的情況下, 當瀏覽器渲染到
<html manifest="test.manifest">
時,會發出一個請求,請求獲取test.manifest
檔案 ,如果是第一次訪問,那麼瀏覽器就會根據 描述檔案(manifest 檔案)中(CACHE MANIFEST)的內容下載相應的資源並且進行離線儲存。如果已經訪問過並且資源已經離線儲存了,那麼瀏覽器就會使用離線的資源載入頁面,然後瀏覽器會對比新的manifest
檔案與舊的manifest
檔案,如果檔案沒有發生改變,就不做任何操作,如果檔案改變了,那麼就會重新下載檔案中的資源並進行離線儲存。
? 【注】 這個demo演示是為了更深的瞭解這個原理 - 離線的情況下,瀏覽器就直接使用離線儲存的資源
- 就像cookie一樣,HTML5的離線儲存也需要伺服器環境,這個demo中服務端基於Node.js、Express框架和art-tmplate開發
描述檔案
要想在快取中儲存資料,需要使用描述檔案manifest 檔案,列出要下載和快取的資源
manifest 檔案可分為三個部分:
- CACHE MANIFEST - 在此標題下列出的檔案將在首次下載後進行快取
- NETWORK - 在此標題下列出的檔案需要與伺服器的連線,且不會被快取
- FALLBACK - 在此標題下列出的檔案規定當頁面無法訪問時的回退頁面(比如 404 頁面)
- 線上的情況下,使用者代理每次訪問頁面,都會去讀一次manifest.如果發現其改變, 則重新載入全部清單中的資源
結構
? 【注意】 所有的你想讓瀏覽器快取的資源放在public靜態資原始檔夾中
服務端環境的搭建
npm init //生成package.json說明書檔案
npm i express //安裝express包
npm i --save art-template express-art-template //使用art-tmplate
// 入口檔案app.js
var express = require("express");
var app = express();
app.use('/public/', express.static('./public/'))
app.engine('html', require('express-art-template'));
app.get('/', function (req, res) {
res.render('index.html');
});
app.listen(3000, function () {
console.log("app is running at port 3000.");
});
其它
offline.appcache描述檔案
CACHE MANIFEST
#v01
/public/image/01.jpg //快取第一張圖片
NETWORK:
*
FALLBACK:
/
index.html
<!DOCTYPE html>
<html lang="en" manifest="../public/offline.appcache">
<head>
<meta charset="UTF-8">
<title>HTML5離線儲存</title>
<link rel="stylesheet" href="../public/index.css">
</head>
<body>
<img src="../public/image/01.jpg" alt="">
<img src="../public/image/02.jpg" alt="">
</body>
</html>
結果
開啟服務端後:
關閉服務端後:
改變manifest
後 再次連線伺服器
CACHE MANIFEST
#v01
/public/image/01.jpg
/public/index.css
NETWORK:
*
FALLBACK:
/
? 【注】看圖右邊控制端的輸出,因為改變了manifest檔案,瀏覽器會對比新的 manifest 檔案與舊的 manifest 檔案,發現檔案改變了,那麼就會重新下載檔案中的資源並進行離線儲存
再次關閉服務端後: