下面的一片文章《HTTP缓存》关于服务器如何控制浏览器缓存哪里资源、缓存的有效时间、以及如何替换未过期的缓存等过程。
不过该篇文章中有一些点没有详细说,然后其他资料:1.浏览器是如何判断缓存过期了的HTTP1.0里定义了eg:Expires,指定该响应的绝对过期时间,eg: Expires: Fri,05 Jul 2015, 05:00:00 GMT;但是如果服务器时间跟客户端时间不一样就尴尬了,于是这种方式后来慢慢被弃用了。HTTP1.1里定义了Cache-Control,里面有一系列控制缓存的字段,上篇文章也有提,其中max-age用来指定该响应有效的时间,浏览器比较收到该响应的时间与max-age来判断响应是否过期eg:Cache-Control:max-age=31536000.2.服务器如何加ETag 验证令牌以及Last-Modified等以koa实现为例://koastartvar koa = require('koa');var app = new koa();// responseapp.use(function *(){ this.body = 'Hello World'; var etag = this.get('ETag'); console.log("etag:"+etag); var date = new Date; var hashStr = this.body; var hash = require("crypto").createHash('sha1').update(hashStr).digest('base64'); this.set({ 'Cache-Control':'max-age=120', 'Etag': hash, 'Last-Modified': new Date });});
app.listen(3000);
第一次访问之后返回的http头文件中已经写入的相关的信息
第二次发起请求的时候If-None-Match带回Etag给浏览器进行比对,判断是否需要更新缓存。
3.服务器如何给资源文件路径加指纹的
常用指纹生成办法:使用数据摘要要算法 对文件求摘要信息,摘要信息与文件内容一一对应,将摘要信息作为文件名(的一部分)或者版本号文件的hash指纹通常作为前端静态资源实现持久化缓存的方案之一,Webpack提供了两个配置项可供使用:hash和chunkhash.chunkhash代表的是chunk的hash值,根据具体chunk模块文件的内容计算所得的hash值,所以某个文件的改动只会影响它本身的hash指纹,不会影响其他文件。推荐webpack配置:output: { path: './dist/', //为了减少提交文件数,采用 ?_v=[chunkhash:8]的文件命名规则 filename: utils.assetsPath('js/[name].js?_v=[chunkhash:8]'), chunkFilename: utils.assetsPath('js/[id].chunk.js?_v=[chunkhash:8]'), // filename: utils.assetsPath('js/[name].[chunkhash:8].js'), // chunkFilename: utils.assetsPath('js/[id].[chunkhash:8].js') }