1. 强缓存
控制浏览器强缓存主要靠两个响应头部字段来实现:Expires
和Cache-Control
,浏览器在访问静态资源时,会首先判断该资源是否做了强缓存。如果发现是强缓存并且缓存还在有效期内,那就不会去发送http请求,而直接使用本地的缓存(这个缓存可能来自于内存,也可能来自本地磁盘空间)。其中Expires
表示资源的过期时间(GMT格式),是一个时间点。Cache-Control
使用max-age
来表示资源可以被缓存多久,是一个时间区间。如果强缓存过期了,那就会去协商缓存。
以上二者的优先级Cache-Control
会高于Expires
。如果设置了Cache-Control
那就不会再去检查Expires
了。
强缓存有一个明显的缺点就是,无法知道当前服务器上的资源有没有发生改变。
2. 协商缓存
协商缓存主要靠两对请求头部字段和响应头部字段组成。分别为Last-Modified,If-Modified-Since
和Etag,If-None-Matched
。
Last-Modified
会返回资源最近一个更新的时间,精确到秒。每次这个时间在请求时会通过请求头If-Modified-Since
带到服务器端。服务器端对这个字段进行验证,如果发现这个资源并没有改动,则会返回304的响应码。如果发生改动了会返回200响应码并且返回最新的资源。
Etag
这个字段是由服务器端返回,并且可以将这个字段作为资源的唯一的标识,当内容发生变化之后,这个Etag也会随之改变。下一次请求时会由If-None-Matched
带上这个Etag,服务器端对这个字段进行验证,如果发现这个资源并没有改动,则会返回304的响应码。如果发生改动了会返回200响应码并且返回最新的资源。
以上二者的优先级Etag
的方式会高于Last-Modified
的方式,如果请求头带上了If-Modified-Since
,那就不会再去验证If-None-Matched
3. from memory cache
和 from disk cache
的区别
这两者都是强缓存的结果,其中前者表示缓存来自内存,这种缓存会随着浏览器关闭而消失。后者表示缓存来自硬盘,不会随着浏览器的关闭而消失。控制到底是from memory cache
还是from disk cache
是通过响应头的Etag
来实现的。如果有Etag
字段,那么浏览器会将本次缓存写入硬盘。
4. 缓存利用
- html文件不做缓存,每次都去获取最新的html资源
- 通用的js文件(这部分文件通常来自于项目中的
node_modules
中)做强缓存 - 业务的js文件(这部分由于业务发展经常会发生变化)做协商缓存
- 图片,字体文件做强缓存