1.单向通信
从渲染器进程发送到主进程,您可以使用 ipcRenderer.send API 发送消息,然后使用 ipcMain.on API 接收。
举例:场景-->想要通过electron打开文件
渲染进程:
function openFile(selectFilePath){
//selectFilePath想要打开的文件路径
window.TEST.openFile(selectFilePath);
}
预加载脚本preload.ts
import { contextBridge, ipcRenderer } from 'electron'
contextBridge.exposeInMainWorld("TEST", {
openFile: (data) => ipcRenderer.send("open-file", data),
})
主进程main.js
ipcMain.on("open-file", (event, data) => {
shell.openPath(data);//打开文件
});
2.双向通信
从渲染器进程代码调用主进程模块并等待结果。 这可以通过将 ipcRenderer.invoke 与 ipcMain.handle 搭配使用来完成。
举例:场景-->想要通过node删除本地磁盘文件并拿到删除结果
渲染进程:
async function deleteFile(path) {
const resultData = await window.TEST.deleteFile(path);
if (resultData.status == "success") {
ElMessage({
showClose: true,
message: "删除成功!",
type: "success",
});
}
}
预加载脚本preload.ts
import { contextBridge, ipcRenderer } from 'electron'
contextBridge.exposeInMainWorld("TEST", {
deleteFile: (data) => ipcRenderer.invoke("delete-file", data),
})
主进程main.js
ipcMain.handle("delete-file", (event, path) => {
return new Promise((resolve, reject) => {
let sendData = {
status: "",
message: "",
};
fs.stat(path, (exists) => {
if (exists) {
sendData.message = "当前不存在!";
resolve(sendData);
} else {
fs.unlink(path, (err) => {
if (err) {
sendData.status = "fail";
resolve(sendData);
} else {
sendData.status = "success";
resolve(sendData);
}
});
}
});
});
});
3. 主进程到渲染器进程(双向)
从主进程发送到渲染器进程时,需要指定是哪一个渲染器接收消息。 消息需要通过 WebContents 发送到渲染器进程,预加载脚本通过ipcRenderer.on去接收
举例:场景-->通过node拿到当前应用版本号,传给渲染进程,并得到答复
主进程main.js
mainWindow.webContents.send("app-version", app.getVersion());
//拿到渲染进程的回复
ipcMain.on('status', (_event, value) => {
console.log(value) // 将打印到 Node 控制台
})
预加载脚本preload.ts
import { contextBridge, ipcRenderer } from 'electron'
contextBridge.exposeInMainWorld("TEST", {
appVersion: (callback) => ipcRenderer.on("app-version", callback),
})
渲染进程
window.TEST.appVersion((_event, data) => {
global.appVersion = data;
_event.sender.send('status', '已受到') // 发送消息到主进程
});
4. 渲染器进程到渲染器进程
这个还没用过,后续更新