利用Node实现HTML5离线存储

前言

支持离线Web应用开发是HTML5的一个重点。离线Web应用就是在设备不能上网的时候仍然能够运行的应用。开发离线Web应用须要几个步骤,其中一个就是离线下必须能访问必定的资源(图像 JS css等)css

HTML5引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在离线时进行访问。html

📌应用程序缓存为应用带来三个优点:web

  • 离线浏览 – 用户可在应用离线时使用它们
  • 速度 – 已缓存资源加载得更快
  • 减小服务器负载 – 浏览器将只从服务器下载更新过或更改过的资源。

原理和环境

  • 在线的状况下, 当浏览器渲染到 <html manifest="test.manifest"> 时,会发出一个请求,请求获取 test.manifest 文件 ,若是是第一次访问,那么浏览器就会根据 描述文件(manifest 文件)中(CACHE MANIFEST)的内容下载相应的资源而且进行离线存储。若是已经访问过而且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,而后浏览器会对比新的 manifest 文件与旧的 manifest 文件,若是文件没有发生改变,就不作任何操做,若是文件改变了,那么就会从新下载文件中的资源并进行离线存储。
    🚩 【注】 这个demo演示是为了更深的了解这个原理
  • 离线的状况下,浏览器就直接使用离线存储的资源
  • 就像cookie同样,HTML5的离线存储也须要服务器环境,这个demo中服务端基于Node.js、Express框架和art-tmplate开发

描述文件

要想在缓存中保存数据,须要使用描述文件manifest 文件,列出要下载和缓存的资源express

manifest 文件可分为三个部分:npm

  • CACHE MANIFEST - 在此标题下列出的文件将在首次下载后进行缓存
  • NETWORK - 在此标题下列出的文件须要与服务器的链接,且不会被缓存
  • FALLBACK - 在此标题下列出的文件规定当页面没法访问时的回退页面(好比 404 页面)
  • 在线的状况下,用户代理每次访问页面,都会去读一次manifest.若是发现其改变, 则从新加载所有清单中的资源

结构


🚩 【注意】 全部的你想让浏览器缓存的资源放在public静态资源文件夹中json

服务端环境的搭建

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>

结果

开启服务端后:

服务器

关闭服务端后:
cookie

改变manifest后 再次链接服务器

CACHE MANIFEST
#v01
/public/image/01.jpg
/public/index.css

NETWORK:
*

FALLBACK:
/


🚩 【注】看图右边控制端的输出,由于改变了manifest文件,浏览器会对比新的 manifest 文件与旧的 manifest 文件,发现文件改变了,那么就会从新下载文件中的资源并进行离线存储

再次关闭服务端后:

相关文章
相关标签/搜索