更好用的 Electron 数据持久化库 - electron-conf

2,131 阅读1分钟

如果你正在使用 electron-store ,你可能面临一些这样的问题:

  • 通常你只能在主进程中使用,而在渲染进程使用时需要开启 node 集成功能,这是不安全且不被推荐的
  • electron-store 最新版本只支持 ESM 并要求 Electron 30 及以上版本,这给升级工作带来一些困扰(当然通过一些构建工具如 electron-vite 是可以解决的)

electron-conf 是 conf 的一个分支(electron-store 的依赖库)。我们试图在这个库中消除一些目标用户不需要的依赖项和功能,并且仅为 Electron 设计。

  • ✅ 更精简
  • ✅ 只从磁盘读取一次数据,约 100 倍的速度提升 (electron-store 每次 get 时都需要读取磁盘)
  • ✅ 更简单的迁移策略
  • ✅ 更安全更方便的在 Electron 渲染器中使用它(无 nodeIntegration)
  • ✅ 用 TypeScript 编写,支持 CommonJS 和 ESM。适用于 Electron 15.x 及更高版本。
  • ❌ 移除文件监视
  • ❌ 移除文件加密(大多数时候不会用,非常容易被破解,在 Electron 中主要用来存储持久化数据,程序状态,缓存等)

如果你在使用electron-store,基本无需任何改造即可平替到electron-conf

如何使用

安装

$ npm install electron-conf

在主进程使用

import { Conf } from 'electron-conf/main'

const conf = new Conf()

conf.set('foo', '🌈')
console.log(conf.get('foo')) // => 🌈

// Use dot-notation to access nested properties
conf.set('a.b', true)
console.log(conf.get('a')) // => {b: true}

conf.delete('foo')
console.log(conf.get('foo')) // => undefined

在渲染进程使用

  1. 在主进程中注册一个监听器,以便您可以在渲染器进程中使用它。
import { Conf } from 'electron-conf/main'

const conf = new Conf()

conf.registerRendererListener()
  1. 暴露 Conf API 给渲染进程使用

你可以在指定的预加载脚本中暴露它:

import { exposeConf } from 'electron-conf/preload'

exposeConf()

或者在主进程中全局暴露给所有渲染进程使用:

import { useConf } from 'electron-conf/main'

useConf()
  1. 在渲染器进程中使用
import { Conf } from 'electron-conf/renderer'

const conf = new Conf()

await conf.set('foo', 1)

注意: 使用方式与主进程相同。不同之处在于所有 API 都是基于 Promise 的。

迁移

electron-conf 使用比 electorn-store 更简单的迁移策略。

你可以自定义版本并执行迁移配置的操作。electron-conf 实例化时会与配置文件中的版本号进行比较,进行更高版本的迁移操作。

注意:迁移版本必须大于 0。每次迁移都会定义一个新版本,并在之前的版本上递增。

import { Conf } from 'electron-conf/main'

const migrations = [
  {
    version: 1,
    hook: (conf, version): void => {
      conf.set('foo', 'a')
      console.log(`migrate from ${version} to 1`) // migrate from 0 to 1
    }
  },
  {
    version: 2,
    hook: (conf, version): void => {
      conf.set('foo', 'b')
      console.log(`migrate from ${version} to 2`) // migrate from 1 to 2
    }
  }
]

const conf = new Conf({ migrations })

订阅

electron-conf 和 electorn-store 一样支持订阅指定 key 或者 整个配置的变化。

const unsubscribe = conf.onDidChange('foo',  (newValue, oldValue) => {

})

unsubscribe()

结语

你可以通过以下链接了解更多有关于 electron-conf 信息:

github.com/alex8088/el…