Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

浏览器缓存机制总结 #2

Open
Ray1993 opened this issue Aug 9, 2017 · 0 comments
Open

浏览器缓存机制总结 #2

Ray1993 opened this issue Aug 9, 2017 · 0 comments

Comments

@Ray1993
Copy link
Owner

Ray1993 commented Aug 9, 2017

浏览器缓存是前端开发中是不可避免的问题,对于web应用来说,利用好浏览器缓存可以提升页面性能以及减轻服务端的压力,下面将简单的描述一下浏览器缓存机制的知识以及应用,希望对自己和大家都有所帮助

查看chrome浏览器缓存

我们先在chrome浏览器下看看到底缓存了什么东西
在地址栏输入chrome://view-http-cache/,可以看到chrome所有的缓存文件

image

随便点开一个,可以看到这个缓存文件所有的信息,包括访问url,http请求的头信息,和缓存文件正文内容

image

这样是不是对浏览器的缓存文件有了一定认识了呢,接下来,我们来看看浏览器有哪些缓存类型。

浏览器缓存类型

有两种,强缓存协商缓存
1.强缓存:不会向服务器发送请求,直接从缓存中读取资源,在chrome控制台的network选项可以看到该请求返回的200状态码,并且size显示from disk cache或from memory cache;
2.协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;
3.两者的共同点,都是从客户端缓存中直接读取资源,区别就是强缓存不会发请求(根据判断缓存是否超时来决定是否发送请求),协商缓存会发请求(根据服务器对资源文件的修改标识对比来判断是否要重新下载资源文件还是从直接浏览器缓存中读取)

强缓存

Expires :response header里的过期时间,浏览器再次加载资源时,如果在这个过期时间内,则命中强缓存。
Cache-Control:当值设为max-age=300时,则代表在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。

image

tips:Expires和Cache-Control的max-age属性作用差不多,区别在于Expire是HTTP1.0的产物,Cache-Control是HTTP1.1的产物,两者同时存在的话,Cache-Control的优先级要高于Expire;在某些不支持HTTP1.1环境下,Expires就会发挥作用 。所以Expires其实是过时的产物,现阶段它的存在只是一种兼容性的写法 。

协商缓存

ETagIf-None-Match:这两个要一起说。Etag是上一次加载资源时,服务器返回的response header,是对该资源的一种唯一标识,只要资源有变化,Etag就会重新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里,服务器接受到If-None-Match的值后,会拿来跟该资源文件的Etag值做比较,如果相同,则表示资源文件没有发生改变,命中协商缓存。

Last-ModifiedIf-Modified-Since:这两个也要一起说。Last-Modified是该资源文件最后一次更改时间,服务器会在response header里返回,同时浏览器会将这个值保存起来,在下一次发送请求时,放到request header里的If-Modified-Since里,服务器在接收到后也会做比对,如果相同则命中协商缓存。

response header
image

浏览器缓存过程

  1. 浏览器第一次加载资源,服务器返回200,浏览器将资源文件从服务器上请求下载下来,并把reponse header以及该请求的返回时间一并缓存;

  2. 下一次加载资时,先比较当前时间和上次返回200的时间差,如果没有超过cache-control设置的max-age,则没有过期,命中强缓存,不发请求直接从本地缓存中读取该文件夹(如果浏览器不支持HTTP1.1,则用expires判断是否过期);如果时间过期,则向服务器发送header带有If-None-Match和If-Modified-Since的请求;

  3. 服务器收到请求后,优先根据etag的值判断被请求的文件有没有做修改,etag值一致则资源文件没有修改,命中协商缓存,返回304;如果不一致则说明文件改动,则直接返回新的资源文件并带上新的etag值并返回200;

  4. 如果服务器收到的请求没有etag值,则将If-Modified-Since和被请求文件的最后修改时间做比对,一致则命中协商缓存,返回304;不一致则返回新的last-modified和文件并返回200;

用户行为对浏览器缓存的控制

  1. 地址栏访问,链接跳转是正常的用户行为,将会触发浏览器缓存机制;

  2. F5刷新,浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断;

  3. ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant