纯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 相关文章推荐
JavaScript 字符串连接性能优化
Dec 20 Javascript
js 遍历json返回的map内容示例代码
Oct 29 Javascript
jquery获取tagName再进行判断
May 29 Javascript
JavaScript生成福利彩票双色球号码
May 15 Javascript
总结JavaScript的正则与其他语言的不同之处
Aug 25 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
Jun 13 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
Jun 25 Javascript
详解vue中computed 和 watch的异同
Jun 30 Javascript
对于input 框限定输入值为浮点型的js代码
Sep 25 Javascript
Vuejs 单文件组件实例详解
Feb 09 Javascript
vue之debounce属性被移除及处理详解
Nov 13 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
Mar 01 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 和 XML: 使用expat函数(三)
2006/10/09 PHP
ajax php 实现写入数据库
2009/09/02 PHP
php读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
php+mysql实现无限级分类
2015/11/11 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
JavaScript 学习笔记(十五)
2010/01/28 Javascript
IE6,IE7下js动态加载图片不显示错误
2010/07/17 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
详细探究ES6之Proxy代理
2016/07/22 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
Python里隐藏的“禅”
2014/06/16 Python
python 重定向获取真实url的方法
2018/05/11 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
pandas 空数据处理方法详解
2019/11/02 Python
德国旅游网站:weg.de
2018/06/03 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
信息专业个人的自我评价
2013/12/27 职场文书
舞蹈毕业生的自我评价
2014/03/05 职场文书
代理人委托书
2014/08/01 职场文书
个人授权委托书
2014/09/15 职场文书
部队反四风对照检查材料
2014/09/26 职场文书
入党团支部推荐意见
2015/06/02 职场文书
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
Python如何识别银行卡卡号?
2021/06/10 Python
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
浅谈MySql整型索引和字符串索引失效或隐式转换问题
2021/11/20 MySQL