JavaScript小知识点:web缓存

对于浏览器端的缓存来说,缓存规则是由meta标签和http协议标签头来决定的,然而由于只有部分浏览器支持meta标签且缓存代理服务器都不支持它,所以我们一般都使用http标签头来设置缓存。 

有关缓存的标签头分为检测新鲜度(时间过期)和检测校验值(验证机制)

规则 报头 类型 作用
新鲜度 Expires Sun,16 Oct 2016 05:43:02 GMT 响应 告诉浏览器在该时间前可以使用缓存副本
  Cache-Control no-cache 响应 告诉浏览器忽略缓存,强制请求服务器
    no-store 响应 告诉浏览器不要保留任何缓存
    public 响应 所有内容都将被缓存(客户端和代理服务器都可缓存)
    private 响应 内容只缓存到单个用户或实体的私有缓存中
    max-age=[秒] 响应 指明缓存的有效时长,从请求时到过期时间的秒数
  Last-Modified Sun,16 Oct 2016 05:43:02 GMT 响应 告诉浏览器当前资源的最后修改时间
  If-Modified-Since Sun,16 Oct 2016 05:43:02 GMT 请求 如果浏览器第一次请求时返回的响应中有Last-Modified头部,则第二次请求同一资源时会把Last-Modified头部的值作为该项的值发给服务器
校验值 ETag 55df4s67sd54 响应 告诉浏览器该资源在服务器的唯一标识符
  If-None-Match 55df4s67sd54 请求 如果浏览器第一次请求时返回的响应中有ETag头部,则第二次请求同一资源时会把ETag头部的值作为该项的值发给服务器

日常使用时一般搭配为Last-Modified/ETag与Cache-Control/Expires这两种方案。 
1.cache-control和Expires的作用相似,都是指明该资源的有效期。由于Expires是属于http1.0的,所以属于http1.1协议的cache-control的出现是为了更精细地控制有效期来弥补Expires的不足。因此它们同时出现时cache-control的优先级较高。

2.在配置Last-Modified/ETag的情况下,浏览器访问同一资源时仍然会发送请求(带上相应的If-Modified-Since/If-None-Match)到服务器询问文件是否已经修改。如果没有,服务器则只会发送一个304给浏览器,浏览器接收后会直接从本地缓存中获取数据。这两个头部信息的作用也是相似的,同样的,属于http1.1的ETag的出现也是为了弥补Last-Modified的一些不足,ETag的优先级也较高:

  • Last-Modified的时间只能精确到秒级,如果某些文件在一秒内被修改多次的话它将失效。
  • 如果某些文件会被定期生成,而内容却没有变化。这时Last-Modified的值改变了,会导致浏览器忽略缓存重新拉取数据。

3.Last-Modified/ETag与Cache-Control/Expires这两种配置方案的不同之处在于:

  • 配置Last-Modified/ETag的情况下,浏览器仍然需要发起一次请求来向服务器确认缓存文件的有效性。而Cache-Control/Expires则不需要发起任何请求,如果本地缓存的有效期在Cache-Control/Expires规定的时间内,则直接使用缓存。
  • 两者一起使用时Cache-Control/Expires的优先级较高,即当本地缓存根据Cache-Control/Expires判断还在有效期内时不会再发送请求去确认Last-Modified/ETag。

一般情况下我们还是会同时设置Last-Modified/ETag与Cache-Control/Expires,因为当用户使用F5刷新时,浏览器会忽略Cache-Control/Expires而不会忽略Last-Modified/ETag设置。当然如果用户使用ctrl+f5强制刷新的话所有缓存机制都会失效。

闲聊群 : 668524118
本群主要用于编程技术 ,及创意作品 ,思维架构的交流 ,欢迎喜欢创新 ,热爱生活的朋友加入 !


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值