关于强缓存和协商缓存的理论知识和express.js下的实践,政采云前端团队的这篇文章已经很是详尽了:图解 HTTP 缓存前端
图来自图解 HTTP 缓存git
恰好我最近也在对这一块的内容作补充和总结,受到这篇优质博文的启发,因而有了这篇博文。github
那么在这篇博文中会看到什么呢?express
报文头 | 请求头 | 响应头 |
---|---|---|
Expires | 否 | 是 |
Pragma | 是 | 是 |
Cache-Control | 是 | 是 |
If-Match/If-None-Match | 是 | 否 |
ETag | 否 | 是 |
If-Modified-Since | 是 | 否 |
Last-Modified | 否 | 是 |
强缓存:Pragma > Cache-Control > Expires
segmentfault
协商缓存:If-None-Match/ETag > If-Modified-Since/Last Modified
浏览器
若是强缓存是新鲜的,优先强缓存。缓存
若是强缓存是不新鲜的,判断有无协商缓存:微信
若上一次请求中有ETag,在If-None-Match带上ETag value;
若上一次请求中没有ETag,判断上一次请求响应中是否有Last-Modified,在If-Modified-Since中带上Last-Modified value;
复制代码
若资源没有更新,状态码为304走浏览器缓存;若为200,走协商缓存,返回更新后的资源。前端工程师
代码:app
const Koa = require("koa");
const app = new Koa();
app.use((ctx) => {
ctx.body = "HTTP强缓存之Expires";
ctx.set("Expires", "Mon, May 11 2020 22:10:14 GMT");
});
app.listen(3000);
console.log("应用运行在localhost:3000");
复制代码
首次请求:
代码:
const Koa = require("koa");
const app = new Koa();
app.use((ctx) => {
ctx.body = "HTTP强缓存之Cache-Control";
ctx.set("Cache-Control", "public,max-age=60");
});
app.listen(3000);
console.log("应用运行在localhost:3000");
复制代码
首次请求:
第二次请求来自强缓存:
代码:
const Koa = require("koa");
const app = new Koa();
app.use((ctx) => {
ctx.body = "HTTP强缓存之Pragma";
ctx.set("Pragma", "no-cache");
});
app.listen(3000);
console.log("应用运行在localhost:3000");
复制代码
首次请求: Pragma
代码:
const Koa = require("koa");
const app = new Koa();
app.use((ctx) => {
ctx.body = "HTTP协商缓存之If-Modified-Since&&Last-Modified";
ctx.set({
"Last-Modified": "Mon, May 11 2020 22:20:14 GMT",
});
});
app.listen(3000);
console.log("应用运行在localhost:3000");
复制代码
第一次请求:
第二次请求:
代码:
const conditional = require("koa-conditional-get");
const etag = require("koa-etag");
const Koa = require("koa");
const app = new Koa();
app.use(conditional());
app.use(etag());
app.use((ctx) => {
ctx.body = "HTTP协商缓存之If-None-Match&&ETag";
});
app.listen(3000);
console.log("应用运行在localhost:3000");
复制代码
首次请求:
第二次请求来自协商缓存:
期待和你们交流,共同进步,欢迎你们加入我建立的与前端开发密切相关的技术讨论小组:
- 微信公众号: 生活在浏览器里的咱们 / excellent_developers
- Github博客: 趁你还年轻233的我的博客
- SegmentFault专栏:趁你还年轻,作个优秀的前端工程师
- Leetcode讨论微信群:Z2Fva2FpMjAxMDA4MDE=(加我微信拉你进群)
努力成为优秀前端工程师!