写作背景网络上介绍信息、传递信息的文章很多,但真正让读者看懂的文章却寥寥无几。作者想做的是结合自己的理解,用通俗易懂的方式表达信息。让读者不仅了解技术,更了解其原理,清楚其流程,真正掌握。作者技术水平有限,文章可能存在错误和疏漏。敬请指导,期待与您交流。缓存状态码200操作过程:【浏览器】--(200形式缓存)--【浏览器缓存】--【页面显示】浏览器不需要向服务器发起请求,直接调用浏览器缓存要显示的页面。304运行过程:[浏览器]--[服务器]--(304)--[浏览器]--[浏览器缓存]--[页面显示]浏览器向服务器发起请求,而请求header携带着页面的特征值,如“最后修改时间”、“页面内容哈希值”等,服务器端收到请求后,对比请求头携带的特征值是否与请求头一致服务器中页面的特征值。如果特征值没有变化,则认为页面内容没有变化,只返回304状态码的响应头,响应体为空。一般来说,这部分逻辑不需要开发者手动实现,而是内置在框架中。当然,开发者也可以通过一些设置关闭这个功能,即直接返回服务器中的内容,而不管与浏览器中缓存的内容是否相同。浏览器收到304响应头,调用浏览器缓存中的页面,显示内容。什么情况下会出现304,什么时候会出现200formcache?对于缓存页面,页面的“URL的直接资源”会做304处理,页面需要加载的资源会做200形式缓存处理,比如http://www.mongoosejs。net/docs/schematypes.html这个页面。http://www.mongoosejs.net/docs/schematypes.html直接指向的html,即页面的“URL的直接资源”,会被304处理。除了接口,html中需要加载的“其他资源”,如css、js、图片等资源,都属于200表单缓存资源。不管资源是通过h??tml中的标签加载还是通过js代码加载,都是动态加载的。两者都属于“其他资源”。为什么要这样设计?因为页面的“URL的直接资源”是页面的第一个资源,所以需要访问服务器判断页面是否更新,需要给服务器更新资源的机会.如果没有资源访问服务器或与服务器通信,则无法知道服务器是否有资源更新。所以不管怎么设置,第一个调用页面的资源应该访问服务器。至于“其他资源”,不管“URL的直接资源”有没有变化,即使“URL的直接资源”返回的不是304,而是一个新的内容,只要“其他”对应的URL其中描述的资源”保持不变。然后浏览器会在一定时间内(具体什么时间后面介绍)直接调用缓存中的文件,200形成缓存。如果“URL的直接资源”(html)中描述的“其他资源”(如css、js)的URL发生变化,浏览器会把它当作一个新的资源文件,从服务器上取回(注意是当作anewresourcefile)资源获取,而不是判断是否更新304。因为它被视为一个新资源,而不是一个改变的资源)。为什么“其他资源”不像“URL的直接资源”那样访问服务器判断更新?不访问怎么知道有更新?为什么不访问服务器呢,因为这种资源量一般都比较大,即使内容没有变化,也只是返回304,需要经过三次TCP握手,四次挥手。而且浏览器对同一个域名的访问并发数有限制,需要时间。一旦资源大了,这个时间成本就不容忽视。所以不访问服务器,直接从浏览器缓存中获取。如果这些资源发生变化怎么办?通过修改“URL的直接资源”中的代码,修改其对应的链接,将其作为新资源访问。甚至后面还要加一些参数,比如加一个时间字符串?v=20191120122038。浏览器也将被视为新资源。从服务器加载。所以即使你的“其他资源”的内容发生变化,“URL的直接资源”并没有改变(导致html中css的URL没有变化),对应的“其他资源”直接调用缓存中的内容而不通过服务器。前端同学经常会遇到无法显示最新效果的“缓存问题”。这是否意味着如果我不修改链接就永远不会重新访问该资源?不,资源会有过期时间。如果超过过期时间,将再次访问服务器。下一节会介绍。每个缓存头(请求头、响应头)强缓存服务器通过响应头告诉浏览器,“在接下来的一段时间内”,直接使用缓存的内容。你觉得熟悉吗?没错,这就是《其他资源》中应用的技术。为什么访问“其他资源”时不连接服务器,直接从浏览器缓存中获取。因为这是服务器告诉浏览器的,也就是说服务器要求浏览器从缓存中去取。它不是由浏览器本身设置的。那么“接下来的一段时间”指的是什么呢?这是由服务器通过响应标头告知浏览器的。具体使用的响应头如下:(http1.0)Expires:标识资源过期的绝对时间,如Thu,21Nov201900:10:44GMT,表示资源在00:11过期2019年11月21日44秒后到期。在这个时间点之前访问,让浏览器直接从缓存中获取。(http1.1)Cache-Control:接受多个参数,其中一个是定义过期时间。例如Cache-Control:public,max-age=31536000,其中max-age=31536000是通知浏览器从文件开始31536000秒内有效被接收,直接从浏览器缓存中获取。协商缓存浏览器会向服务器发起http请求,然后服务器会告诉浏览器文件没有变化,让浏览器使用本地缓存。使用Ctrl+F5强制刷新可以使缓存失效是的,这是“URL的直接资源”应用的技术,协商缓存返回的304状态码。具体使用的响应头,请求头如下:(http1.0)Last-Modified/If-Modified-Since其中,第一次获取资源时,服务器携带的对应头是Last-修改时间,它告诉浏览器文件上次修改时间。当浏览器再次发起请求时,会将Last-Modified的值携带到请求头中,并以If-Modified-Since为key保存。服务端收到Last-Modified请求头后,会与本地文件的修改时间进行比较,判断文件是否发生变化。如果没有变化,它将返回304状态代码。(http1.1)E-tag/If-None-Match和Last-Modified/If-Modified-Since类似,只是判断方式不同。Last-Modified/If-Modified-Since根据修改时间判断。If-None-Match/E-tag是通过文件内容的hash来判断的。这个判断标准更加彻底和准确。第一次获取资源时,服务器携带的响应头是E-tag。告诉浏览器文件内容的哈希值。当浏览器再次发起请求时,将E-tag的值携带到请求头中,以If-Modified-Since为key保存。服务器收到If-Modified-Since请求头后,会与本地文件的哈希值进行比较,判断文件是否发生了变化。如果没有变化,它将返回304状态代码。如果同时存在E-tag和Last-Modified,服务器将首先检查E-tag。说完
