http 缓存
缓存后台是如何实现更新的
CDN 或 nginx 在后台刷新文件路径,或者更小文件的 header
年末 nginx 一般需要统一配置所有版本 302 至最新版
强缓存过期后默认会进入协商缓存
我们应该怎么选择强缓还是弱缓?
-
强缓 强缓存资源一般名称就带有 hash 值(或者版本号),配置一个比较长的过期时间
想更新缓存,那就废弃原引入文件,换个新 hash 名称文件就行
适用于不经常更新的资源
-
弱缓 弱缓我们利用的是浏览器内置和 http 字段,再交给服务器做判断 算是一种让你自定义是基于时间还是资源内容的缓存策略
适用于经常更新的资源
但是前端所有资源除了 public 静态资源,理论上都可以使用 hash,看你利用不利用吧
缓存全流程

如果不返回 304 一定返回 200 请求原资源并更新协商缓存
说一下 http 缓存
字段优先级(如果有)
- Cache-Control: max-age
- Expires
- Etag
- Last-Modified
对于强缓存场景,max-age 要比 expires 高
Expires
Expires: Tue,17 Dec 2019 07:0:44 GMT
也可以用 Max-age 有效期,
Cache-Controll: max-age=3s
如果在 Cache-Controll 响应头设置了 max-age 或者 s-max-age,那么 expires 头会被忽略
强缓存(与 expires 相关)
作为强缓存,未过期不会请求服务器!除非过期
服务器开启强缓存,客户端会将第一次请求响应的资源、响应头中的 expires 字段保存在本地,其中 expires 字段设置了强缓存资源的过期时间。当后续客户端再请求资源时,会对比本地时间与 expires 过期时间,如果过期,则需要重新向服务器发起对资源的请求,否则直接使用本地保存的资源。
协商缓存(与 etag last-modified 相关)
举个栗子,服务器开启协商缓存,客户端会将第一次请求响应的资源保存在本地,并将资源版本信息(响应头 E-Tag= 111、Last-Modified = 2018.6.3 )保存在浏览器缓存表中,客户端第二次请求时会先请求浏览器缓存表中的缓存信息,在请求头中加入字段(If-None-Match = 111、If-Modified-Since = 2018.6.3),服务器获取之后比对 E-Tag、Last-Modified-Since 字段,若一致则返回 304 代码,客户端收到 304 后,直接使用本地缓存,否则返回新资源(走 200),客户端将新资源保存在本地,并将新 E-Tag = 112、Modified-Since = 2018.6.8 存入浏览器缓存表。