作家
登录

前端必须要懂的浏览器缓存机制

作者: 来源: 2017-09-28 16:05:15 阅读 我要评论

  • 如不雅资本产生变更,则须要取得新的资本,并在缓存中调换旧资本。
  • 如不雅资本没有产生变更,缓存只须要获取新的响应头,和一个新的过不时光,对缓存中的资本过不时光进行更新即可。

HTTP1.1推荐应用的验证方法是If-None-Match/Etag,在HTTP1.0中则应用If-Modified-Since/Last-Modified。

9.Etag与If-None-Match

Etag是指根据实体内容生成一段hash字符串,标识资本的状况,由办事端产生。浏览器会将这串字符串传回办事器,验证资本是否已经修改,如不雅没有修改,过程如下:

代码示例

var http = require('http');var fs = require('fs');http.createServer(function(req, res) {    if (req.url === '/' || req.url === '' || req.url === '/index.html') {        fs.readFile('./index.html', function(err, file) {            console.log(req.url)            //对主文档设置缓存,无效不雅            res.setHeader('Cache-Control', "no-cache, max-age=" + 5);            res.setHeader('Content-Type', 'text/html');            res.writeHead('200', "OK");            res.end(file);        });    }    if (req.url === '/shortcut.png') {        fs.readFile('./shortcut.png', function(err, file) {            console.log(req.url)            res.setHeader('Content-Type', 'images/png');            res.writeHead('200', "OK");            res.end(file);        })    }    if (req.url === '/cache.png') {        fs.readFile('./cache.png', function(err, file) {            console.log(req.headers);            console.log(req.url)            if (!req.headers['if-none-match']) {                res.setHeader('Cache-Control', "max-age=" + 5);                res.setHeader('Content-Type', 'images/png');                res.setHeader('Etag', "ffff");                res.writeHead('200', "Not Modified");                res.end(file);            } else {                if (req.headers['if-none-match'] === 'ffff') {                    res.writeHead('304', "Not Modified");                    res.end();                } else {                    res.setHeader('Cache-Control', "max-age=" + 5);                    res.setHeader('Content-Type', 'images/png');                    res.setHeader('Etag', "ffff");                    res.writeHead('200', "Not Modified");                    res.end(file);                }            }                    });    }    }).listen(8888)

10.若何计算Etag值

  • ETag值平日由办事器端计算,并在响应客户端请求时将它返回给客户端
  • 可以经由过程时光戳就可以最简单的获得ETag头信息;但不建议这么做,这么做和Last-Modified头信息就没什么两样了
  • ETag值可所以独一标识资本的任何器械,如持久化存储中的某个资本接洽关系的版本、一个或者多个文件属性,实体头信息和校验值、(CheckSum),也可以计算实体信息的散列值。
  • 有时刻,为了计算一个ETag值可能有比较大年夜的价值,此时可以采取生成独一值等方法(如常见的GUID)。
  • Apache默认经由过程FileEtag中FileEtag INode Mtime Size的设备主动生成ETag(当然也可以经由过程用户自定义的方法)。
  • 因为Etag由办事器构造,所以在集群情况中必定要包管Etag的独一性

11. If-Modified-Since与Last-Modified

这两个是HTTP1.0顶用来验证资本是否过时的请求/响应头,这两个头部都是日期,验证过程与Etag类似,这里不具体介绍。应用这两个头部来验证资本是否更新时,存在以下问题:

  • 有些文档资本周期性的被重写,但实际内容没有改变。此时文件元数据中会显示文件比来的修改日期与If-Modified-Since不雷同,导致不须要的响应。
  • 有些文档资本被修改了,但修改内容并不重要,不须要所有的缓存都更新(比如代码注释)

12. 总结

  • 浏览器端缓存分为200 from cache和304 not modified
  • HTTP协定中Cache-Control 和 Expires可以用来设置新鲜度的限值,前者是HTTP1.1中新增的响应头,后者是HTTP1.0中的响应头。
  • max-age(单位为s)而Expires指定的是具体的过时日期而不是秒数
  • Cache-Control和Expires同时应用的话,Cache-Control会覆盖Expires
  • 客户端不消关怀ETag值若何产生,只要办事在资本状况产生变革的情况下将ETag值发送给它就行
  • Apache默认经由过程FileEtag中FileEtag INode Mtime Size的设备主动生成ETag(当然也可以经由过程用户自定义的方法)。
  • ETag常与If-None-Match或者If-Match一路,由客户端经由过程HTTP头信息(包含ETag值)发送给办事端处理。
  • Last-Modified常与If-Modified-Since一路由客户端将Last-Modified值包含在HTTP头信息中发给办事端进行处理。
  • 有些文档资本周期性的被重写,但实际内容没有改变。此时文件元数据中会显示文件比来的修改日期与If-Modified-Since不雷同,导致不须要的响应。

13 demo


  推荐阅读

  10 个最终编译成 JavaScript 的脚本语言

与简单的网站比拟,现代应用法度榜样有更多 不合的需求 。然则,浏览器是一个拥有(大年夜部分)固定技巧的平台,并且JavaScript仍然是web应用法度榜样的核心说话;须要在浏览器中运行的任>>>详细阅读


本文标题:前端必须要懂的浏览器缓存机制

地址:http://www.17bianji.com/lsqh/37665.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)