Electron:从主进程向渲染进程发送 app.getPath 数据

Electron: Sending app.getPath data from the main process to the renderer process

鉴于:

webPreferences: {
  nodeIntegration: false,
  contextIsolation: true,
  sandbox: true,
}

我需要在渲染器进程中访问 app.getPath("appData") 的结果。

app.getPath("appData") 仅在主进程中有效。

contextBridge.exposeInMainWorld() 仅适用于预加载脚本。

如果预加载脚本无法访问app.getPath("appData")并且主进程无法访问contextBridge.exposeInMainWorld(),如何将app.getPath("appData")的结果暴露给渲染器?

你可以

  • 设置预加载脚本以调用 exposeInMainWorld 以在 window 上放置一个 Promise 调用函数。调用时向主进程发起请求
  • 设置主进程以使用所需信息响应来自预加载脚本的请求
// Main process:
ipcMain.handle('getPath', () => app.getPath("appData"));
// Preload:
contextBridge.exposeInMainWorld('electronAPI', {
    getPath: () => ipcRenderer.invoke('getPath')
});
// Renderer:
window.electronAPI.getPath()
  .then((appDataPath) => {
    // ...
  })
  .catch(handleErrors);

预加载脚本本质上充当沙盒页面和特权主进程之间的桥梁 - 通常,应用程序的大部分逻辑将存在于主进程或渲染器中,而预加载仅在它们之间架起桥梁。

对于将消息从渲染器发送到主程序(可能在等待响应时)的更通用的方法,我发现以下方法工作得很好:

// Preload:
contextBridge.exposeInMainWorld('electronAPI', {
    sendMessageToMainProcess: (channel: string, payload: unknown) => ipcRenderer.invoke(channel, payload),
});