精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

探索前端黑科技——通過png圖的rgba值緩存數據

開發 前端
說起前端緩存,大部分人想到的無非是幾個常規的方案,比如cookie,localStorage,sessionStorage,或者加上indexedDB和webSQL,以及manifest離線緩存。除此之外,到底還有沒有別的方法可以進行前端的數據緩存呢?這篇文章將會帶你一起來探索,如何一步一步地通過png圖的rgba值來緩存數據的黑科技之旅。

說起前端緩存,大部分人想到的無非是幾個常規的方案,比如cookie,localStorage,sessionStorage,或者加上indexedDB和webSQL,以及manifest離線緩存。除此之外,到底還有沒有別的方法可以進行前端的數據緩存呢?這篇文章將會帶你一起來探索,如何一步一步地通過png圖的rgba值來緩存數據的黑科技之旅。

原理

我們知道,通過為靜態資源設置Cache-Control和Expires響應頭,可以迫使瀏覽器對其進行緩存。瀏覽器在向后臺發起請求的時候,會先在自身的緩存里面找,如果緩存里面沒有,才會繼續向服務器請求這個靜態資源。利用這一點,我們可以把一些需要被緩存的信息通過這個靜態資源緩存機制來進行儲存。

那么我們如何把信息寫入到靜態資源中呢?canvas提供了.getImageData()方法和.createImageData()方法,可以分別用于讀取和設置圖片的rgba值。所以我們可以利用這兩個API進行信息的讀寫操作。

接下來看原理圖:

 

當靜態資源進入緩存,以后的任何對于該圖片的請求都會先查找本地緩存,也就是說信息其實已經以圖片的形式被緩存到本地了。

注意,由于rgba值只能是[0, 255]之間的整數,所以本文所討論的方法僅適用于純數字組成的數據。

靜態服務器

