首页 > 解决方案 > 在 Electron 渲染器进程中持久化 nedb 到磁盘(Webpack/Electron/nedb 配置问题)

问题描述

问题

我正在尝试在电子渲染器进程中使用一个名为nedb的纯 JS 数据库。它使用其中的字段browser交换基于浏览器的存储系统。这导致我的数据库实际上没有被持久化到文件中。package.json

背景

我使用 Next.js 作为我的视图框架,它的 Webpack 是为"target": "electron-renderer"渲染线程配置的。这显然会导致 Webpack 处理这些浏览器指令,即使渲染器进程应该可以访问浏览器和 Node API。这种行为并没有真正记录在案,所以我不知道如何覆盖它。

我试过的

我已经确认,如果我手动编辑browser的本地副本上的字段node_modules/nedb/package.json,问题就会消失。

作为一种临时的解决方法,我已经指出了我自己的 fork 就是nedb这样做的。但这很不令人满意。

其他研究

奇怪的是,这似乎不是 electron-vue 的问题,它的文档明确展示nedb从渲染器进程中的使用。该框架确实似乎"target": "electron-renderer"其 Webpack 配置中使用。

有没有解决这个问题的方法,也许是通过 Webpack 配置?

标签: javascriptwebpackelectronnext.jsnedb

解决方案


您不需要在渲染器进程上运行数据库,而是可以在主进程上运行您想要的其他数据库,如 sql、sqlite、mongodb 等。

如果您不介意切换数据库,以下是实现此目的的方法。在 Electron 中存在一个名为 ipcMain 和 ipcRenderer 的类,这些类用于使渲染器进程和主进程通信。您可以使用 ipc 发送/接收任何类型的数据。

这是一个例子:

渲染器.js

const btnSave = document.getElementById('btn-save')

// Get any data from forms, etc


btn.addEventListener('click', () => {
     // ipcRender sends the data via 'receive-data-to-save-in-database' channel, you
     // you can send any type of data, and have has many args you want. In this case I 
     // sent a a empty object
     ipcRenderer.send('receive-data-to-save-in-database', {})              
})

主.js

// ipcMain listens to channel 'receive-data-to-save-in-database'
ipcMain.on('receive-data-to-save-in-database', (event, args) => {
    // Code to save in database
    // The empty object will be received in args parameter
}) 

这不是您想要的,而是一种解决方法。

欲了解更多信息,我建议你去:

ipcRenderer 文档 ipcMain 文档


推荐阅读