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 关键顺序原则:

总结

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

相关推荐
王晓枫3 分钟前
flutter接入三方库运行报错:Error running pod install
前端·flutter
符方昊3 分钟前
React 19 对比 React 16 新特性解析
前端·react.js
ssshooter9 分钟前
又被 Safari 差异坑了:textContent 拿到的值居然没换行?
前端
曲折24 分钟前
Cesium-气象要素PNG色斑图叠加
前端·cesium
Forever7_31 分钟前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
Angelial41 分钟前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
jiayu1 小时前
Angular学习笔记24:Angular 响应式表单 FormArray 与 FormGroup 相互嵌套
前端
jiayu1 小时前
Angular6学习笔记13:HTTP(3)
前端
小码哥_常1 小时前
Kotlin抽象类与接口:相爱相杀的编程“CP”
前端
evelynlab1 小时前
Tapable学习
前端