在电子中是在 ipcRenderer 或 ipcMain 中完成的 fs 操作

Posted

技术标签:

【中文标题】在电子中是在 ipcRenderer 或 ipcMain 中完成的 fs 操作【英文标题】:In electron are fs operations done in ipcRenderer or ipcMain 【发布时间】:2018-09-08 04:50:13 【问题描述】:

目前我在front/script/index.js (ipcRenderer) 中读取文件

 readTitles('./data').map((title, dir) => 
    el = document.createElement("li");
    text = document.createTextNode(`$title.split('.md')[0]`);
    el.appendChild(text)
    readFileContent(dir, el)
    document.getElementById('titles').appendChild(el)
)

然后当我需要创建一个文件时,我要求 ipcMain 来做它

   form.addEventListener('submit', function(e)
        e.preventDefault()
        ipcRenderer.send(NEW_DOCUMENT_SAVE_NEEDED,  // alerting ./main.js
            fileName: e.target[0].value
          )
        console.log(e.target[0].value)
    )

基本上来回走动

ipcMain.on(NEW_DOCUMENT_SAVE_NEEDED, (event, fileName) => 
        fs.writeFile(`./$fileName.md`, "Hey there!", function(err) 
            if(err)  return console.log(err); 
            console.log("The file was saved!");

        );
        window.webContents.send(FILE_CREATED, 
            message: 'The file was saved!', 
            payload: 
                fileName,
                dir: `./data/$fileName.md`
            
        )
    )

我可以在那里发送fs.writeFile,而不是发送NEW_DOCUMENT_SAVE_NEEDED,就像我发送fs.readdirSync 来读取所有文件一样。

我知道有些事情我不能在 ipcRenderer 中执行,但我可以执行 fs 操作,是否需要在这些操作上来回切换?

【问题讨论】:

【参考方案1】:

这取决于。 如果您只有少量数据要写入文件,您可以在 renderer.js 中完成。 如果您有大量数据并且不希望您的 UI 被阻塞,您应该将您的 fs 操作移至不同的进程。

Electron 在这里很棘手,即使在 main.js 中这样做仍然会阻塞 UI:Horror of Electron Main Process 这里的最佳实践是创建第二个 BrowserWindow,使其不可见并在那里执行繁重的操作,在您的情况下为 fs.writeFile()。这将是一个不同的过程,不会阻塞 UI。

【讨论】:

因为这实际上是我的第一个演示应用程序,比一个 hello world 稍微大一点,我认为我应该将 fs 操作放在 main.js 中,并不是说它会产生很大的不同,而是稍微更好的实践( ?) 无论如何,谢谢 您可能不会注意到单个文件写入操作的性能差异,所以不用担心。

以上是关于在电子中是在 ipcRenderer 或 ipcMain 中完成的 fs 操作的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 ipcMain 没有发送到 Electron 中的 ipcRenderer?

未调用一个渲染器进程/主窗口的多个 js 文件中的 ipcRenderer 侦听器

ipcRenderer 发送与 sendSync

如何使用ipcRenderer发送多个参数

如何在反应中导入 ipcRenderer?

如何在 vue.js 中导入 ipcRenderer? __dirname 未定义