HTTP緩存之強緩存和協商緩存

HTTP緩存.png

關於強緩存和協商緩存的理論知識和express.js下的實踐,政採雲前端團隊的這篇文章已經很是詳盡了:圖解 HTTP 緩存前端

強緩存和協商緩存流程圖

圖來自圖解 HTTP 緩存express

恰好我最近也在對這一塊的內容作補充和總結,受到這篇優質博文的啓發,因而有了這篇博文。瀏覽器

那麼在這篇博文中會看到什麼呢?緩存

  • 強緩存和協商緩存須要注意的細節
  • HTTP 強緩存之 Koa 實戰app

    • Expires, Pragma, Cache-Control
    • If-Modified-Since&&Last-Modified
    • If-None-Match&&ETag

強緩存和協商緩存須要注意的細節

報文頭類型

報文頭 請求頭 響應頭
Expires
Pragma
Cache-Control
If-Match/If-None-Match
ETag
If-Modified-Since
Last-Modified

報文頭優先級

強緩存:Cache-Control > Pragma > Expireskoa

協商緩存:If-None-Match/ETag > If-Modified-Since/Last Modifiedpost

若是強緩存是新鮮的,優先強緩存。ui

若是強緩存是不新鮮的,判斷有無協商緩存:spa

若上一次請求中有ETag,在If-None-Match帶上ETag value;

若上一次請求中沒有ETag,判斷上一次請求響應中是否有Last-Modified,在If-Modified-Since中帶上Last-Modified value;

若資源沒有更新,狀態碼爲304走瀏覽器緩存;若爲200,走協商緩存,返回更新後的資源。3d

HTTP 強緩存之 Koa 實戰

Expires

代碼:

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");

首次請求:

第二次請求來自強緩存:

Pragma

代碼:

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
image
第二次請求:

Cache-Control

代碼:

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");

首次請求:

第二次請求來自強緩存:

If-Modified-Since&&Last-Modified

代碼:

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");

第一次請求:

第二次請求:

If-None-Match&&ETag

代碼:

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");

首次請求:

第二次請求來自協商緩存:

相關文章
相關標籤/搜索