Skip to content

electron ipc 通讯

invoke/handle 模式(推荐方式)

js
// 渲染进程
const result = await window.ipcRenderer.invoke('checkAvatarExists', localAvatarPath);

// 主进程 这段代码通常在应用启动时执行一次
ipcMain.handle('checkAvatarExists', async (event, avatarPath) => {
    //existsSync检测是否存在路径
  return fs.existsSync检测是否存在路径(avatarPath);
});

特点:

  • 基于 Promise,支持 async/await
  • 有返回值
  • 更现代化的异步处理方式

send/on 模式(传统方式)

js
// 渲染进程
window.ipcRenderer.send('checkAvatarExists', localAvatarPath);
window.ipcRenderer.on('avatarExistsResult', (event, exists) => {
  console.log(exists);
});

// 主进程
ipcMain.on('checkAvatarExists', (event, avatarPath) => {
  const exists = fs.existsSync(avatarPath);
  event.reply('avatarExistsResult', exists);
});

特点:

  • 基于事件监听
  • 需要额外的回调处理
  • 代码相对复杂

sendSync(同步方式)

js
// 渲染进程
const result = window.ipcRenderer.sendSync('checkAvatarExists', localAvatarPath);

// 主进程
ipcMain.on('checkAvatarExists', (event, avatarPath) => {
  event.returnValue = fs.existsSync(avatarPath);
});

特点:

  • 阻塞执行
  • 可能导致界面卡顿
  • 不推荐使用

使用场景对比

  • invoke/handle:适合需要返回值的操作,如文件检查、数据查询等
  • send/on:适合单向通信或复杂的事件驱动场景
  • sendSync:仅在必须同步执行的极少数情况下使用

场景

邮箱改变获取本地头像改变头像

js
// 监听邮箱变化  (渲染进程)
watch(
    () => userInfoForm.value.email,
    (newEmail) => {
        if (!newEmail) {
            // 邮箱为空时显示默认头像
            avatarPath.value = avatar;
            return;
        }
        // 截取邮箱@前面的部分作为用户id
        const userId = newEmail.split('@')[0];
        // 构建本地头像路径
        const localAvatarPath = `avatar/${userId}.png`;
        
        // 使用 window.ipcRenderer 检查文件是否存在
        window.ipcRenderer.invoke('checkAvatarExists', localAvatarPath)
            .then(exists => {
                if (exists) {
                    avatarPath.value = localAvatarPath;
                } else {
                    avatarPath.value = avatar; // 不存在时使用默认头像
                }
            })
            .catch(() => {
                avatarPath.value = avatar; // 出错时使用默认头像
            });
    }
);

如有转载或 CV 的请标注本站原文地址

访客数 --| 总访问量 --