我們使用node搭建一個簡單的靜態服務器:

  1. const fs = require('fs'
  2.  
  3. const http = require('http'
  4.  
  5. const url = require('url'
  6.  
  7. const querystring = require('querystring'
  8.  
  9. const util = require('util'
  10.  
  11.   
  12.  
  13. const server = http.createServer((req, res) => { 
  14.  
  15.   let pathname = url.parse(req.url).pathname 
  16.  
  17.   let realPath = 'assets' + pathname 
  18.  
  19.   console.log(realPath) 
  20.  
  21.   if (realPath !== 'assets/upload') { 
  22.  
  23.      fs.readFile(realPath, "binary"function(err, file) { 
  24.  
  25.       if (err) { 
  26.  
  27.         res.writeHead(500, {'Content-Type''text/plain'}) 
  28.  
  29.         res.end(err) 
  30.  
  31.       } else { 
  32.  
  33.         res.writeHead(200, { 
  34.  
  35.           'Access-Control-Allow-Origin''*'
  36.  
  37.           'Content-Type''image/png'
  38.  
  39.           'ETag'"666666"
  40.  
  41.           'Cache-Control''public, max-age=31536000'
  42.  
  43.           'Expires''Mon, 07 Sep 2026 09:32:27 GMT' 
  44.  
  45.         }) 
  46.  
  47.         res.write(file, "binary"
  48.  
  49.         res.end() 
  50.  
  51.       } 
  52.  
  53.    }) 
  54.  
  55.   } else { 
  56.  
  57.     let post = '' 
  58.  
  59.     req.on('data', (chunk) => { 
  60.  
  61.       post += chunk 
  62.  
  63.     }) 
  64.  
  65.     req.on('end', () => { 
  66.  
  67.       post = querystring.parse(post) 
  68.  
  69.       console.log(post.imgData) 
  70.  
  71.       res.writeHead(200, { 
  72.  
  73.         'Access-Control-Allow-Origin''*' 
  74.  
  75.       }) 
  76.  
  77.       let base64Data = post.imgData.replace(/^data:image\/\w+;base64,/, ""
  78.  
  79.       let dataBuffer = new Buffer(base64Data, 'base64'
  80.  
  81.       fs.writeFile('assets/out.png', dataBuffer, (err) => { 
  82.  
  83.         if (err) { 
  84.  
  85.           res.write(err) 
  86.  
  87.           res.end() 
  88.  
  89.         } 
  90.  
  91.         res.write('OK'
  92.  
  93.         res.end() 
  94.  
  95.       }) 
  96.  
  97.     }) 
  98.  
  99.   } 
  100.  
  101. }) 
  102.  
  103.   
  104.  
  105. server.listen(80) 
  106.  
  107.   
  108.  
  109. console.log('Listening on port: 80' 

這個靜態資源的功能很簡單,它提供了兩個功能:通過客戶端傳來的base64生成圖片并保存到服務器;設置圖片的緩存時間并發送到客戶端。

關鍵部分是設置響應頭:

  1. res.writeHead(200, { 
  2.  
  3.   'Access-Control-Allow-Origin''*'
  4.  
  5.   'Content-Type''image/png'
  6.  
  7.   'ETag'"666666"
  8.  
  9.   'Cache-Control''public, max-age=31536000'
  10.  
  11.   'Expires''Mon, 07 Sep 2026 09:32:27 GMT' 
  12.  
  13. })  

我們為這張圖片設置了一年的Content-Type和十年的Expires,理論上足夠長了。下面我們來進行客戶端的coding。

客戶端

  1. <!-- client.html --> 
  2.  
  3.   
  4.  
  5. <canvas id="canvas" width="8", height="1"></canvas>  

假設我們需要存儲的是32位的數據,所以我們為canvas設置寬度為8,高度為1。到底為什么32位數據對應長度為8,是因為每一個像素都有一個rgba,對應著red,green,blue和alpha4個數值,所以需要除以4。

  1. <!-- client.js --> 
  2.  
  3.   
  4.  
  5. let keyString = '01234567890123456789012345678901' 
  6.  
  7.          
  8.  
  9. let canvas = document.querySelector('#canvas'
  10.  
  11. let ctx = canvas.getContext('2d'
  12.  
  13.   
  14.  
  15. let imgData = ctx.createImageData(8, 1) 
  16.  
  17.   
  18.  
  19. for (let i = 0; i < imgData.data.length; i += 4) { 
  20.  
  21.     imgData.data[i + 0] = parseInt(keyString[i]) + 50 
  22.  
  23.     imgData.data[i + 1] = parseInt(keyString[i + 1]) + 100 
  24.  
  25.     imgData.data[i + 2] = parseInt(keyString[i + 2]) + 150 
  26.  
  27.     imgData.data[i + 3] = parseInt(keyString[i + 3]) + 200 
  28.  
  29.  
  30.   
  31.  
  32. ctx.putImageData(imgData, 0, 0)  

首先我們假設需要被緩存的字符串為32位的01234567890123456789012345678901,然后我們使用.createImageData(8, 1)生成一個空白的imgData對象。接下來,我們對這個空對象進行賦值。為了實驗效果更加直觀,我們對rgba值都進行了放大。設置完了imgData以后,通過.putImageData()方法把它放入我們的canvas即可。

我們現在可以打印一下,看看這個imgData是什么:

  1. // console.log(imgData.data) 
  2.  
  3. [50, 101, 152, 203, 54, 105, 156, 207, 58, 109, 150, 201, 52, 103, 154, 205, 56, 107, 158, 209, 50, 101, 152, 203, 54, 105, 156, 207, 58, 109, 150, 201]  

接下來,我們要把這個canvas編譯為一張圖片的base64并發送給服務器,同時接收服務器的響應,對圖片進行緩存:

  1. $.post('http://xx.xx.xx.xx:80/upload', { imgData: canvas.toDataURL() }, (data) => { 
  2.  
  3.     if (data === 'OK') { 
  4.  
  5.         let img = new Image() 
  6.  
  7.         img.crossOrigin = "anonymous" 
  8.  
  9.         img.src = 'http://xx.xx.xx.xx:80/out.png' 
  10.  
  11.         img.onload = () => { 
  12.  
  13.             console.log('完成圖片請求與緩存'
  14.  
  15.             ctx.drawImage(img, 0, 0) 
  16.  
  17.             console.log(ctx.getImageData(0, 0, 8, 1).data) 
  18.  
  19.         } 
  20.  
  21.     } 
  22.  
  23. })  

代碼很簡單,通過.toDataURL()方法把base64發送到服務器,服務器處理后生成圖片并返回,其圖片資源地址為http://xx.xx.xx.xx:80/out.png。在img.onload后,其實圖片就已經完成了本地緩存了,我們在這個事件當中把圖片信息打印出來,作為和源數據的對比。

結果分析

開啟服務器,運行客戶端,***次加載的時候通過控制臺可以看到響應的圖片信息:

 

200 OK,證明是從服務端獲取的圖片。

關閉當前頁面,重新載入:

 

200 OK (from cache),證明是從本地緩存讀取的圖片。

接下來直接看rgba值的對比:

源數據: [50, 101, 152, 203, 54, 105, 156, 207, 58, 109, 150, 201, 52, 103, 154, 205, 56, 107, 158, 209, 50, 101, 152, 203, 54, 105, 156, 207, 58, 109, 150, 201]

緩存數據:[50, 100, 152, 245, 54, 105, 157, 246, 57, 109, 149, 244, 52, 103, 154, 245, 56, 107, 157, 247, 50, 100, 152, 245, 54, 105, 157, 246, 57, 109, 149, 244]

之前得到的結論,源數據與緩存數據存在誤差的原因,經查證后確定為alpha值的干擾所致。如果我們把alpha值直接定為255,并且只把數據存放在rgb值內部,即可消除誤差。下面是改良后的結果:

源數據: [0, 1, 2, 255, 4, 5, 6, 255, 8, 9, 0, 255, 2, 3, 4, 255, 6, 7, 8, 255, 0, 1, 2, 255, 4, 5, 6, 255, 8, 9, 0, 255]

緩存數據:[0, 1, 2, 255, 4, 5, 6, 255, 8, 9, 0, 255, 2, 3, 4, 255, 6, 7, 8, 255, 0, 1, 2, 255, 4, 5, 6, 255, 8, 9, 0, 255]

因為我懶,只是把alpha值給定為255而沒有把循環賦值的邏輯進行更新,所以第4n位的元數據被直接替換成了255,這個留著讀者自行修改有空再改……

綜上所述,這個利用png圖的rgba值緩存數據的黑科技,在理論上是可行的,但是在實際操作過程中可能還要考慮更多的影響因素,比如設法消除服務端的誤差,采取容錯機制等。實際上也是可行的。

值得注意的是,localhost可能默認會直接通過本地而不是服務器請求資源,所以在本地實驗中,可以通過設置header進行cors跨域,并且通過設置IP地址和80端口模擬服務器訪問。

后記

說是黑科技,其實原理非常簡單,與之類似的還有通過Etag等方法進行強緩存。研究的目的僅僅為了學習,千萬不要作為非法之用。如果讀者們發現這篇文章有什么錯漏之處,歡迎指正,也希望有興趣的朋友可以一起進行討論。 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2016-09-13 21:59:09

Html5Http緩存

2024-03-18 08:33:16

2021-10-27 10:34:09

數據庫

2025-05-14 00:00:01

2015-10-21 13:38:28

2025-07-18 07:00:00

前端錄屏JavaScript

2023-11-13 14:53:23

2023-04-07 08:43:47

Go語言應用場

2017-07-07 10:24:56

云計算

2018-07-23 06:38:40

AI芯片數據中心

2025-03-24 01:00:00

2016-01-29 17:53:20

Taste?Analy大數據云計算

2019-11-07 11:40:12

大數據Kafka技術

2023-11-11 19:43:12

緩存數據庫

2016-07-14 16:40:56

黑科技

2023-09-22 08:27:39

2017-10-13 15:30:10

網頁黑科技性能

2015-01-22 10:17:05

微軟win10

2021-11-27 07:09:39

P 圖工具工具應用軟件
點贊
收藏

51CTO技術棧公眾號

亚洲熟女一区二区三区| 亚洲精品日韩精品| 人妻丰满熟妇av无码区| 日韩精品一卡| 日韩欧美在线网站| www国产精品内射老熟女| 黄上黄在线观看| 狠狠久久亚洲欧美| 国产午夜精品一区二区三区| 国产综合中文字幕| avtt在线播放| 99在线精品视频| 国产精品揄拍500视频| 久草资源在线视频| 成人毛片免费看| 欧美精品一区二区三区高清aⅴ| 女人床在线观看| 国产乱码精品一区二三区蜜臂| 四季av在线一区二区三区 | 中文字幕免费在线播放| 欧洲成人一区| 国产精品乱码一区二三区小蝌蚪| 国产精品扒开腿做爽爽爽视频| 中文字幕被公侵犯的漂亮人妻| 亚洲美女尤物影院| 亚洲免费在线观看视频| 日韩理论片在线观看| 男人天堂综合网| 国产一区二区按摩在线观看| 国产精品免费看久久久香蕉| 日韩福利片在线观看| 国产精品自在| 这里是久久伊人| 黄色aaa级片| 芒果视频成人app| 亚洲h动漫在线| 国产精品一二三在线观看| av片免费播放| 蜜臀av性久久久久蜜臀av麻豆| 日韩最新中文字幕电影免费看| 中文字幕一区久久| 成人黄色在线| 在线视频国产一区| 男女av免费观看| 成av人片在线观看www| 一区二区三区日韩精品| 久久久久久久免费| 天天操天天干天天干| 美日韩一区二区| 国产精品美女在线| 免费黄色小视频在线观看| 亚洲欧美日韩国产| 5566成人精品视频免费| 欧美精品成人久久| 综合日韩在线| 久久99精品久久久久久琪琪| 精品一级少妇久久久久久久| 国产成人3p视频免费观看| 日韩精品视频在线观看网址| 亚洲の无码国产の无码步美| 精品精品国产毛片在线看| 在线观看日韩电影| 一区二区成人网| 久久青草免费| 91精品国产色综合久久ai换脸 | 视频午夜在线| 97精品电影院| 91亚洲一区精品| 国产偷人妻精品一区二区在线| 性xx色xx综合久久久xx| 日本欧美爱爱爱| 亚洲无码精品一区二区三区| 精品9999| 日本国产精品视频| 青娱乐在线免费视频| 美腿丝袜亚洲综合| 91久久久一线二线三线品牌| 粉嫩av一区二区夜夜嗨| av午夜一区麻豆| 91性高湖久久久久久久久_久久99| 亚洲精品1区2区3区| 国产精品一国产精品k频道56| 欧美乱妇高清无乱码| 在线看片中文字幕| 婷婷久久国产对白刺激五月99| 一区二区三区无码高清视频| 亚洲AV成人无码精电影在线| 激情综合电影网| 国产99在线|中文| 国产色综合视频| 看国产成人h片视频| 99久久久精品免费观看国产 | 国产精品自产拍在线观看| 日韩欧美一区二区一幕| 日韩黄色免费网站| 亚洲一区二区三| 牛牛澡牛牛爽一区二区| 不卡的av网站| 国产精品毛片va一区二区三区| 国产成人久久精品77777综合| 精品亚洲aⅴ乱码一区二区三区| 国产精品欧美激情| 亚洲卡一卡二卡三| 国产欧美一区二区精品性色 | 亚洲天堂av资源在线观看| 日韩精品欧美激情| 黄色香蕉视频在线观看| 99久久久久国产精品| 97在线视频精品| 6—12呦国产精品| 26uuu久久天堂性欧美| 国内一区在线| 欧美性videos| 色狠狠一区二区| 一级全黄裸体片| 久久精品高清| 国产极品jizzhd欧美| 欧美一区,二区| 亚洲少妇屁股交4| 欧美两根一起进3p做受视频| 久久久久久毛片免费看 | 亚洲电影影音先锋| 欧美xxxx做受欧美| 国产情侣免费视频| 97久久精品人人做人人爽| 欧美国产视频一区| 国产95亚洲| 中文字幕日韩专区| 国产成人无码一区二区在线播放| 日韩中文字幕1| 国产一区二区在线网站| 成人jjav| 91福利社在线观看| 成人影视免费观看| 亚洲男女自偷自拍| 精品久久一区二区三区蜜桃| 欧美1—12sexvideos| 欧美一区二区在线播放| 中文字幕在线永久| 国产综合欧美| 亚洲free嫩bbb| a级在线观看| 91精品国产色综合久久不卡电影| 这里只有精品在线观看视频| 欧美成人午夜| 亚洲最大av网| 午夜伦理在线视频| 日韩欧美黄色影院| 欧美精品videos极品| 成人免费毛片片v| 日本在线播放不卡| 影视一区二区三区| 亚洲午夜av久久乱码| 黄色片在线观看网站| 国内精品伊人久久久久av一坑| 国产一区不卡在线观看| av成人影院在线| 日韩欧美一区二区视频| 波多野结衣办公室33分钟| 久久久国产精品| 欧美在线观看日本一区| 蜜芽tv福利在线视频| 亚洲精选在线视频| 精品伦一区二区三区| 在线欧美日韩| 久久国产精品久久| 在线观看中文| 亚洲成人av资源网| 亚洲另类在线观看| 国产日韩欧美综合一区| 午夜剧场高清版免费观看| 希岛爱理av一区二区三区| 欧亚精品中文字幕| 亚洲毛片在线播放| 精品久久久久久电影| 无码人妻精品一区二区中文| 国产综合精品一区| 麻豆精品传媒视频| 色综合视频一区二区三区44| 欧美成aaa人片在线观看蜜臀| 男人天堂2024| 日韩一区在线看| 波多野结衣加勒比| 日韩精品亚洲一区| 青青草免费在线视频观看| 少妇精品视频在线观看| 欧美巨猛xxxx猛交黑人97人| 亚洲天堂中文在线| 亚洲自拍欧美精品| 在线国产视频一区| 国产成人亚洲综合a∨猫咪| 国模吧无码一区二区三区| 久久在线视频免费观看| 国产美女在线精品免费观看| 天堂久久午夜av| 亚洲片av在线| av中文字幕观看| 色婷婷精品久久二区二区蜜臀av| 97香蕉碰碰人妻国产欧美| 日韩黄色免费电影| 欧美精品卡一卡二| 天天综合网网欲色| 欧洲精品码一区二区三区免费看| 综合另类专区| 亚洲色图国产精品| 亚洲第一天堂影院| 欧美日韩在线直播| 国产精品午夜影院| 亚洲精品伦理在线| 91porn在线| 蜜桃av一区二区三区电影| 青青艹视频在线| 在线中文字幕亚洲| 午夜欧美一区二区三区免费观看| 国产极品嫩模在线观看91精品| 在线精品91av| 亚洲 另类 春色 国产| 欧美精品色综合| 日韩三级一区二区| 亚洲国产一区二区在线播放| 在线观看美女av| 亚洲国产成人一区二区三区| 亚洲国产第一区| 成人一区二区三区视频在线观看| 日韩精品在线视频免费观看| 国产精品久久久久9999赢消| 日韩电影天堂视频一区二区| 欧美顶级毛片在线播放| 99伊人久久| 国产精品va视频| 国产区亚洲区欧美区| 羞羞视频在线观看免费| 久久久久www| 亚洲图片88| 日韩在线国产精品| www.国产精品.com| 国产亚洲欧洲高清| 男女网站在线观看| 制服丝袜中文字幕一区| 中文字幕欧美在线观看| 色婷婷av一区二区三区软件| 日韩精品一区二区av| 亚洲成年人影院| 四虎国产成人精品免费一女五男| 国产成人精品免费在线| 亚洲天堂一区二区在线观看| 国内久久精品视频| 佐山爱在线视频| 国产精品一区二区你懂的| www.偷拍.com| 国产成人午夜视频| 日韩欧美一区三区| 久久精品日韩欧美| 亚洲男人天堂色| 免费在线观看一区二区三区| 一区二区三区网址| 久久99精品久久久| 欧美高清精品一区二区| 国产99精品国产| 影音先锋黄色资源| 91欧美一区二区| 中文字幕55页| 丁香网亚洲国际| 五月天激情播播| 国产综合成人久久大片91| 超碰影院在线观看| 麻豆视频一区二区| 日本一本在线视频| 成人av免费在线观看| 国产乱女淫av麻豆国产| 国产精品自拍毛片| 影音先锋黄色资源| 国产99久久久国产精品潘金网站| 久久婷婷综合色| 国产一区二区中文字幕| 亚洲视频在线播放免费| 久久久国际精品| 亚洲精品中文字幕在线播放| 久久久久久综合| 情侣偷拍对白清晰饥渴难耐| 亚洲成a人片综合在线| 日本一级二级视频| 天天综合天天综合色| 最好看的日本字幕mv视频大全 | 日韩精品一区二区免费| 亚洲欧美清纯在线制服| 国产美女视频免费看| 99久久99久久精品免费观看 | av在线播放不卡| 国产又大又粗又爽的毛片| 亚洲视频在线一区二区| 奇米影视第四色777| 欧美性猛片xxxx免费看久爱| 亚洲av无码乱码国产精品| 91麻豆精品国产自产在线 | 精品久久中文字幕久久av| 最近中文字幕免费观看| 精品电影一区二区| 成人三级黄色免费网站| 久久久久久美女| 日韩在线电影| 欧美13一14另类| 午夜日韩视频| 国产又猛又黄的视频| 成人免费看的视频| 日本午夜在线观看| 欧亚洲嫩模精品一区三区| 欧美一级性视频| 精品精品国产国产自在线| 欧美羞羞视频| 成人免费视频视频在| 99久久99热这里只有精品| 波多野结衣综合网| 久久久久久黄| 免费不卡的av| 91在线视频播放地址| 午夜69成人做爰视频| 欧美视频精品在线| 神马电影在线观看| 久久久久久999| 电影一区中文字幕| 一区二区在线观看网站| 久久国产欧美| 亚洲の无码国产の无码步美| 亚洲综合色婷婷| 国产欧美一级片| 日韩一区二区精品视频| 蜜臀av在线| 成人信息集中地欧美| а√中文在线天堂精品| 欧美一级特黄aaaaaa在线看片| 禁久久精品乱码| 一级全黄裸体片| 亚洲综合一区在线| 午夜精品小视频| 久久影视电视剧免费网站| 欧美黑粗硬大| 中文字幕在线亚洲三区| 久久精品国产秦先生| 老司机深夜福利网站| 欧美日韩精品是欧美日韩精品| 午夜久久久久久噜噜噜噜| 日韩一区二区av| 电影中文字幕一区二区| 黄色www在线观看| 国产在线播放一区二区三区| 中日韩一级黄色片| 午夜精品久久久久影视| 美女黄页在线观看| 中文字幕一区二区精品| 97天天综合网| 国产综合动作在线观看| 久久电影院7| 久热在线视频观看| 亚洲免费电影在线| 超碰在线人人干| 一区二区三区久久精品| 久久天天久久| 国产精品jizz在线观看老狼| 国产一区二区免费视频| 久久久久无码国产精品不卡| 日韩欧美国产一区二区三区| 国精一区二区三区| 欧美精品一区二区三区在线四季| 亚洲国产一区二区三区在线播放 | 日本高清一二三区| 欧美成人一区二区三区| av成人 com a| 神马影院午夜我不卡影院| 老鸭窝一区二区久久精品| www.99re7| 欧美日韩午夜在线视频| 好了av在线| 国内视频一区二区| 青青草国产精品亚洲专区无| 波多野结衣先锋影音| 日本乱人伦aⅴ精品| 日本黄色片在线观看| 国产精品对白一区二区三区 | 日本人妻伦在线中文字幕| 成人av影院在线| 涩涩视频在线观看| 欧美日本高清一区| 亚洲女娇小黑人粗硬| 一道本在线免费视频| 国产人伦精品一区二区| 国产精品无码天天爽视频| 久久久这里只有精品视频| 少妇精品久久久一区二区| 一级黄色高清视频| 1024成人网| 亚洲av电影一区| 97精品国产91久久久久久| 亚洲日本va| 91n.com在线观看| 亚洲一区二区五区| jizz亚洲| 国精产品99永久一区一区| 国产一区在线不卡| 天天干,天天干|