网站有很多资源是静态文件,每次访问服务器,如果文件没有改变,节约带宽,可以直接取本地缓存
1. 强制缓存
当客户端访问服务器的时候,跟客户端说10秒内不要再来找我了,直接取缓存
res.setHeader('Cache-Control', 'max-age=10')
res.setHeader('Expires', (new Date()+10*1000).toGMTString())
10秒之内重新访问,会用缓存的文件,有一个问题是,如果10秒之内,服务器的静态文件修改了,客户端还是使用旧的文件,那么这就会有问题了。
- 关闭强制缓存
res.setHeader('Cache-Control', 'no-cache'); //或者浏览器禁用缓存
2. 对比缓存
res.setHeadder('Last-Modified', statObj.ctime.toGMTString()) // response
let ctime = req.headers['if-modified-since'] //获取request的时间
if(ctime == statObj.ctime.toGMTString()) {
res.statusCode = 304;
res.end()
}
// 注意: CDN的不同的服务器同一个文件的时间不一样,无效修改文件,文件的时间也会改变
// 引入 根据文件内容判断
// etag性能不太好,可以用文件大小代替
let etag = crypto.createHash('md5').update(fs.readFileSync(realPath)).digest('base64');
res.setHeader('Etag', etag)
if(etag === req.headers['if-none-match']){
res.statusCode = 304;
res.end()
} else {
fs.createReadStream(realPath).pipe(res)
}