简单回答
缓存对于前端性能优化来说是个很重要的点,良好的缓存策略可以降低资源的重复加载提高网页的整体加载速度。
通常浏览器缓存策略分为两种:强缓存和协商缓存。
- 强缓存:通过两种响应头实现:expires 和 cache-control 。强缓存表示在缓存期间不需要请求,state code 为 200
expires: Sun, 27 Oct 2030 14:45:38 GMT
cache-control: max-age=30
- expires:HTTP/1.0的产物,表示资源过期时间,和本地时间也有关系
- cache-control:HTTP/1.1的产物,max-age=30表示资源30秒后过期
- cache-control > expires
- 协商缓存:通过两种响应头实现:last-modified 和 etag 。协商缓存需要请求,如果缓存有效会返回 304
etag: "5ff3e6e5-264a"
last-modified: Tue, 05 Jan 2021 04:11:17 GMT
对应的第二次请求头:
if-none-match: "5ff3e6e5-264a"
if-modified-since: Tue, 05 Jan 2021 04:11:17 GMT
- last-modified 和 if-modified-since:表示本地文件最后修改日期,有更新就返回新资源
- etag 和 if-none-match:类似于文件指纹,有更新就返回新资源
- etag > last-modified
追问:为什么服务器优先用etag做协商缓存判断?
- 一些文件也许会周期性的更改,但是他的内容并不改变
- 某些文件修改非常频繁,比如在秒以下的时间内进行修改,而If-Modified-Since能检查到的粒度是秒级的
追问:知道pragma吗?
pragma是旧产物,已经逐步抛弃,有些网站为了向下兼容还保留了这个字段。pragma的值为no-cache时,表示禁用缓存。优先级是 pragma > cache-control > expires
追问:cache-control还有哪一些属性
Cache-Control字段是http报文中的通用首部字段,既存在于请求报文中,也存在于响应报文中。部分字段值是共有的,但是具体的处理也会有差异。
共有字段:
- no-cache:无论缓存是否过期,都要对请求进行校验
- no-store:请求报文中可能存在机密信息,不可缓存 (缓存字段中优先级最高)
- max-age=[秒]:资源x秒后过期,未过期则使用缓存
- no-transform:禁止代理改变实体主体的媒体类型,也包括压缩
- cache-extension: 自定义拓展值,如果缓存服务器不能理解,则忽略
请求报文私有字段值:
- max-stale(=[秒]): 提示缓存服务器,即使缓存过期也使用;或者在过期后的指定时间内依然使用缓存
- min-fresh(=[秒]): 提示缓存服务器,如果缓存在指定时间内还没过期,则返回
- only-if-cache: 提示服务器如果有缓存就返回,不需要确认有效性。如果没有,则返回504网关超时
响应报文私有字段值:
- public: 明确指明缓存可以给所有用户使用
- private: 明确指明缓存不可以给其他用户使用
- must-revalidate: 如果缓存未过期,则返回;否则代理在返回缓存数据之前,必须向源服务器发起请求,验证缓存是否有效。如果无法连接上源服务器,则返回504网关超时
- proxy-revalidate: 所有缓存服务器在返回缓存数据前,都要向源服务器发起请求验证有效性
- s-maxage=[秒]: 缓存资源的时间小于指定时间时,直接返回缓存
追问:http请求头还知道哪些?
- Content-Type 内容类型
常见的媒体格式类型- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式 以application开头的媒体格式类型:
- application/xhtml+xml :XHTML格式
- application/xml : XML数据格式
- application/atom+xml :Atom XML聚合格式
- application/json : JSON数据格式
- application/pdf :pdf格式
- application/msword : Word文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式) 另外一种常见的媒体格式是上传文件之时使用的:
- multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
- accept-encoding:可接受的数据格式,例如常见的gzip
- referer
- user-agent
- cookie
- accept-languag: 接受的语言,例如zh-CN,zh;q=0.9
- Range:只请求实体的一部分,指定范围 例如bytes=500-999