[关闭]
@wh1100717 2015-01-19T10:03:40.000000Z 字数 4886 阅读 567

LocalDB -- Browser Storage Framework

LocalDB FE


spm package Build Status Coverage Status MIT License

介绍


Github Repo: https://github.com/wh1100717/localDB

API Reference: http://localdb.emptystack.net/

LocalDB 为开发者提供简单、易用又强大的浏览器端数据存取接口,其被设计用来为 WEB 应用、手机 H5 应用、网页游戏引擎提供浏览器端持久化存储方案,LocalDB包含以下特性:

整体架构

LocalDB采用模块化开发的方式,通过requirejs对模块进行加载和控制,目前分为如下模块:

如何使用


Installation By Bower

  1. $ bower install localdb

Installation By SPM

  1. $ spm install localdb

通过 bower 安装或者直接下载独立库文件的用户,可以直接在html页面中引用该js文件:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <script type="text/javascript" src="dist/0.1.0/localdb.js"></script>
  5. </head>
  6. <body>
  7. </body>
  8. <script type="text/javascript">
  9. var db = new LocalDB("foo")
  10. </script>
  11. </html>

LocalDB 支持 requirejs 作为其模块加载器,具体用法如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <script type="text/javascript" src="emaples/require.js"></script>
  5. </head>
  6. <body>
  7. </body>
  8. <script type="text/javascript">
  9. require(['dist/0.1.0/localdb'],function(LocalDB){
  10. var db = new LocalDB("foo")
  11. }
  12. </script>
  13. </html>

LocalDB 支持 seajs 作为其模块加载器,通过 SPM 安装或者直接下载 seajs 版本的库文件的用户可以利用 seajs 来加载 localDB

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <script type="text/javascript" src="exmaples/sea.js"></script>
  5. </head>
  6. <body>
  7. </body>
  8. <script type="text/javascript">
  9. seajs.use('dist/0.1.0/localdb-seajs.js', function(LocalDB){
  10. var db = new LocalDB("foo")
  11. })
  12. </script>
  13. </html>

Getting Started

  1. // 创建/获取名为`foo`的db
  2. var db = new LocalDB("foo")
  3. // 创建/获取该db中名为`bar`的collection
  4. var collection = db.collection("bar")
  5. // 插入数据
  6. collection.insert({
  7. a: 5,
  8. b: "abc",
  9. c: /hell.*ld/,
  10. d: {e: 4, f: "5"},
  11. g: function(h){return h*3},
  12. i: [1,2,3]
  13. }).then(function(err){
  14. // 查询数据
  15. // 目前支持添加的数据格式为数字、字符串、正则表达式、对象、函数和数组。
  16. collection.find({
  17. // `where`表示查询条件,相当于`select a,b from table where b == "abc"`中的`where`语句。
  18. where: {
  19. a: {$gt: 3, $lt: 10},
  20. b: "abc"
  21. },
  22. // `projection`表示根据查询的条件构造选择数据内容。
  23. projection: {
  24. a:1,
  25. b:1
  26. }
  27. })
  28. }).then(function(data, err){
  29. // 其表示更新`a`的值为5的数据,设置其`b`的值为`new_string`,设置其`i`的值为`[3,2,1]`
  30. collection.update({
  31. $set: {
  32. b: "new_string",
  33. i: [3,2,1]
  34. }
  35. },{
  36. where: {
  37. a: 5
  38. }
  39. })
  40. }).then(function(err){
  41. // 其表示删除`a`的值大于3、小于10并且不等于5的数据。
  42. collection.remove({
  43. where: {
  44. a: {$gt: 3, $lt: 10, $ne: 5}
  45. }
  46. })
  47. })

Promise及异步

Getting Started 章节中可以看到所有的数据操作都是通过以下方式进行的:

  1. firstFunc()
  2. .then(function(){
  3. secondFunc()
  4. }).then(function(){
  5. thirdFunc()
  6. }).then(function(){
  7. lastFunc()
  8. })

这种编写异步代码的方式实际上就是Promise,具体使用方式请参考 官网 或者文档 JavaScript Promises: There and back again

如果不想使用 Promise 也可以直接使用回调来进行如下改写:

  1. firstFunc(function(){
  2. secondFunc(function(){
  3. thirdFunc(function(){
  4. lastFunc();
  5. });
  6. });
  7. });

LocalDB中大部分API为异步调用方式,之所以使用异步的方式,是因为底层可能会涉及到采用多种不同的存储引擎,不能保证所有的引擎都具有较快的执行速度及对应的同步接口。由于异步回调固有的缺陷,如果有底层接口需要使用异步方式时,需要一直回溯至最上层并改写为异步接口。

因此对于可能会涉及到异步调用的接口,全部采用异步的方式。

跨域数据存取技术实现

JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。

目前已有的跨域方式请参考 JavaScript跨域总结与解决办法js中几种实用的跨域方法原理详解

LocalDB通过postMessage实现跨域通信,对其进行了封装,可以通过非常简单的配置来实现跨域数据存储。

假如要将www.tmall.com的数据存储在www.taobao.com的域下,则可以通过以下代码实现。

  1. //域tmall.com下,初始化LocalDB,并指定proxy
  2. new LocalDB('foo',{
  3. proxy: "http://www.taobao.com/getProxy.html"
  4. })

Proxy为 http://www.taobao.com/getProxy.html 所对应的html包含如下初始化代码:

  1. LocalDB.init({
  2. allow: "*.tmall.com",
  3. deny: "omg.tmall.com" //也可以设置拒绝的域名
  4. })

如何贡献代码

  1. Fork LocalDB
    1. 将Fork后的LocalDB项目clone到本地
    2. 命令行执行 git branch develop-own 来创建一个新分支
    3. 执行 git checkout develop 切换到新创建的分支
    4. 执行 git remote add upstream https://github.com/wh1100717/localDB.git 将主干库添加为远端库
    5. 执行 git remote update 来更新主干库上的最新代码
    6. 执行 git fetch upstream/master 拉取最新代码到本地
    7. 执行 git rebase upstream/master 进行本地代码合并
  2. 项目根目录执行 npm install 安装项目所需要的库和工具
  3. 修改源码或者测试用例
  4. 执行 grunt test 来测试修改的内容是否能跑通所有测试用例
  5. 如果测试通过,则将代码提交到remote
  6. 在Github你Fork的项目中有一个pull request按钮,点击提交代码合并

TODO

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注