纯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 相关文章推荐
初学prototype,发个JS接受URL参数的代码
Sep 25 Javascript
document.forms用法示例介绍
Jun 26 Javascript
JavaScript实现文字与图片拖拽效果的方法
Feb 16 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
Apr 30 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
Jun 10 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
Jun 23 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 Javascript
微信小程序实现定位及到指定位置导航的示例代码
Aug 20 Javascript
详解JavaScript修改注册表的方法
Jan 05 Javascript
vue+iview使用树形控件的具体使用
Nov 02 Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 Javascript
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
Apr 11 Vue.js
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
用PHP实现WEB动态网页静态
2006/10/09 PHP
在PWS上安装PHP4.0正式版
2006/10/09 PHP
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
js 设置缓存及获取设置的缓存
2014/05/08 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
2016/07/09 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
简单介绍Python中的几种数据类型
2016/01/02 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
python hashlib加密实现代码
2019/10/17 Python
python 实现超级玛丽游戏
2020/11/25 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
strstr()的简单实现
2013/09/26 面试题
金山毒霸系列的笔试题
2013/04/13 面试题
C#笔试题集合
2013/06/21 面试题
绿色学校实施方案
2014/03/31 职场文书
企业指导教师评语
2014/04/28 职场文书
反对邪教标语
2014/06/30 职场文书
党的群众路线教育实践活动总结
2014/10/30 职场文书
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
安全教育培训制度
2015/08/06 职场文书
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS