可缓存性
到期
max-age=<seconds>
s-maxage=<seconds>
max-stale=<seconds>
重新验证
must-revalidate
proxy-revalidate
其他
no-store
no-transform
重要的原则
test.html
<script src="/script.js"></script>
server.js
const http = require('http');
const fs = require('fs');
http.createServer((req, res) => {
console.log('req come: ', req.url);
if(req.url === '/') {
const html = fs.readFileSync('test.html', 'utf8');
// 默认是下面这个writeHead设置,不写也可以
res.writeHead(200, {
'Content-Type': 'text/html'
});
res.end(html);
}
if(req.url === '/script.js') {
// 默认是下面这个writeHead设置,不写也可以
res.writeHead(200, {
'Content-Type': 'text/javascript'
});
res.end("alert('script loaded')");
}
}).listen(8000, () => {
console.log('server is running on port 8000');
});
启动程序:$ node server.js
访问:http://localhost:8000/
弹出信息:script loaded
检查浏览器Network, 查找script.js项
修改程序,针对script.js的访问设置Cache-Control如下所示
res.writeHead(200, {
'Content-Type': 'text/javascript',
'Cache-Control': 'max-age=20' // 设置缓存时间为20s
});
重启服务:$ node server.js
访问:http://localhost:8000/
再次检查Network, Disable cache 保持未勾选状态
刷新浏览器,检查浏览器Network, 查找script.js项
可见第二次访问script.js时,浏览器从缓存中读取了,这就是Cache
我们再次修改程序,针对script.js的返回,设置
res.end("alert('script loaded!!!')");
重启服务,$ node server.js
再次访问:http://localhost:8000/
弹出信息仍是:script loaded,没有新增的"!!!"
经过20s后, 再次刷新页面
弹出信息:script loaded!!!
可见Cache-Control是客户端缓存, 与服务端无关
服务端修改了js程序, 客户端访问的url仍是script.js, 没有发生变化
因此,客户端仍在有效期内使用缓存资源
这样,又会导致一个新的问题, 客户端无法及时的获取更细,如何解决呢?
另外,关于Cache-Control的设置,还可以在后面添加更多内容
'Cache-Control': 'max-age=20, public'
在代理服务器上,Nginx也可以配置一些代理的Cache-Control的头,此处不再赘述