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),
});
鉴于:
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),
});