缓存是前端避不开的话题,不管是打包之后的资源,还是服务器运维时的网络资源缓存,是最直接影响到网站性能和用户体验的。
缓存的优点:
- 减少了不必要的数据传输,节省带宽。
- 减少服务器的负担,提升网站性能。
- 加快了客户端加载网页的速度。
- 用户体验友好。
强缓存
我们平时说的强缓存的意思是指强制缓存。
协商缓存的规则:在max-age里面设置的缓存时长没有过期,并且属性不是no-cache/no-store时,用户正常访问下就走强缓存。
需要在请求头(respone header)里对资源文件做缓存配置。缓存的时间、缓存类型都由服务端控制,关键字段是“cache-control”,常用值为:max-age/public/private/immutable/no-cache/no-store。
max-age: 单位精确到秒,用来设置强缓存的时长,在有效期内都会执行缓存操作。
public: 允许客户端和代理服务器都可以缓存该资源。
private: 只允许客户端缓存该资源,代理服务器不缓存。
immutable: 用户强制刷新,也不像服务器发起请求。
no-cache: 跳过强缓存,不影响协商缓存,已强缓存的话会在失效之后生效。
no-store: 完全不缓存,没有强缓存和若缓存。
协商缓存
协商缓存的规则:需要与服务器进行一次通信,由服务器告诉客户端是否生效。生效返回http code为304,否则返回200。
需要在请求头(respone header)里对资源文件做缓存配置。关键字段是:“etag”和“last-modified”。
etag: 一般由last_modified+content_length拼接而成的hash值,通常情况下,当发生了文件内容更改,则更新。
last-modified: 单位时间为秒,标记此文件在服务器端最后被修改的时间。
其中的etag、last-modified在客户端重新向服务端发起请求时,会有两个key值,他们是If-None-Match/If-Modified-Since,目的就是对比值是否还有效。
PS
etag:因为单位只能统计到秒,当编辑文件但文件内容没有发生变化,mtime会改变。此时文件大小没有发生改变,etag不会更新。但这种情况一般要在1s之内存在,概率比较低,因此可以忽略。
优化策略: 即便是在5G完全开放的时代,不用考虑资源大小和传输速度,缓存也是必不可少需要涉及到的性能优化方向。