纯js实现无限空间大小的本地存储


Posted in Javascript onJune 18, 2015

好久没有写博客了,想到2年前答应要放出源代码的也没放出来,最近终于有空先把纯js实现无限空间大小的本地存储的功能开源了,

项目地址https://github.com/xueduany/localstore,

demo见http://xueduany.github.io/localstore/,

下面给大家简单说说大概原理,具体细节和异常处理后面有机会在单独说

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

纯js实现无限空间大小的本地存储

所以你懂的,你可以利用多个子域名的localStorage是不互相依赖的性质,来通过多个子域名的localStorage来设计实现一个storePool,突破上限

那么,在实际API存储的时候,就不是对本地localStorage的保存了

这有点类似一个Manager模式,就是你告诉仓库管理员你要保存什么,仓库管理员给你一把钥匙,然后你拿着钥匙去对应的仓库把你的东西托管起来,管理员再给你一个token凭证,以后你只要拿着这个凭证就可以把的保存的东西取出来

最终用户不用care我的数据保存在哪里,只要实现类似localStorage的API即可

然后设计一个js对象来充当仓库管理员的角色即可,这个管理员需要支持有多少个token,对应的保存的东西寄放在哪里,就是寄放在哪个子域名下的空间里面,那么我们需要设计实现这么一套数据结构

纯js实现无限空间大小的本地存储

对应的key下面是存放它存在的仓库的地址,以及保存时间,保存时间的概念是用来计算数据新鲜度的,即计算是否过期

所以我们首先要创建多个iframe,来加载多个域名下代理文件,通过HTML5的api postMessage或者之前老的页面跨域方式互相交互,来通过这个代理的proxy来保存数据

纯js实现无限空间大小的本地存储

在当前主域名下保存,数据的key的存根,然后实际数据保存在各个子域名下

Ok,那么现在突破了存储上限,我们要保存一个网页下来,就要考虑把网页相关的静态资源都拉下来,对于网页相关的资源,有包括js,css,这些都是文本,这些都简单,只要一个ajax请求过,就可以拿到内容,唯一要考虑的就是安全性就是跨域问题导致js拿不到响应数据,这里只要在CDN节点服务器上设置响应头为

纯js实现无限空间大小的本地存储

即可,跨域得到内容

js,就是<script src=”url”></script>这种只要改成<script>远程拿到的内容</script>即可,css,<link rel=”stylesheet” href=”url”>这种只要改成<style>内容</style>即可

这里只要考虑能匹配到原来html的这些代码块即可,只要考虑一个问题,就是js的regexp默认是贪婪模式,所以我们的正则要做到最小匹配,

纯js实现无限空间大小的本地存储

然后找到html里面对应的内容,替换成为已经保存在localStorage里面的内容即可

那么对于图片,如何获得图片的内容呢?我们知道图片是rawdata,2进制,首先我们要解决获取图片2进制流的问题

纯js实现无限空间大小的本地存储

然后通过fileReader直接转换成为base64,既可以保存在本地了,然后替换图片的src从一个url变成一段base64的字符串即可

然后把整个网页html里面对应资源替换成为我们特殊标记

纯js实现无限空间大小的本地存储

LOCALSTORE标记,然后通过递归查找算法,从各个子store取得内容,还原平凑成为原来的完整html

纯js实现无限空间大小的本地存储

然后直接通过document.write来还原原来的页面

通过这种原理,你可以把一个网站离线化到本地,然后基于singlePage技术,来实现不发任何请求的浏览,当然了,这里面还有一些别的技术细节需要处理,具体有哪些坑,且听我下回分解!!!

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
Extjs的FileUploadField文件上传出现了两个上传按钮
Apr 29 Javascript
javascript实现的图片切割多块效果实例
May 07 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
Nov 24 Javascript
详解JavaScript基于面向对象之继承实例
Dec 16 Javascript
JS实现的跨浏览器解析XML文件实例
Jun 21 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
Dec 20 Javascript
JS自定义函数实现时间戳转换成date的方法示例
Aug 27 Javascript
浅谈Node异步编程的机制
Oct 18 Javascript
Node.js中sequelize时区的配置方法
Dec 10 Javascript
jQuery中实现text()的方法
Apr 04 jQuery
Vue 理解之白话 getter/setter详解
Apr 16 Javascript
JS数组Reduce方法功能与用法实例详解
Apr 29 Javascript
JS实现当前页居中分页效果的方法
Jun 18 #Javascript
javascript中Date()函数在各浏览器中的显示效果
Jun 18 #Javascript
javaScript中Math()函数注意事项
Jun 18 #Javascript
理解Javascript的动态语言特性
Jun 17 #Javascript
你所不了解的javascript操作DOM的细节知识点(一)
Jun 17 #Javascript
jQuery实现复选框批量选择与反选的方法
Jun 17 #Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 #Javascript
You might like
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
javascript 短路法代码精简
2009/08/20 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
python开发之thread线程基础实例入门
2015/11/11 Python
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
python批量赋值操作实例
2018/10/22 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
Pytorch之contiguous的用法
2019/12/31 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
英国最大的海报商店:GB Posters
2018/03/20 全球购物
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
就业推荐自我鉴定
2013/10/06 职场文书
物流专业求职计划书
2014/01/10 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
教你部署vue项目到docker
2022/04/05 Vue.js
5个实用的JavaScript新特性
2022/06/16 Javascript