在Electron(Atom Shell)应用程序中存储用户设置的位置?

我似乎无法find一个内置的机制来存储用户设置。 我希望电子提供了一种在所有桌面平台上存储用户设置的标准方法。 如果没有先例,我可以自己实现,我只是不想立即跳到一个自定义的解决scheme。 在线研究在这个领域相当稀less。 谢谢!

每个平台对于不同types的数据具有不同的默认位置。 因此,如果您想要将数据存储在基于平台的默认位置,请检查app.getPath(name)

它检索到与name关联的特殊目录或文件的path。

您也可以使用它来区分用户想要保存的数据和应用程序保存的数据,以避免混淆用户目录。

或者,如果您只是将文件存储到特定path,则可以使用app.setPath(name,path)

我用我的Electron应用程序面对了这个特殊的问题,这篇文章激励我写一个名为electron-json-storage的NPM模块。

这个模块允许很容易地从app.getPath('userData')写/读JSON:

 const storage = require('electron-json-storage'); // Write storage.set('foobar', { foo: 'bar' }).then(function() { // Read storage.get('foobar').then(function(object) { console.log(object.foo); // will print "bar" }); }); 

电子并没有给你任何开箱即可。 但是,Electron确实为您提供了一种通过app.getPath API以跨平台方式获取用户数据存储地理位置的方法。

我会说这3个最常见的方法是:

  • localStorage(或任何HTML5存储API)
  • 平坦的JSON文件(这是我做的,我用它的电子configuration )
  • embedded式数据库如IndexedDB,neDB或sqlite

您select哪一个将取决于您的应用程序的需求。 如果您只需要在渲染过程中访问这些数据,那么我只需要使用localStorage 。 大多数情况下,您似乎需要访问main和renderer中的数据,所以JSON文件是有意义的。 如果你正在处理大量的数据或复杂的查询,那么也许数据库是有道理的。 我在这里详细地写了这个。

LocalStorage如何? 如果您需要从浏览器进程访问这些设置,则可能需要编写自己的(或者仅使用实现此function的node.js库)

我发现的最好的方法是将它作为JSON存储在一个简单的文件中。 问题是,如果你将该JSON存储在应用程序目录中,那么当你更新应用程序时,它将被清除。 所以你想把它放在当前操作系统的用户设置的默认目录中。 幸运的是!!!!! 有一个节点开发人员的库,可以帮助你finduserdata目录。 该模块被称为appdirectory ,我已经使用了好几次。 这是非常容易使用。

请参阅APPDIRECTORY这里

有一个新的模块(今天上传)我想build议,让简单的方法来获取和设置JSON文件到这个目录,创build子目录,如果需要,并支持callback和承诺:

https://github.com/ran-y/electron-storage

自述:

安装

 $ npm install --save electron-storage 

用法

 const storage = require('electron-storage'); 

API

storage.get(filePath,cb)

 storage.get(filePath, (err, data) => { if (err) { console.error(err) } else { console.log(data); } }); 

storage.get(文件path)

 storage.get(filePath) .then(data => { console.log(data); }) .catch(err => { console.error(err); }); 

storage.set(filePath,data,cb)

 storage.set(filePath, data, (err) => { if (err) { console.error(err) } }); 

storage.set(filePath,data)

 storage.set(filePath, data) .then(data => { console.log(data); }) .catch(err => { console.error(err); }); 

storage.isPathExists(path,cb)

 storage.isPathExists(path, (itDoes) => { if (itDoes) { console.log('pathDoesExists !') } }); 

storage.isPathExists(path)

 storage.isPathExists(path) .then(itDoes => { if (itDoes) { console.log('pathDoesExists !') } });