【问题标题】:How can i achieve local persistence in my electron app?如何在我的电子应用程序中实现本地持久性?
【发布时间】:2019-05-02 05:27:20
【问题描述】:

我正在构建一个带有角度前端的电子应用程序,它监视计算机上的活动窗口以跟踪用户的活动。但是,我很难弄清楚如何正确保存这些数据。

我一直在做很多研究,看到人们建议使用 IndexedDB/dexie.js、localForage、couchDB、SQLite 等。但我很难真正决定使用哪种技术,因为我无法理解如何实际实施它们在我的电子应用程序中 - 实际电子实现的文档非常稀疏。

我认为我如此挣扎的原因是,创建电子应用程序时可能存在一些我没有正确理解的关键概念。

我认为我在区分 main.ts(电子)是后端而我的 Angular 应用程序是前端时可能是错误的,我应该将它作为一个整体来考虑。也许有人可以详细说明一下?

这个想法让我无法使用像 couchDB 这样的样板文件看起来像这样的东西(放置在 index.html -> 前端):

    <html>
      <head>
          <!-- Include Dexie -->
          <script src="https://unpkg.com/dexie@latest/dist/dexie.js"></script>

          <script>
              //
              // Define your database
              //
              var db = new Dexie("friend_database");
              db.version(1).stores({
                  friends: 'name,shoeSize'
              });

              //
              // Put some data into it
              //
              db.friends.put({name: "Nicolas", shoeSize: 8}).then (function(){
                  //
                  // Then when data is stored, read from it
                  //
                  return db.friends.get('Nicolas');
              }).then(function (friend) {
                  //
                  // Display the result
                  //
                  alert ("Nicolas has shoe size " + friend.shoeSize);
              }).catch(function(error) {
                 //
                 // Finally don't forget to catch any error
                 // that could have happened anywhere in the
                 // code blocks above.
                 //
                 alert ("Ooops: " + error);
              });
          </script>
      </head>
    </html>

这对我来说似乎是个问题,因为我实际上是从我认为的后端获取活动窗口的数据。

为了更好地理解我的问题,这里有一些我认为对回答这个问题很重要的代码的 sn-ps。

首先,我创建了一个 Poller.ts,顾名思义就是民意调查。我用它来不断地让活动窗口在 PC 上运行。

Poller.ts


    import * as EventEmitter from 'events';


    export default class Poller extends EventEmitter {
      private timeout: number;

      constructor(timeout = 5000) {
        super();
        this.timeout = timeout;
      }

      public poll(): void {
        setTimeout(() => this.emit('poll'), this.timeout);
      }

      public onPoll(cb): void {
        this.on('poll', cb);
      }
    }

然后,在我的 Main.ts 中,我将此轮询器与 active-win 库结合使用以获取活动窗口。

Main.ts


    ipcMain.on('tracking:start', (e) => {
      poller.poll();
      (async () => {
        console.log('Starting tracking');
      })();
    });

    ipcMain.on('tracking:stop', () => {
      (async () => {
        console.log('Stopping tracking');
      })();
    });

    poller.onPoll(() => {
      (async () => {
        let activeWindow = await activeWin();
        console.log(activeWindow);
      })();
      poller.poll();
    });

轮询过程由 ipcRenderer 发送的事件从前端启动/停止。

角度组件


    public startTracking() {
        console.log('starting tracking');
        if (this.electronService.isElectronApp) {
          this.electronService.ipcRenderer.send('tracking:start');
        }
      }

      public stopTracking() {
        console.log('stopping tracking');
        if (this.electronService.isElectronApp) {
          this.electronService.ipcRenderer.send('tracking:stop');
        }
      }

因此,根据我的理解,我应该从位于我认为的后端的轮询函数中持久化数据,这与我对上面列出的持久性库的理解不一致。

我希望能够将每个窗口日志存储为单独的条目,并对数据进行一些查询和分类。

所以我希望你们中的任何人都可以阐明我的误解,或者建议一个适合我目的的库。

【问题讨论】:

    标签: angular database electron persistence


    【解决方案1】:

    Electron 文档很少的原因是这些机制不是来自 Electron,它们是常规浏览器技术(即 Chrome、Firefox 等)。您应该在 MDN(Mozilla 开发者网络)上查找您需要的内容:https://developer.mozilla.org。例如,尝试在 Google 上搜索“mdn localstorage”、“mdn indexeddb”、“mdn cachestorage”或“mdn cookie”,您将开始找到有关在本地离线存储内容的主题的文档。

    编辑:请注意,您不能在 Web 浏览器中使用 CouchDB 或 SQLite 之类的东西,而且这些东西也不是 Electron 特定的。您可以搜索“Node.js CouchDB”或“Node.js SQLite”来查找相关资源,因为 Electron 是在 Node.js 之上编写的。

    您可以在 Node.js 项目中使用的任何东西,都可以在 Electron 中使用。类似地,在 Chrome 中可以使用的浏览器技术中,也可以在 Electron 中使用,因为 Electron 将 Chrome 浏览器引擎与 Node.js 结合在一起。

    【讨论】:

    • 是的,我知道这些库实际上都不是 Electron 特定的。但我的问题仍然是,当使用许多建议的 Electron 库时,前端似乎应该负责许多数据库逻辑,这让我很反感。由于主进程是唯一可以访问系统进程的东西,前端应该负责保存这些数据似乎很奇怪。这意味着我必须从 ipcrenderer 向主进程发出一个事件,然后每次轮询活动应用程序时将实际数据返回到前端
    • @JonasMohrPedersen 但是你为什么要那样做呢?您可以直接在渲染器中编写“后端”代码,但这并不意味着您必须将其与 UI 代码混合使用。您仍然可以将这两件事完全分开(例如使用 Redux 或其他东西)。如果您在环境中有这些工具,为什么不使用它们呢?它不像有一个服务器,你不必(反)序列化数据;我会考虑让渲染器中的代码非常好。加!您还可以将引用发送到主渲染器/从主渲染器发送引用,反之亦然。您不必专门使用 IPC。
    猜你喜欢
    • 1970-01-01
    • 2016-05-31
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多