electron进程间通信-IPC通信注册机制

👨 作者简介:大家好,我是Taro,全栈领域创作者

✒️ 个人主页:唐璜Taro

🚀 支持我:点赞👍+📝 评论 + ⭐️收藏


文章目录

  • 前言
  • 一、通信流程
  • 二、使用步骤
    • [2.1 预加载脚本(preload.js)部分](#2.1 预加载脚本(preload.js)部分)
    • [2.2 渲染进程(render.js)部分](#2.2 渲染进程(render.js)部分)
    • [2.3 通信流程](#2.3 通信流程)
    • [2.4 函数调用顺序](#2.4 函数调用顺序)
  • 三、ipcRenderer.on注册机制
    • [3.1 必要前提条件](#3.1 必要前提条件)
    • [3.2 错误情况举例](#3.2 错误情况举例)
    • [3.3 正确顺序验证](#3.3 正确顺序验证)
  • 四、梳理正确的定义和调用顺序
    • [4.1 代码层面验证](#4.1 代码层面验证)
    • [4.2 关键顺序原则:](#4.2 关键顺序原则:)
  • 总结

前言

在上一篇 electron进程间通信-从主进程到渲染器进程 只是简单叙述了代码的操作流程,这篇文章我们将从代码层面开始剖析,全面了解IPC通信的注册流程


提示:以下是本篇文章正文内容,下面案例可供参考

一、通信流程

  1. 主进程通过win.webContents.send('mainProcessMessage', message)发送消息

  2. 预加载脚本通过ipcRenderer.on('mainProcessMessage', callback)接收

  3. 渲染进程通过window.electron.mainProcessMessage(callback)注册回调

二、使用步骤

2.1 预加载脚本(preload.js)部分

c 复制代码
mainProcessMessage: (callback) => {
  ipcRenderer.on('mainProcessMessage', (event, message) => callback(message))
}
  • 这里定义了一个名为mainProcessMessage的方法,它接收一个回调函数callback
  • 当主进程发送'mainProcessMessage'事件时,ipcRenderer.on会监听这个事件
  • 收到事件后,提取message参数并调用callback(message)

2.2 渲染进程(render.js)部分

代码如下(示例):

c 复制代码
window.electron.mainProcessMessage((message) => {
  console.log('收到主进程消息:', message)
  const timeDiv = document.getElementById('time')
  timeDiv.textContent = `${message}`
})
  • 调用window.electron.mainProcessMessage并传入一个回调函数
  • 这个回调函数会在主进程消息到达时被触发
  • 回调函数接收message参数,更新页面上的timeDiv元素

2.3 通信流程

bash 复制代码
主进程(main.js) --发送消息--> 预加载进程(preload.js) --转发消息--> 渲染进程(render.js)

2.4 函数调用顺序

(1) 主进程调用win.webContents.send('mainProcessMessage', '消息内容')

(2) 预加载脚本的ipcRenderer.on监听到事件

(3)预加载脚本调用之前注册的callback函数

(4)渲染进程的回调函数被执行,更新页面


三、ipcRenderer.on注册机制

ipcRenderer.on监听注册必须早于主进程发送消息,这是IPC通信的基本要求。具体时序应该是(了解这一点很重要)

3.1 必要前提条件

  • 预加载脚本先定义window.electron.mainProcessMessage方法
  • 渲染进程调用该方法注册监听器(ipcRenderer.on)
  • 之后主进程才能成功发送消息

3.2 错误情况举例

bash 复制代码
// 错误顺序!消息会丢失
win.webContents.send('mainProcessMessage', "Hello") // 先发送
window.electron.mainProcessMessage(() => {})         // 后监听

3.3 正确顺序验证

在项目中,main.js的这部分代码保证了正确时序:

bash 复制代码
app.on('ready', () => {
  const win = createWindow() // 先创建窗口(加载preload.js和render.js)
  // 渲染进程已准备好监听后...
  win.webContents.send('mainProcessMessage', new Date().toLocaleString()) // 后发送
})

四、梳理正确的定义和调用顺序

4.1 代码层面验证

bash 复制代码
// preload.js(定义阶段)
contextBridge.exposeInMainWorld('electron', {
  mainProcessMessage: (callback) => { 
    // 这里只是方法定义,未被调用
    ipcRenderer.on('mainProcessMessage', callback) 
  }
})

// render.js(调用阶段)
window.electron.mainProcessMessage((msg) => { 
  // 此时才真正执行ipcRenderer.on !
})

4.2 关键顺序原则:

总结

以上就是今天要讲的内容,本文仅仅简单介绍了从主进程到渲染器进程的使用,从代码层面验证了监听注册必须早于消息发送。

相关推荐
名字还没想好☜几秒前
React 受控输入框光标跳到末尾:格式化输入时的 selection 丢失 bug 与修复
前端·javascript·react.js·bug·react·next.js
Access开发易登软件1 分钟前
Access 怎么做前后端分离?用 Web API 读写 SQL Server
前端·数据库·人工智能·microsoft·excel·access
10share10 分钟前
React 新一代样式隔离方案 —— 编译时、零运行时、原生写法
前端·react.js
upgrador19 分钟前
桌面应用开发:Electron 与 NSIS 的关系、打包流程及 Windows 本地构建实战
javascript·windows·electron
Revolution6120 分钟前
Node.js 是什么:前端项目里哪些事情由它完成
前端·面试·node.js
我要两颗404西柚38 分钟前
Stage three:VUE工程化与实战工具
前端·javascript·vue.js
光影少年43 分钟前
RN 的EventEmitter 双向通信
前端·react native·react.js
布鲁飞丝1 小时前
从零实现富文本编辑器#-浏览器选区与编辑器选区模型同步
java·前端·编辑器
写不来代码的草莓熊1 小时前
Cesium 地图交互绘制圆形、多边形
前端·javascript·地图
weixin_427771612 小时前
前端版本检测
前端