预先记住,HTTP缓存是web性能优化的常识。目的是为了加快第二次请求时JS、CSS、HTML的请求速度,但是HTML不能设置Cache-Control,这是为什么,你可以想想Cache-Control是如何响应response.setHeader('Cache-Control','max-age=315♂000')来设置响应头,而max-age是设置缓存停留的时间,单位秒,从你收到响应开始算起,通常设置至10年或1年。函数设置Cache-Control一段时间内不能访问服务器,直接使用本地内存或者硬盘获取响应,所以非常庞大。访问速度加快,关键是不会发送HTTP请求。更新资源缓存了那么久,那么缓存的资源更新了怎么办?您可以添加查询参数,例如?它们不同的是,还可以更新缓存并在文件名前生成一串字符,更改文件名,更新缓存ETag。说到ETag,就不得不提md5摘要算法。该算法可以计算一个文件然后生成一个String字符,同一个文件内容生成的字符串是相同的,如果内容不同,生成的字符串也会不同,内容差异越小,字符串差异越大如何使用response.setHeader('ETag',fileMd5)fileMd5是md5生成的字符串函数。设置ETag后,每次访问服务器,都需要设置headerIf-None-Match带上字符串。如果资源没有变化,服务端会返回304,这和Cache-Control不同,ETag还是会请求,但是如果资源没有变化,响应体就会为空。更新资源非常简单。当服务器替换资源时,生成的字符串会有所不同。当If-None-Match将原始字符串与原始字符串进行比较,发现字符串不同时,就会下载新的资源ExpiresExpires也是一个响应头,和Cache-Control有类似的作用,不过现在逐渐被淘汰了,如果在Cache-Control响应标头中设置了“max-age”或“s-max-age”指令,则将忽略Expires标头。原因是Expires也设置了时间为deadline,但是它设置的是过期时间,而且如果是GMT格式,最致命的是它的过期时间是基于系统时间的。如果系统时间不对超过Expires的过期时间,则不会请求资源。
