1https://github.com/sindresorhus/electron-store
electron-store
1可以用來保存Electron
應用程序或模塊的簡單數據持久性-保存和加載用戶首選項,應用程序狀態,緩存等。
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
- localStorage僅在瀏覽器進程(渲染進程)中起作用。
- localStorage的容錯性不是很高,因此,如果您的應用遇到錯誤並意外退出,則可能會丟失數據。
- localStorage僅支持持久字符串。 此模塊支持任何JSON支持的類型。
- localStorage不是很安全,可能是由於xss攻擊而泄漏信息。
electron-store
模塊的API更好。 您可以設置並獲取嵌套屬性。 您可以設置默認的初始配置。
二、關於vuex和storage的區別
- vuex存儲在內存,localstorage則以文件的方式存儲在本地,electron-store數據存儲卸載應用之后依然存在。
- 應用場景:vuex用於組件之間的傳值,localstorage則主要用於不同頁面之間的傳值。
- 永久性:當刷新頁面時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
});
七、相關
- electron-utila – 開發Electron應用程序和模塊的有用實用程序
- electron-debugb – 向您的Electron應用程序添加有用的調試功能
- electron-context-menuc – Electron應用程序的上下文菜單
- electron-dld -Electron應用程序的簡化文件下載
- electron-unhandlede – 捕獲未處理的錯誤並承諾在您的Electron應用程序中被拒絕
- electron-reloaderf – 開發過程中Electron應用程序的簡單自動重新加載
- electron-serveg – 適用於Electron應用程序的靜態文件服務
- 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