国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

純js實現無限空間大小的本地存儲

2019-11-20 12:13:31
字體:
來源:轉載
供稿:網友

好久沒有寫博客了,想到2年前答應要放出源代碼的也沒放出來,最近終于有空先把純js實現無限空間大小的本地存儲的功能開源了,

項目地址https://github.com/xueduany/localstore

demo見http://xueduany.github.io/localstore/

下面給大家簡單說說大概原理,具體細節和異常處理后面有機會在單獨說

先說下突破本地localStorage的原理,官方原話是這么說的http://www.w3.org/TR/2013/PR-webstorage-20130409/

所以你懂的,你可以利用多個子域名的localStorage是不互相依賴的性質,來通過多個子域名的localStorage來設計實現一個storePool,突破上限

那么,在實際API存儲的時候,就不是對本地localStorage的保存了

這有點類似一個Manager模式,就是你告訴倉庫管理員你要保存什么,倉庫管理員給你一把鑰匙,然后你拿著鑰匙去對應的倉庫把你的東西托管起來,管理員再給你一個token憑證,以后你只要拿著這個憑證就可以把的保存的東西取出來

最終用戶不用care我的數據保存在哪里,只要實現類似localStorage的API即可

然后設計一個js對象來充當倉庫管理員的角色即可,這個管理員需要支持有多少個token,對應的保存的東西寄放在哪里,就是寄放在哪個子域名下的空間里面,那么我們需要設計實現這么一套數據結構

對應的key下面是存放它存在的倉庫的地址,以及保存時間,保存時間的概念是用來計算數據新鮮度的,即計算是否過期

所以我們首先要創建多個iframe,來加載多個域名下代理文件,通過HTML5的api postMessage或者之前老的頁面跨域方式互相交互,來通過這個代理的proxy來保存數據

在當前主域名下保存,數據的key的存根,然后實際數據保存在各個子域名下

Ok,那么現在突破了存儲上限,我們要保存一個網頁下來,就要考慮把網頁相關的靜態資源都拉下來,對于網頁相關的資源,有包括js,css,這些都是文本,這些都簡單,只要一個ajax請求過,就可以拿到內容,唯一要考慮的就是安全性就是跨域問題導致js拿不到響應數據,這里只要在CDN節點服務器上設置響應頭為

即可,跨域得到內容

js,就是<script src=”url”></script>這種只要改成<script>遠程拿到的內容</script>即可,css,<link rel=”stylesheet” href=”url”>這種只要改成<style>內容</style>即可

這里只要考慮能匹配到原來html的這些代碼塊即可,只要考慮一個問題,就是js的regexp默認是貪婪模式,所以我們的正則要做到最小匹配,

然后找到html里面對應的內容,替換成為已經保存在localStorage里面的內容即可

那么對于圖片,如何獲得圖片的內容呢?我們知道圖片是rawdata,2進制,首先我們要解決獲取圖片2進制流的問題

然后通過fileReader直接轉換成為base64,既可以保存在本地了,然后替換圖片的src從一個url變成一段base64的字符串即可

然后把整個網頁html里面對應資源替換成為我們特殊標記

LOCALSTORE標記,然后通過遞歸查找算法,從各個子store取得內容,還原平湊成為原來的完整html

然后直接通過document.write來還原原來的頁面

通過這種原理,你可以把一個網站離線化到本地,然后基于singlePage技術,來實現不發任何請求的瀏覽,當然了,這里面還有一些別的技術細節需要處理,具體有哪些坑,且聽我下回分解!!!

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泗洪县| 红河县| 甘孜县| 金阳县| 鄂温| 广宗县| 萨迦县| 利川市| 政和县| 阿勒泰市| 景德镇市| 无棣县| 阿巴嘎旗| 乐昌市| 玉田县| 永德县| 达拉特旗| 宣汉县| 上杭县| 公主岭市| 思茅市| 兴宁市| 晋江市| 灌南县| 历史| 瑞昌市| 九龙城区| 大方县| 含山县| 郑州市| 麻栗坡县| 象山县| 广汉市| 内黄县| 于田县| 辽宁省| 新河县| 筠连县| 平顺县| 山阳县| 大冶市|