<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近在背面試題時,時常會看見瀏覽器快取,雖然沒有用過但是從它的描寫中大致是知道它的作用和重要性。但是還是沒有程式碼實操過,也是一知半解的,這口氣咽不下啊,開始找資料,但是大部分都是理論半行程式碼沒有,終於東拼西湊頓悟了。開始搭環境,幹活。
瀏覽器快取
瀏覽器快取是瀏覽器在本地磁碟對使用者最近請求過的檔案進行儲存,當存取者再次存取同一頁面時,瀏覽器就可以直接從本地磁碟載入檔案。 瀏覽器快取主要分為強快取(也稱本地快取)和協商快取(也稱弱快取)。
強快取
當請求資源的時,如果是之前請求過的並使用強快取,那麼在過期時間內將不會傳送本次請求向伺服器獲取資源,而是直接從瀏覽器快取中獲取(不管資源是否改動)。過期了將重新從伺服器獲取,並再次強快取。
協商快取
當請求資源時,如果是之前請求過的並使用協商快取,還是傳送請求到伺服器,伺服器通過邏輯判斷確認資源沒有修改返回304狀態碼,那麼本次的資源則是從快取中獲取;如果經過判斷確認資源被修改過,則重新傳送資源到使用者端,並且使用者端更新快取。
判斷資源是否修改有兩種標準,一種是判斷最後修改時間是否變了(確實是修改了,但資源的內容可以沒有變),另一種是判斷資源的內容是否修改。
使用快取有下面的優點:
我們使用node+koa2來搭建我們需要的環境,安裝koa、安裝路由
npm install koa --save npm install koa-router --save
app.js
var Koa = require('koa'); var app = new Koa(); var Router = require('koa-router')(); const fs = require('fs') Router.get("/", async (ctx) => { ctx.body = "ok" }) app .use(Router.routes()) //啟動路由 .use(Router.allowedMethods()); app.listen(3000);
啟動伺服器,網頁輸入網址127.0.0.1:3000,環境搭建成功
強快取是利用http頭中的Expires和Cache-Control兩個欄位來控制的,Expires是http1.0的規範,Cache-Control是在http1.1中出現的,我們這裡使用Cache-Control示範。
Cache-Control有一些常設定的值
將上面 / 路由的程式碼改為
Router.get('/', async (ctx) => { const getResource = () => { return new Promise((res) => { fs.readFile("./fs/a.txt", (err, data) => { if (err) { return; } res(data) }) }) } ctx.set('Cache-Control', 'max-age=10') //設定強快取,過期時間為10秒 ctx.body = await getResource(); })
將測試搭建環境頁面關閉,重新開啟網頁存取127.0.0.1:3000
前端頁面響應頭多了Cache-Control這個欄位,且10s內都走本地快取,不會去請求伺服器端
在過期時間內再次請求資源,就可以看到這次請求並沒有經過伺服器
主要涉及到兩組header欄位:Etag和If-None-Match、Last-Modified和if-modified-since。
Etag/If-None-Match返回的是一個校驗碼。ETag可以保證每一個資源是唯一的,資源變化都會導致ETag變化。伺服器根據瀏覽器上送的If-None-Match值來判斷是否命中快取。 當伺服器返回304 Not Modified的響應時,由於ETag重新生成過,response header中還會把這個ETag返回,即使這個ETag跟之前的沒有變化。
瀏覽器第一次請求一個資源的時候,伺服器返回的header中會加上Last-Modify,Last-Modify是一個時間標識該資源的最後修改時間,例如Last-Modify: Thu,31 Dec 2037 23:59:59 GMT。
當瀏覽器再次請求該資源時,request的請求頭中會包含 if-modified-since,該值為快取之前返回的Last-Modify。伺服器收到if-modified-since後,根據資源的最後修改時間判斷是否命中快取。
如果命中快取,則返回304,並且不會返回資源內容,並且不會返回Last-Modify。
樣例我們使用Last-Modify和if-modified-since來實現。對於Etag和If-None-Match的實現,讀取資源內容,轉成hash值,然後跟Last-Modify和if-modified-since的實現差不多了,同一個道理。
新新增一個路由器
Router.get('/pp', async (ctx) => { const ifModifiedSince = ctx.request.header['if-modified-since']; const getResource = () => { return new Promise((res) => { fs.stat("./fs/a.txt", (err, stats) => { if (err) { console.log(err); } res(stats) }) }) } let resource = await getResource(); // atime Access Time 存取時間 // 最後一次存取檔案(讀取或執行)的時間 // ctime Change Time 變化時間 // 最後一次改變檔案(屬性或許可權)或者目錄(屬性或許可權)的時間 // mtime Modify Time 修改時間 // 最後一次修改檔案(內容)或者目錄(內容)的時間 if (ifModifiedSince === resource.mtime.toGMTString()) { //把具體的日期轉換為(根據 GMT)字串 ctx.status = 304; } ctx.set('Last-Modified', resource.mtime.toGMTString()); ctx.body = resource })
關閉頁面,重新開啟網頁存取127.0.0.1:3000/pp
第一次請求,是沒有if-modified-since欄位的
第二次請求,沒有修改資源,返回狀態碼304,從快取獲取資源
修改a.txt檔案裡內容時,重新請求伺服器
以上就是js前端面試常見瀏覽器快取強快取及協商快取範例的詳細內容,更多關於js前端面試瀏覽器快取的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45