web缓存
- 什么是web缓存:
- Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本。缓存会根据进来的请求保存输出内容的副本;当下一个请求来到的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是向源服务器再次发送请求。
- 本篇主要讲的是HTML5缓存
- web缓存的好处:
- 减少网络带宽消耗
- 降低服务器压力
- 减少网络延迟,加快页面打开速度。
- 。。。。。
web缓存政策:
- 服务器缓存:
- CDN缓存
- 代理服务器缓存
- Combo服务
浏览器缓存
- http缓存机制:
- 本地缓存阶段
- Cache-COntrol
- Expires
- 协商缓存阶段
- Last-Modified&if-modified-since
- ETag&If-None-Match
- 本地缓存阶段
- http缓存机制:
HTML5缓存思路
- 离线存储manifest
- 本地存储localStorage
- 服务器缓存:
HTML5缓存
离线存储manifest
离线访问对基于网络的应用而言越来越重要。虽然所有浏览器都有缓存机制,但它们并不可靠,也不一定总能起到预期的作用。HTML5 使用 ApplicationCache 接口解决了由离线带来的部分难题。
使用缓存接口可为您的应用带来以下三个优势:
- 离线浏览 - 用户可在离线时浏览您的完整网站
- 速度 - 缓存资源为本地资源,因此加载速度较快。
- 服务器负载更少 - 浏览器只会从发生了更改的服务器下载资源。
应用缓存(又称 AppCache)
- 可让开发人员指定浏览器应缓存哪些文件以供离线用户访问。即使用户在离线状态下按了刷新按钮,您的应用也会正常加载和运行。
使用Cache Manifest
实例以及使用解析
1 | // html文件 |
下面我们来具体分析和看看manifest的用法
引用清单文件
1
2
3<html manifest="demo.appcache">
...
</html>- 首先,在缓存的网络应用中,需要添加manifest属性,如果页面未指定该属性,则页面不会被缓存(除非在manifest文件中直接指定了该页面)
- manifest文件的建议的文件拓展名是:”.appcache”
- 注意:manifest文件需要配置正确的 MIME-type,即 “text/cache-manifest”。必须在 web 服务器上进行配置。
- Manifest 文件
- manifest文件,用于告知浏览器被缓存的内容
- manifest 文件可分为三个部分:
- CACHE MANIFEST - 在此标题下列出的文件将在首次下载后进行缓存
- NETWORK - 在此标题下列出的文件需要与服务器的连接,且不会被缓存
- FALLBACK - 在此标题下列出的文件规定当页面无法访问时的回退页面(比如 404 页面)
CACHE MANIFEST(首次下载后缓存)
第一行,CACHE MANIFEST,是必需的:1
2
3
4CACHE MANIFEST
/theme.css
/logo.gif
/main.js当manifest文件加载后,浏览器会从网站下载这三个文件,便可以离线使用了。
NETWORK(不缓存的文件)
下面的 NETWORK 小节规定文件 “login.asp” 永远不会被缓存,且离线时是不可用的:1
2NETWORK:
login.asp
可以使用星号来指示所有其他资源/文件都需要因特网连接:
1
2
NETWORK:
*
FALLBACK
下面的 FALLBACK 小节规定如果无法建立因特网连接,则用 “offline.html” 替代 /html5/ 目录中的所有文件:1
2FALLBACK:
/html5/ /404.html注释:第一个 URI 是资源,第二个是替补。
注释
以 “#” 开头的是注释行,但也可满足其他用途。应用的缓存会在其 manifest 文件更改时被更新。1
2CACHE MANIFEST
# 2012-02-21 v1.0.0缓存更新的情况
- 用户清空浏览器缓存
- manifest 文件被修改(参阅下面的提示)
- 由程序来更新应用缓存
缓存状态
window.applicationCache 对象是对浏览器的应用缓存的编程访问方式。其 status 属性可用于查看缓存的当前状态:
1 | var appCache = window.applicationCache; |
使用编程的方式更换新缓存:
1 | function handleCacheEvent(e) { |
本地存储localStorage
HTML5 提供了两种在客户端存储数据的新方法:
- localStorage - 没有时间限制的数据存储
- sessionStorage - 针对一个 session 的数据存储
之前,这些都是由 cookie 完成的。但是 cookie 不适合大量数据的存储,因为它们由每个对服务器的请求来传递,这使得 cookie 速度很慢而且效率也不高。
localStorage 方法
localStorage 方法存储的数据没有时间限制。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20localStorage.fresh = "vfresh.org"; //设置一个键值
var a = localStorage.fresh; //获取键值
console.log(a);
//API
//清空storage
localStorage.clear();
//设置一个键值
localStorage.setItem("fresh","vfresh.org");
//获取一个键值
localStorage.getItem("fresh");
//return "vfresh.org" //获取指定下标的键的名称(如同Array)
localStorage.key(0);
//return "fresh" //删除一个键值
localStorage.removeItem("fresh");
- Cookie, LocalStorage 与 SessionStorage的区别
特性 | Cookie | localStorage | sessionStorage |
---|---|---|---|
数据的生命期 | 一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效 | 除非被清除,否则永久保存 | 仅在当前会话下有效,关闭页面或浏览器后被清除 |
存放数据大小 | 4K左右 | 一般为5MB | 一般为5MB |
与服务器端通信 | 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 | 仅在客户端(即浏览器)中保存,不参与和服务器的通信 | 仅在客户端(即浏览器)中保存,不参与和服务器的通信 |
易用性 | 需要程序员自己封装,源生的Cookie接口不友好 | 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持 | 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持 |
构建可缓存站点的建议
- 来自alloyteam:如何构建可缓存站点
- 同一个资源保证URL的稳定性
- 给Css、js、图片等资源增加HTTP缓存头,并强制入口Html不被缓存
- 减少对Cookie的依赖
- 减少对HTTPS加密协议的使用
- 多用Get方式请求动态Cgi
- 动态CGI也是可以被缓存
资料参考: