导航【【深入01】执行上下文】(https://juejin.im/post/684490...【【深入02】原型链](https://juejin.im/post/684490...[[深入03]继承](https://juejin.im/post/684490...[[深入04]事件loop](https://juejin.im/post/684490...[[深入05]Curried偏函数函数记忆](https://juejin.im/post/684490...[[深入06]隐式转换与运算符](https://juejin.im/post/684490...[[深入07]浏览器缓存机制(http缓存机制)](https://juejin.im/post/684490...[[深入08]前端安全](https://juejin.im/post/684490...[[深入09]DebounceThrottle](https://juejin.im/post/684490...[[深入10]DebounceThrottle](https://juejin.im/post/684490...[[深入11]前端路由](https://juejin.im/post/684490...[[深入12]前端模块化](https://juejin.im/post/684490...[[深入13]观察者模式发布订阅mode双向数据绑定](https://juejin.im/post/684490...[[深入14]画布](https://juejin.im/post/684490...[[In-深度15]webSocket](https://juejin.im/post/684490...[[深入16]webpack](https://juejin.im/post/684490...[[深入17]]http和https](https://juejin.im/post/684490...[【深入18】CSS-interview](https://juejin.im/post/684490...[[深入19]手写承诺](https://juejin.im/post/684490...[[深入20]手写函数](https://juejin.im/post/684490...[[react]Hooks](https://juejin.im/post/684490...[[部署01]Nginx](https://juejin.im/post/684490...[[部署02]Docker部署vue项目](https://juejin.im/post/684490...[[部署03]gitlab-CI](https://juejin.im/post/684490...[[源码-webpack01-pre-knowledge]AST抽象语法树](https://juejin.im/post/684490...[[源码-webpack02-pre-knowledge]Tapable](https://juejin.im/post/684490...[[源码-webpack03]手写webpack-compiler简单编译过程](https://juejin.im/post/684490...[[源码代码]ReduxReact-Redux01](https://juejin.im/post/684490...[[源码]axios](https://juejin.im/post/684490...[[源码]vuex](https://juejin.im/post/684490...[[源码-vue01]数据响应及初始化渲染](https://juejin.im/post/684490...[【源码-vue02】计算响应式——初始化、访问、更新流程】(https://juejin.im/post/684490...缓存的重要性优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,缓存文件可以重复使用,因此它也可以减少带宽并减少Web负载浏览器缓存启用浏览器缓存的优点:页面加载时间更少,服务器负载更少<字体color=red>浏览器是否使用缓存,缓存多长时间由服务器控制,即在服务器响应的响应头中,有些字段表示缓存的关键信息。请求和响应字段都可以使用的头字段Cache-Control请求头字段If-None-MatchIf-Modified-Since响应头字段ETag实体头字段ExpiresLast-Modified浏览器缓存的分类strongcache和协商缓存强缓存Expires,Cache-Control返回的状态码为200network=>size=>会显示从缓存(from-disk-cache),(from-memory-cache)强缓存实现:通过(Expires)或(Cache-Control)这两个(http响应头)用于表示资源在客服中validityExpireshttp1.0端提出,响应头中的一个字段,绝对时间,用GMT格式的字符串表示注意:expires是localto浏览器对于比较起来,是一个绝对时间点,是一个GMT时间Expires是优化中最理想的情况,因为根本不产生请求,所以后端不需要考虑查询速度的原则ExpiresExpires原理浏览器第一次向服务器请求资源,浏览器在请求资源时,将Expires字段添加到响应者响应头中。浏览器收到资源后,将资源连同所有响应头缓存起来。因此缓存命中请求返回的header并不是来自服务器,而是浏览器从之前缓存的header中再次请求该资源时,首先从缓存中查找。找到这个资源后,取出Expires,与当前请求时间进行比较。如果当前请求时间早于Expires指定的时间,则可以命中强Cache,否则不能注意:Expires是与浏览器本地时间比较的。如果缓存未命中,浏览器会直接从服务器获取资源并更新响应头。expiresexpires是一个比较老的强缓存管理头,是服务器返回的一个绝对时间。当服务器时间和客户服务时间相差较大时,Expires缓存管理容易出现问题(例如:随便修改客户端时间会影响命中结果),所以在http1.1中,新建一个header=>Cache-Control建议,一个相对时间,以秒为单位,用数值表示。Cache-Controlhttp1.1提出,响应头中的一个字段,一个相对时间,以秒为单位,以秒为单位的数值表示注:Cache-Control也是和浏览器本地时间做比较的,时间段inseconds可以指定Cache-Control:public和privateprivate:表示该资源只属于发出请求的最终用户,这将禁止中间服务器(如代理服务器)缓存此类资源,对于包含用户个人信息的文件,可以设置privatepublic:允许所有服务器缓存资源no-cache:使用协商缓存no-store:不使用缓存max-age:123123//一段时间,单位是sCache-control:无-cache,private,max-age=123123Cache-Control的原理Cache-Control的原理1、浏览器第一次向服务器请求资源,服务器在响应者的头部添加Cache而返回资源-控制字段2.浏览器收到这个资源后,会把这个资源连同所有的响应头缓存起来-所以,缓存命中请求返回的header不是来自服务器,而是来自之前缓存的header3.浏览当服务器再次请求这个资源时,它首先从缓存中寻找它。找到资源后,取出Cache-Control,与当前请求时间进行比较——如果当前请求时间在Cache-Control指示的时间段内,则可以命中强Cache,否则不能命中4.如果缓存未命中,浏览器直接从服务器获取资源,更新响应头中的Cache-Control。强缓存Expires和Cache-Control总结Expires和Cache-Control可以单独开启也可以同时开启当Expires和Cache-Control同时开启时,Cache-Control的优先级高于ExpiresCache-Control可以指定private和public表示是否允许中间服务器缓存资源。expires是一个以GMT时间表示的时间点,使用Cach-Control以秒表示的时间段与浏览器的本地时间进行比较来协商缓存Last-Modified(If-Modified-Since),ETag(If-None-Match)返回状态码304协商缓存的原理:当浏览器对资源的请求没有命中强cache,会向服务器发送请求,验证协商缓存是否命中,如果协商缓存命中,请求响应返回的http状态为304,并显示一串NotModified表示该资源未被修改。Modified:表示Last-Modified和If-Modified-SinceLast-Modified和If-Modified-Since是根据servertime返回的headerResponseheader:Last-ModifiedRequestheader:If-Modified-Since原理Last-ModifiedIf-None-MatchbrowserfirstWhen第一次向服务器请求资源,当服务器返回资源时,它会将Last-Modified标头添加到响应标头中。此标头指示服务器上资源的最后修改时间。在header中加入If-Modified-Since的header。这个header的值为上次请求返回的Last-Modified的值。如果没有变化,则返回304NotModified,但不返回资源内容;如果有变化,资源内容会正常返回//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//当服务器返回304NotModified响应时,没有Last-Modified头会被添加//因为资源没有改变,所以Last-Modified不会改变。浏览器收到304响应后,会从缓存中加载资源。如果协商缓存没有命中,浏览器直接从服务器加载资源,重新加载时会更新Last-ModifiedHeader。下一次请求时,If-Modified-Since会启用Last-Modified值ETag,而If-None-Match只要资源发生变化,ETag的字符串就不同了,没关系与修改时间做的,所以很好的补充了Last-Modified的问题Responseheader:ETagRequestheader:If-None-Match原理ETag和If-None-Match浏览器从请求资源第一次上服务器。当服务器返回资源时,它会将ETag标头添加到响应标头中。这个头是服务器根据当前请求的资源生成的唯一标识符。这个唯一标识符是一个字符串,只要资源发生变化就不一样。它与最后修改时间无关,因此可以很好地补充Last-Modified问题。当浏览器再次向服务器请求该资源时,在请求的头部添加If-None-Match的头部,该头部的值为上次请求返回的ETag的值。服务器再次收到资源请求时,如果没有变化,会根据资源生成新的ETag。会返回304NotModified,但不会返回资源内容。如果有变化,资源内容会正常返回。//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//与Last-Modified不同,当服务器返回304NotModified响应时//由于ETag已经重新生成,响应头将返回这个ETag,即使ETag与之前的没有变化,浏览器收到一个304响应,它将从缓存中加载资源。Last-Modified(If-Modified-Since)和ETag(If-None-Match)的区别ETag的优点ETag和Last-Modified很相似,都是用来判断一个参数来决定是否启用缓存。然而,ETag也有其优于Last-Modified的优势。可以更准确的判断文件内容是否被修改,在实际操作中更实用。强缓存和协商缓存的区别协商缓存不同于强缓存。强缓存不会向服务器发送请求,所以有时候浏览器并不知道资源什么时候更新,但是协商缓存会向服务器发送请求,所以资源是否更新,服务器会确定。大多数Web服务器默认开启协商缓存,同时开启Last-Modified、If-Modified-SinceandETag、If-None-MatchLast-Modified、If-Modified-SinceandETag、If-None-Match。同时启用,这是为了处理不可靠的Last-Modified//分布式系统中多台机器之间文件的Last-Modified必须一致,以免负载均衡到不同的机器导致比较失败//尝试关闭分布式系统RemoveETag(每台机器生成的ETag会不一样)浏览器缓存判断的过程第一次正常请求后,资源和所有headers都被缓存。资源缓存后缓存过期前,如果再次请求资源,默认先检查强缓存如果强缓存命中,如果强缓存未命中则直接读取,然后向服务器发送请求,检查是否命中协商缓存font>未命中强缓存,则向服务器发送请求,检查是否命中协商缓存。如果协商缓存命中,它会告诉浏览器它仍然可以从缓存中读取未命中的协商缓存,然后从服务器返回最新的资源https://juejin.im/post/684490...