Lndb
lndb 是基于本地文件系统封装的一套灵活的持久化存储数据库, 支持 Node,Electron 等.
GitHub: https://github.com/yansenlei/lndb
使用文件系统作为基础存储方式, 并在上层读写时提供灵活的插件机制, 这意味着你可以根据自己的需求定制读写功能, 详细信息查看插件机制.
安装
$ NPM install lndb
使用
- const LNDB = require('lndb')
- const db = new LNDB('your/path')
- // 初始类型
- const pg = db.init('page')
- // 写入数据
- pg.set('key', {
- hello: 'lndb!'
- })
- // 读取类型信息
- pg.get('key')
- // 删除指定 key 的缓存
- pg.remove('key')
- // 清空类型下所有缓存
- pg.clear()
读写信息说明
默认情况下不论存入何种数据类型, 通过. get(key) 获取到的都是一个文件结构, 这是为了可以自由的获取文件信息.
如上面举例那样的 Object 类型数据默认存入 data.JSON 中:
__lndb__/page/
└── key
└── data.JSON
你通过. get(key) 获取到的数据像这样:
- {
- "data.json": {
- "path": "pro/__lndb__/page/key/data.json"
- },
- "data": {
- "hello": "lndb!"
- }
- }
如果使用内置插件内的 unzip 这样的插件来存入文件, 文件树像这样:
__lndb__/page/
└── key
└── files
├── index.html
└── about.HTML
你通过. get(key) 获取到的数据像这样:
- {
- "files": {
- "path": "pro/__lndb__/page/key/files/",
- "child": {
- "index.html": {
- "path": "pro/__lndb__/page/key/files/index.html"
- },
- "about.html": {
- "path": "pro/__lndb__/page/key/files/about.html"
- }
- }
- }
- }
如果存入数据是如上面举例那样的 Object 类型, 在读取时会默认加载数据信息可以通过 get(key).data 获取, 如果需要更灵活的操作数据信息可以使用 lodash 插件.
由于使用的是文件命名, 所以命名上对符号 (\ /) 是很敏感的, 虽然程序会默认使用__lndb__来替换敏感符号后再命名文件, 但是希望你在使用的时候注意规避敏感符号以保证程序正常运行.
插件机制
也许默认的读写操作并不能满足你的需求, 值得一提的是, Lndb 的核心是可以灵活的扩展读写功能, 你可以引入符合标准的插件来替换现有的读写功能:
- const demoPlugin = require('demo-plugin')
- // add plugin
- db.use('demo-plugin', demoPlugin, { "options": true})
- const pg = db.init('page')
- pg.set('key', { hello: 'lndb!'}, {
- name: 'demo-plugin',
- options: {}
- })
- .use(name, plugin, options)
name 唯一名称
plugin 插件对象
options 插件参数
.set/.get(k, v, {name, options})
name 唯一名称
options 插件参数, 替换 db.use() 时的预制参数
插件规范
现在你可以根据自己的需求编写自己的读取方式, 但是你必须遵循必要的规范, 插件模板看起来像这样:
- module.exports = {
- install(Ln, params = {}, options = {}){
- // 你的自定义操作
- // 调用文件获取
- Ln.fls.get(id)
- // 调用文件写入
- Ln.fls.set(params.id, params.value)
- // 获取当前数据保存路径
- Ln.fls.datapath
- return true
- }
- }
目前插件允许你在 set(),get() 上做自定义操作.
插件内是一个对象, 对象内函数名为 install, 函数带有三个参数:
install(Ln, params, options)
Ln 当前读写上下文
params 读写时的参数 {id, value}
options 传入插件的配置信息
内置插件
内置插件默认已经存在于系统插件列表中, 可以在. get() .set() 直接使用
- <details>
- <summary>
- <b>
- lodash
- </b>
- <p>
读取扩展, 使用 lodash 插件灵活读写, 该插件参考了 lowdb 的使用方式, 这可以很灵活的处理单个文件, 具体参考 lodash 文档 https://lodash.com/
- </p>
- </summary>
- const pg = db.init('page')
- const _ = pg.get('key', ['lodash'])
- _.setState({
- hello: 'lndb!'
- }).write()
- _.getState() // {
- hello: 'lndb!'
- }
- _.has("hello").value() // true
- _.update("hello", n => n.toUpperCase()).write() // update -> {
- hello: 'LNDB!!'
- }
- lodash plugin API
- _.setState()
写入数据到实例中
_.getState()
获取当前实例的数据
_.update()
更新数据
_.read()
读取磁盘中的数据到实例, 返回实例
_.write()
所有写入操作需要调用. write() 后才写入磁盘
- </details>
- <details>
- <summary>
- <b>unzip</b>
- <p>
写入扩展, 使用 unzip 写入 zip 文件时解压到指定目录下, 意味着可以通过. get() 方法获取到解压后的路径, 便可使用里面的文件
- </p>
- </summary>
- pg.set('key', value, {
- name: 'unzip'
- })
- pg.get('key')
- value <Buffer> | <Base64>
- </details>
- License
目前还有需要优化的地方, 欢迎大佬指正.
如果你有任何意见或者想贡献本项目, 欢迎提交 Issues 或 PR.
MIT - https://github.com/yansenlei
来源: http://www.jianshu.com/p/7b469c401d4e