Electron存储简单数据和用户首选项推荐用electron-store

作者: xusx 分类: Electron 发布时间: 2019-12-01 21:21

electron-store1可以用来保存Electron应用程序或模块的简单数据持久性-保存和加载用户首选项,应用程序状态,缓存等。

1https://github.com/sindresorhus/electron-store

Electron没有内置的方法来保留用户首选项和其他数据。electron-store模块可以为您解决该问题,因此您可以专注于构建应用程序。 数据保存在app.getPath('userData')2中的JSON文件中。您可以在主进程和渲染器进程中直接使用此模块。

2https://electronjs.org/docs/api/app#appgetpathname

app.getPath(name)-储存你应用程序设置文件的文件夹,默认是 appData 文件夹附加应用的名称。

appData-当前用户的应用数据文件夹,默认对应:

%APPDATA% Windows 中
$XDG_CONFIG_HOME or ~/.config Linux 中
~/Library/Application Support macOS 中

一、为什么不使用window.localStorage

  1. localStorage仅在浏览器进程(渲染进程)中起作用。
  2. localStorage的容错性不是很高,因此,如果您的应用遇到错误并意外退出,则可能会丢失数据。
  3. localStorage仅支持持久字符串。 此模块支持任何JSON支持的类型。
  4. localStorage不是很安全,可能是由于xss攻击而泄漏信息。
  5. electron-store模块的API更好。 您可以设置并获取嵌套属性。 您可以设置默认的初始配置。

二、关于vuex和storage的区别

  1. vuex存储在内存,localstorage则以文件的方式存储在本地,electron-store数据存储卸载应用之后依然存在。
  2. 应用场景:vuex用于组件之间的传值,localstorage则主要用于不同页面之间的传值。
  3. 永久性:当刷新页面时vuex存储的值会丢失,localstorage不会。

注:很多同学觉得用localstorage可以代替vuex, 对于不变的数据确实可以,但是当两个组件共用一个数据源(对象或数组)时,如果其中一个组件改变了该数据源,希望另一个组件响应该变化时,localstorage无法做到,原因就是区别1。

三、安装electron-store

$ npm install electron-store

注:需要Electron 5或更高版本。如果安装失败,可以换成命令cnpm install electron-store(前提是安装了cnpm)

四、electron-store用法

const Store = require('electron-store');

const store = new Store();

store.set('unicorn', '🦄');
console.log(store.get('unicorn'));
//=> '🦄'

// 使用点表示法访问嵌套属性
store.set('foo.bar', true);
console.log(store.get('foo'));
//=> {bar: true}

store.delete('unicorn');
console.log(store.get('unicorn'));
//=> undefined

五、electron-store的API

更改是原子写入磁盘的,因此,如果进程在写入过程中崩溃,则不会破坏现有配置。

1、Store(options?)

返回:一个新实例。

options
Type: object

defaults
Type: object

// Default values for the store items.
// 注意:默认值将覆盖schema选项中的默认键。

schema
type: object

