@wh1100717
2015-01-19T10:03:40.000000Z
字数 4886
阅读 567
LocalDB
FE
Github Repo: https://github.com/wh1100717/localDB
API Reference: http://localdb.emptystack.net/
LocalDB 为开发者提供简单、易用又强大的浏览器端数据存取接口,其被设计用来为 WEB 应用、手机 H5 应用、网页游戏引擎提供浏览器端持久化存储方案,LocalDB包含以下特性:
LocalDB采用模块化开发的方式,通过requirejs对模块进行加载和控制,目前分为如下模块:
$inc
, $set
, $mul
, $rename
, $unset
, $max
, $min
。$gt
, $gte
, $lt
, $lte
, $ne
, $in
, $nin
$and
, $nor
, $or
, $not
$exists
, $type
$mod
, $regex
$all
, $elemMatch
, $size
$ bower install localdb
$ spm install localdb
通过 bower 安装或者直接下载独立库文件的用户,可以直接在html页面中引用该js文件:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="dist/0.1.0/localdb.js"></script>
</head>
<body>
</body>
<script type="text/javascript">
var db = new LocalDB("foo")
</script>
</html>
LocalDB 支持 requirejs 作为其模块加载器,具体用法如下:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="emaples/require.js"></script>
</head>
<body>
</body>
<script type="text/javascript">
require(['dist/0.1.0/localdb'],function(LocalDB){
var db = new LocalDB("foo")
}
</script>
</html>
LocalDB 支持 seajs 作为其模块加载器,通过 SPM 安装或者直接下载 seajs 版本的库文件的用户可以利用 seajs 来加载 localDB:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="exmaples/sea.js"></script>
</head>
<body>
</body>
<script type="text/javascript">
seajs.use('dist/0.1.0/localdb-seajs.js', function(LocalDB){
var db = new LocalDB("foo")
})
</script>
</html>
// 创建/获取名为`foo`的db
var db = new LocalDB("foo")
// 创建/获取该db中名为`bar`的collection
var collection = db.collection("bar")
// 插入数据
collection.insert({
a: 5,
b: "abc",
c: /hell.*ld/,
d: {e: 4, f: "5"},
g: function(h){return h*3},
i: [1,2,3]
}).then(function(err){
// 查询数据
// 目前支持添加的数据格式为数字、字符串、正则表达式、对象、函数和数组。
collection.find({
// `where`表示查询条件,相当于`select a,b from table where b == "abc"`中的`where`语句。
where: {
a: {$gt: 3, $lt: 10},
b: "abc"
},
// `projection`表示根据查询的条件构造选择数据内容。
projection: {
a:1,
b:1
}
})
}).then(function(data, err){
// 其表示更新`a`的值为5的数据,设置其`b`的值为`new_string`,设置其`i`的值为`[3,2,1]`
collection.update({
$set: {
b: "new_string",
i: [3,2,1]
}
},{
where: {
a: 5
}
})
}).then(function(err){
// 其表示删除`a`的值大于3、小于10并且不等于5的数据。
collection.remove({
where: {
a: {$gt: 3, $lt: 10, $ne: 5}
}
})
})
在 Getting Started 章节中可以看到所有的数据操作都是通过以下方式进行的:
firstFunc()
.then(function(){
secondFunc()
}).then(function(){
thirdFunc()
}).then(function(){
lastFunc()
})
这种编写异步代码的方式实际上就是Promise,具体使用方式请参考 官网 或者文档 JavaScript Promises: There and back again。
如果不想使用 Promise 也可以直接使用回调来进行如下改写:
firstFunc(function(){
secondFunc(function(){
thirdFunc(function(){
lastFunc();
});
});
});
LocalDB中大部分API为异步调用方式,之所以使用异步的方式,是因为底层可能会涉及到采用多种不同的存储引擎,不能保证所有的引擎都具有较快的执行速度及对应的同步接口。由于异步回调固有的缺陷,如果有底层接口需要使用异步方式时,需要一直回溯至最上层并改写为异步接口。
因此对于可能会涉及到异步调用的接口,全部采用异步的方式。
JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。
目前已有的跨域方式请参考 JavaScript跨域总结与解决办法、js中几种实用的跨域方法原理详解
LocalDB通过postMessage实现跨域通信,对其进行了封装,可以通过非常简单的配置来实现跨域数据存储。
假如要将www.tmall.com的数据存储在www.taobao.com的域下,则可以通过以下代码实现。
//域tmall.com下,初始化LocalDB,并指定proxy
new LocalDB('foo',{
proxy: "http://www.taobao.com/getProxy.html"
})
Proxy为 http://www.taobao.com/getProxy.html 所对应的html包含如下初始化代码:
LocalDB.init({
allow: "*.tmall.com",
deny: "omg.tmall.com" //也可以设置拒绝的域名
})
git branch develop-own
来创建一个新分支git checkout develop
切换到新创建的分支git remote add upstream https://github.com/wh1100717/localDB.git
将主干库添加为远端库git remote update
来更新主干库上的最新代码git fetch upstream/master
拉取最新代码到本地git rebase upstream/master
进行本地代码合并npm install
安装项目所需要的库和工具grunt test
来测试修改的内容是否能跑通所有测试用例