面试神器之你要知道的header操作

戳蓝字"

Web前端严选

"

关注我们哦

不仅是前端性能优化,在常见开发中也会涉及到header的配置操作,那么header中都有哪些需要了解的呢?

e8daa07af9322737406851acea2ac78f.png

首先就要说到请求的缓存,与强缓存相关的 header 字段有两个:

1、expires

「expires:」 这是 http1.0 时的规范,它的值为一个绝对时间的 「GMT」 格式的时间字符串,如 Mon,10Jun201521:31:12GMT,如果发送请求的时间在 「expires」 之前,那么本地缓存始终有效,否则就会发送请求到服务器来获取资源。

2、Cache-Control

「cache-control」max-age=number ,这是 http1.1 时出现的 header 信息,主要是利用该字段的max-age 值来进行判断,它是一个相对值;资源第一次的请求时间和 「Cache-Control」 设定的有效期,计算出一个资源过期时间,再拿这个过期时间跟当前的请求时间比较,如果请求时间在过期时间之前,就能命中缓存,否则未命中, 「cache-control」 除了该字段外,还有下面几个比较常用的设置值:

  • 「no-cache:」 不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在 ETag ,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。

  • 「no-store:」 直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。

  • 「public:」 可以被所有的用户缓存,包括终端用户和 CDN 等中间代理服务器。

  • 「private:」 只能被终端用户的浏览器缓存,不允许 CDN 等中继缓存服务器对其缓存。

如果 cache-control 与 expires 同时存在的话,cache-control 的优先级高于 expires。

3.协商缓存

协商缓存都是由浏览器和服务器协商,来确定是否缓存,协商主要通过下面两组 header 字段,这两组字段都是成对出现的,即第一次请求的响应头带上某个字段 ( 「Last-Modified」或者 「Etag」 ),则后续请求会带上对应的请求字段 (「If-Modified-Since」 或者 「If-None-Match」 ) ,若响应头没有 「Last-Modified」 或者 「Etag」字段,则请求头也不会有对应的字段。

「1、Last-Modified/If-Modified-Since」

二者的值都是 GMT 格式的时间字符串,具体过程:

  • 浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在 responseheader 加上 「Last-Modified」字段,这个 header 字段表示这个资源在服务器上的最后修改时间。

  • 浏览器再次跟服务器请求这个资源时,在 requestheader 上加上 「If-Modified-Since」 字段,这个 header 字段的值就是上一次请求时返回的 「Last-Modified」 的值。

  • 服务器再次收到资源请求时,根据浏览器传过来 「If-Modified-Since」 和资源在服务器上的最后修改时间判断资源是否有变化,如果没有变化则返回 304NotModified ,但是不会返回资源内容;如果有变化,就正常返回资源内容。当服务器返回 304NotModified 的响应时, response header 中不会再添加 「Last-Modified的header」 ,因为既然资源没有变化,那么 「Last-Modified」 也就不会改变,这是服务器返回 304 时的 response header

  • 浏览器收到 304 的响应后,就会从缓存中加载资源。

  • 如果协商缓存没有命中,浏览器直接从服务器加载资源时,「Last-Modified」Header 在重新加载的时候会被更新,下次请求时,「If-Modified-Since」 会启用上次返回的「Last-Modified」 值。

「2、Etag/If-None-Match」

这两个值是由服务器生成的每个资源的唯一标识字符串,只要资源有变化就这个值就会改变;其判断过程与 「Last-Modified、If-Modified-Since」 类似,与 「Last-Modified」 不一样的是,当服务器返回 304NotModified 的响应时,由于 「ETag」重新生成过, response header中还会把这个「ETag」 返回,即使这个 「ETag」 跟之前的没有变化。

Tips:Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

4.immutable - 从不请求资源两次

在现代前端应用程序中,样式表和脚本文件通常具有唯一的文件名,如styles.123abc.css。此文件名取决于特定文件的内容。当这些文件的内容发生更改时,会生成不同的文件名。

这些唯一文件可能会被永久缓存,包括用户刷新页面时的情况。不可变特征可以告诉浏览器不要在特定时间范围内重新验证资源。这对指纹验证的资源很有意义,有助于避免重新验证请求。

Cache-Control: max-age=31536000, public, immutable

5.Accept-Encoding  - 压缩到最大值

使用 「Cache-control」,我们可以保存请求并减少重复通过线路传输的数据量。我们不仅可以保存请求,还可以缩小转移的内容。在提供资源时,开发人员应确保尽可能少地发送数据。对于像HTML这样的基于文本的资源,CSS和javascript压缩在保存传输数据方面起着重要作用。目前最常用的压缩是GZIP。服务器足够快,可以动态压缩文本文件,并在请求时提供压缩数据。GZIP不再是最好的选择了。如果您检查浏览器对基于文本的文件(如HTML,CSS和JavaScript)所做的请求,并查看请求标头,您将找到「accept-encoding」 Header。

Accept-Encoding: gzip, deflate, br

此标头告诉服务器它理解的压缩算法。不太知名的br代表是 Brotli(一种压缩算法),是谷歌和Facebook等高流量网站使用的压缩。要使用Brotli,您的网站必须在HTTPS上运行。

6.Accept - 提供正确的图像格式

浏览器不仅告诉我们他们理解的压缩算法。当您的浏览器请求图像时,它还会提供有关其理解的文件格式的信息。

Accept: image/webp, image/apng, image/,/*;q=0.8

围绕新图像格式的竞争已经持续了几年,但现在看起来像webp赢了。Webp是Google发明的一种图像格式,目前对webp图像的支持非常好。

使用此请求标头,即使浏览器请求image.jpg导致文件较小,开发人员也可以提供webp图像。

ca68e86a4f3d0bd61b73a52ef5deb0c1.png

7.参考文章

原文:https://juejin.cn/post/6844903854677442574  来源:掘金

❤️ 感谢大家

如果你觉得这篇内容对你挺有有帮助的话:

  1. 看到这里了就点个在看支持一下吧,你的[在看]是我创作的动力;

  2. 关注公众号【Web前端严选】,进交流群,定期为你推送好文。

afb822146d5799954a0db7d916120724.png

添加个人微信,进群和小伙伴们一起交流学习,顺便升职加薪!

405a373a7116e0438a72c910600a3166.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值