注:JSON Schema(https://json-schema.org/) 就是用来定义json数据约束的一个标准。根据这个约定模式,交换数据的双方可以理解json数据的要求和约束,也可以据此对数据进行验证,保证数据交换的正确性。目前最新的Json-schema版本是draft 7,发布于2018-03-19。

在后台,JSON模式(JSON Schema)验证器ajv3用于验证您的配置。 我们使用JSON Schema draft-074并支持所有验证关键字5和格式6

您应该将模式定义为一个对象,其中每个键是数据属性的名称,每个值是用于验证该属性的JSON模式。 在这里查看更多7

3https://github.com/epoberezkin/ajv

4http://json-schema.org/latest/json-schema-validation.html

5https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md

6https://github.com/epoberezkin/ajv#formats

7https://json-schema.org/understanding-json-schema/reference/object.html#properties

例如:

const Store = require('electron-store');

const schema = {
	foo: {
		type: 'number',
		maximum: 100,
		minimum: 1,
		default: 50
	},
	bar: {
		type: 'string',
		format: 'url'
	}
};

const store = new Store({schema});
console.log(store.get('foo'));
//=> 50

store.set('foo', '1');
// [Error: Config schema violation: `foo` should be number]

注意:如果设置了默认值,则默认值将被覆盖。

migrations
Type: object

注:在解决此问题(https://github.com/sindresorhus/conf/issues/92)之前,请不要使用此功能。

每当升级版本时,您都可以使用迁移(migrations)对存储执行操作。
迁移对象应包含“版本”:处理程序的键值对。 版本也可以是semver range(https://github.com/npm/node-semver#ranges)。例如:

const Store = require('electron-store');

const store = new Store({
	migrations: {
		'0.0.1': store => {
			store.set('debugPhase', true);
		},
		'1.0.0': store => {
			store.delete('debugPhase');
			store.set('phase', '1.0.0');
		},
		'1.0.2': store => {
			store.set('phase', '1.0.2');
		},
		'>=2.0.0': store => {
			store.set('phase', '>=2.0.0');
		}
	}
});

name
Type: string
Default: config
存储文件的名称(不带扩展名)。

如果您想要为应用程序提供多个存储文件,这将很有用。 或者,如果您要制作一个可持久使用的Electron模块以保留一些数据,则在这种情况下,您不应使用名称config。

cwd
Type: string
Default: app.getPath('userData')

存储文件位置。 除非绝对必要,否则请勿指定! 默认情况下,它将通过遵循系统约定来选择最佳位置。 您很可能会误解并惹恼用户。

如果是相对路径,则相对于默认cwd。 例如在macOS 中,{cwd:'unicorn'}将在〜/Librar/Application\ Support/App\ Name/unicorn中生成一个存储文件。

encryptionKey
Type: string | Buffer | TypedArray | DataView
Default: undefined

如果加密密钥以安全方式(不是纯文本)存储在Node.js应用程序中,则可用于保护敏感数据。 例如,通过使用node-keytar(https://github.com/atom/node-keytar)安全地存储加密密钥,或向用户询问加密密钥(密码),然后将其存储在变量中。

除了安全性,这还可以用于混淆。 如果用户浏览config目录并找到配置文件,因为它只是一个JSON文件,因此他们可能会倾向于修改它。 通过提供加密密钥,该文件将被混淆,这有望阻止任何用户这样做。

它还具有确保配置文件完整性的好处。 如果以任何方式更改文件,则解密将不起作用,在这种情况下,存储将仅重置为默认状态。

指定后,将使用aes-256-cbc加密算法对存储进行加密。

fileExtension
Type: string
Default: json

配置文件的扩展名。

通常,您不需要这样做,但是如果您想与带有可与您的应用程序关联的自定义文件扩展名的文件进行交互,则可能会很有用。 这些可能是简单的保存/导出/首选项文件,旨在在应用程序外部共享或保存。

clearInvalidConfig
Type: boolean
Default: true

如果读取配置文件导致SyntaxError(语法错误),则清除该配置。 这是一个很好的默认设置,因为该配置文件不适合手动编辑,因此通常意味着该配置已损坏,用户对此无能为力。 但是,如果让用户直接编辑配置文件,则可能会发生错误,并且当配置无效而不是清除时引发错误可能更有用。 禁用此选项将使其在无效的配置上引发SyntaxError而不是清除。

serialize
Type: Function
Default: value => JSON.stringify(value, null, '\t')

写入配置文件时将配置对象序列化为UTF-8字符串的函数。您通常不需要此功能,但是如果您想使用JSON以外的格式,则可能会很有用。

deserialize
Type: Function
Default: JSON.parse

读取配置文件时从UTF-8字符串反序列化配置对象的功能。您通常不需要此功能,但是如果您想使用JSON以外的格式,则可能会很有用。

accessPropertiesByDotNotation
Type: boolean
Default: true

通过点表示法访问嵌套属性。 例如:

const Store = require('electron-store');

const store = new Store();
store.set({
	foo: {
		bar: {
			foobar: '🦄'
		}
	}
});
console.log(store.get('foo.bar.foobar'));
//=> '🦄'

另外,您可以将此选项设置为false,以便将整个字符串视为一个键。

const store = new Store({accessPropertiesByDotNotation: false});
store.set({
	`foo.bar.foobar`: '🦄'
});
console.log(store.get('foo.bar.foobar'));
//=> '🦄'

watch
Type: boolean
Default: false

监视配置文件中的所有更改,如果已设置,则调用onDidChange的回调。 如果有多个进程更改同一个配置文件,这将很有用。当前,此选项在macOS上的Node.js 8上不起作用。

2、Instance

您可以在键中使用点符号来访问嵌套属性。该实例(Instance)是可迭代的,因此您可以在for…of循环中直接使用它。

.set(key, value)
设置一个项目。该值必须是JSON可序列化的。 尝试将类型设置为undefined,function或symbol会导致TypeError。

.set(object)
一次设置多个项目。

.get(key, [defaultValue])
获取一个项目或defaultValue(如果该项目不存在)。

.reset(…keys)
将项目重置为其默认值(由defaults或schema选项定义)。

.has(key)
检查项目是否存在。

.delete(key)
删除项目。

.clear()
删除所有项目。

.onDidChange(key, callback)
callback(newValue, oldValue) => {}

监视给定的键,对任何更改调用回调。 第一次设置键时,oldValue将是不确定的,而删除键时,newValue将是不确定的。

事件仅在同一过程中触发。 因此,如果在渲染器进程中触发事件,则不会在主进程中获得事件。 参见#39(https://github.com/sindresorhus/electron-store/issues/39)。

.onDidAnyChange(callback)
callback(newValue, oldValue) => {}

监视整个配置对象,对任何更改调用回调。 oldValue和newValue将分别是更改前后的配置对象。 您必须将oldValue与newValue进行比较,以了解发生了什么变化。

.size
获取项目总个数。

.store
获取所有数据作为对象或将当前数据替换为对象:

conf.store = {
	hello: 'world'
};

.path
获取存储文件的路径。

.openInEditor()
在用户的编辑器中打开存储文件。

六、FAQ

1、我可以使用YAML或其他序列化格式吗?

只要表示形式与utf8编码兼容,就可以使用serialize和反序列化选项来自定义配置文件的格式。使用YAML的示例:

const Store = require('electron-store');
const yaml = require('js-yaml');

const store = new Store({
	fileExtension: 'yaml',
	serialize: yaml.safeDump,
	deserialize: yaml.safeLoad
});

七、相关

  1. electron-utila – 开发Electron应用程序和模块的有用实用程序
  2. electron-debugb – 向您的Electron应用程序添加有用的调试功能
  3. electron-context-menuc – Electron应用程序的上下文菜单
  4. electron-dld -Electron应用程序的简化文件下载
  5. electron-unhandlede – 捕获未处理的错误并承诺在您的Electron应用程序中被拒绝
  6. electron-reloaderf – 开发过程中Electron应用程序的简单自动重新加载
  7. electron-serveg – 适用于Electron应用程序的静态文件服务
  8. confh – 为您的应用程序或模块进行简单的配置处理

ahttps://github.com/sindresorhus/electron-util
bhttps://github.com/sindresorhus/electron-debug
chttps://github.com/sindresorhus/electron-context-menu
dhttps://github.com/sindresorhus/electron-dl
ehttps://github.com/sindresorhus/electron-unhandled
fhttps://github.com/sindresorhus/electron-reloader
ghttps://github.com/sindresorhus/electron-serve
hhttps://github.com/sindresorhus/conf

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

一条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注