发布于 2024 年 2 月 26 日,星期一
协商缓存和强缓存是前端性能优化的关键策略。强缓存通过设置HTTP头(如Cache-Control和Expires)直接告诉浏览器使用本地缓存,无需请求服务器,适用于不常变动的资源。协商缓存则通过ETag和Last-Modified头与服务器验证资源是否更新,仅在资源变化时返回新内容,减少不必要的数据传输。两者结合使用,既能提高加载速度,又能确保资源的新鲜度,本质上是平衡用户体验和数据一致性的策略。
极度投入,深度沉浸,边界清晰
前端小菜鸡一枚,分享的文章纯属个人见解,若有不正确或可待讨论点可随意评论,与各位同学一起学习~
欢迎关注
『非同质前端札记』
公众号 ,一起探索学习前端技术......公众号回复
加群
或扫码
, 即可加入前端交流学习群,长期交流学习......公众号回复
加好友
,即可添加为好友
304
状态,让浏览器使用本地缓存副本,如果资源发生了修改,则返回修改后的资源。max-age=xxx
过期了Cache-Control
值为 no-store
Etag
: 因为 Last-Modified
的这种可能发生的不准确性,http 中提供了另外一种方式,那就是 Etag
属性。服务器在返回资源的时候,在头信息中添加了 Etag
属性,这个属性是资源生成的唯一标识符,当资源发生改变的时候,这个值也会发生改变。在下一次资源请求时,浏览器会在请求头中添加一个 If-None-Match
属性,这个属性的值就是上次返回的资源的 Etag
的值。服务接收到请求后会根据这个值来和资源当前的 Etag
的值来进行比较,以此来判断资源是否发生改变,是否需要返回资源。通过这种方式,比 Last-Modified
的方式更加精确。Last-Modified
:服务器通过在响应头中添加 Last-Modified
属性来指出资源最后一次修改的时间,当浏览器下一次发起请求时,会在请求头中添加一个 If-Modified-Since 的属性,属性值为上一次资源返回时的 Last-Modified
的值。当请求发送到服务器后服务器会通过这个属性来和资源的最后一次的修改时间来进行比较,以此来判断资源是否做了修改。如果资源没有修改,那么返回 304
状态,让客户端使用本地的缓存。如果资源已经被修改了,则返回修改后的资源。使用这种方法有一个缺点,就是 Last-Modified
标注的最后修改时间只能精确到秒级,如果某些文件在 1 秒钟以内,被修改多次的话,那么文件已将改变了但是 Last-Modified
却没有改变,这样会造成缓存命中的不准确。Last-Modified
和 Etag
属性同时出现的时候,Etag
的优先级更高。使用协商缓存的时候,服务器需要考虑负载平衡的问题,因此多个服务器上资源的 Last-Modified
应该保持一致,因为每个服务器上 Etag
的值都不一样,因此在考虑负载平衡时,最好不要设置 Etag
属性。Expires
属性:指定资源的过期时间。这个时间是一个绝对时间,也就是服务器的时间,如果服务器时间与客户端的时间不一致,则会影响缓存命中的结果。Cache-Control
属性:因为 Expires
属性的缺点,在 http1.1 中提出了这个新属性,它能更精确的控制资源的缓存。
public
:设置了该字段值的资源表示可以被任何对象(包括:发送请求的客户端、代理服务器等等)缓存。这个字段值不常用,一般还是使用 max-age
来精确控制;private
:设置了该字段值的资源只能被用户浏览器缓存,不允许任何代理服务器缓存。在实际开发当中,对于一些含有用户信息的 HTML,通常都要设置这个字段值,避免代理服务器(CDN)缓存;no-cache
:设置了该字段需要先和服务端确认返回的资源是否发生了变化,如果资源未发生变化,则直接使用缓存好的资源;no-store
:设置了该字段表示禁止任何缓存,每次都会向服务端发起新的请求,拉取最新的资源;max-age
:设置缓存的最大有效期,单位为秒;s-maxage
:优先级高于 max-age
,仅适用于共享缓存(CDN),优先级高于 max-age
或者 Expires 头;max-stale[=]
:设置了该字段表明客户端愿意接收已经过期的资源,但是不能超过给定的时间限制。no-cache
和 no-store
的区别?no-cache
:先向服务器确认当前资源是否有更新,在进行判断是否使用缓存资源。也就是说没有强缓存,但是会有协商缓存no-store
:指不适用任何缓存,每次请求都会向服务器获取最新资源。Q:(question)
R:(result)
A:(attention matters)
D:(detail info)
S:(summary)
Ana:(analysis)
T:(tips)
『非同质前端札记』
公众号 ,一起探索学习前端技术......加群
或 扫码
, 即可加入前端交流学习群,长期交流学习......加好友
,即可添加为好友