2023最新electron 进程间通讯的几种方法

数据传递(旧)

渲染进程发数据到主进程

复制代码
// 按钮事件
const handleWebRootPathClick = () => {
  ipcRenderer.send('open_dir')
}

// main.ts中接收
ipcMain.on('open_dir', () => {
  console.log('recv ok')
})

主进程发数据到渲染进程

复制代码
// main.ts中发送数据
win.webContents.send('load', {message: "主进程执行了,这是结果"});

// 组件中接收
ipcRenderer.on('load', (_, message) => {
  console.log('主线程过来的数据:', message)
})

数据传递(新)

渲染进程到主进程

复制代码
// preload.js
const menuOpt = {
  min: () => ipcRenderer.send('window:minimize'),
  isMaximized: () => ipcRenderer.invoke('get:isMaximized'),
  maximize: () => ipcRenderer.send('window:maximize'),
  restore: () => ipcRenderer.send('window:restore'),
  close: () => ipcRenderer.send('window:close')
}
contextBridge.exposeInMainWorld('electronAPI', {
  menuOpt,
})

// 渲染进程
const { menuOpt } = window.electronAPI
menuOpt.min()

// 主进程
const renderFuncInit = () => {
  ipcMain.on('window:minimize', () => {
    win.minimize()
    win.webContents.send('update-counter', '6666')
  })


  ipcMain.on('window:maximize', () => {
    win.maximize()
  })

  ipcMain.on('window:restore', () => {
    win.restore()
  })

  ipcMain.on('window:close', () => {
    win.close()
  })

  ipcMain.handle('get:isMaximized', async () => {
    return win.isMaximized()
  })
}
// 初始化app(在 Electron 完成初始化时触发),挂载上面创建的 桌面应用程序窗口
app.whenReady().then(() => {
  renderFuncInit()
  createWindow()
})

主进程到渲染进程

复制代码
// preload.js
contextBridge.exposeInMainWorld('electronAPI', {
  handleCounter: (callback) => ipcRenderer.on('update-counter', callback)
})

// 主进程
win.webContents.send('update-counter', '6666')

// 渲染进程
const { menuOpt, handleCounter } = window.electronAPI
handleCounter((_event, value) => {
  console.log(value, _event)
})

双向通讯

复制代码
// preload.js
const file = {
  openDir: (dirPath) => ipcRenderer.invoke('file:openDir', dirPath),
}

contextBridge.exposeInMainWorld('electronAPI', {
  file,
})

// 主进程
ipcMain.handle('file:openDir', async (_, dirPath = __dirname) => {
  const { canceled, filePaths } = await dialog.showOpenDialog({
    defaultPath: dirPath, // 默认盘
    properties: ['openFile', 'openDirectory']
  })

  return {
    isCanceled: canceled,
    files: filePaths
  }
})

// 渲染进程
const openDir = async () => {
  const { isCanceled, files } = await file.openDir()
  console.log('dddd', isCanceled, files)
}
相关推荐
徐小夕1 分钟前
深度剖析 30k star 的编码 Agent DeepSeek-Reasonix:长会话 Token 成本直降 80%
前端·vue.js·github
轻松西西莱尔4 分钟前
谷歌+斯坦福+CMU 等五家 203 页综述,我做了个HTML把主动式AI的边界跑给你看
前端·html·agent
吴凡wudianmei16 分钟前
从 0 搭一个 AI Agent(四):SSE 跑通之后,三处“契约错配”与它们的修复边界
前端·后端·aigc
不可能片场17 分钟前
Electron 发布 别拿 load 事件当页面就绪
前端·electron
paopaokaka_luck26 分钟前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
kyriewen28 分钟前
我验了 7 种 sticky 失效说法:3 种根本不成立
前端·javascript·程序员
程序边界34 分钟前
一台数据集成软件的拆解笔记(下):一致性、容错、跑批与迁移,KFS 真正难的地方在这
java·前端·笔记
健康活着就好36 分钟前
# 前端图片优化实战,首屏加载提速60%
前端
不一样的少年_1 小时前
不花一分额外 API 钱,用现成的 Claude Code / Codex / Cursor 搭建 AI 个人知识库
前端·后端·ai编程
tryCbest1 小时前
ES6 ( ECMAScript 2015)核心语法
前端·ecmascript·es6