searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享

Electron Ipc通信

2023-12-08 01:28:38
2
0

 

 

1. 主进程和渲染进程的环境区别

认为主进程的代码是开发者自己写的,就是普通的node程序,但是渲染进程有可能会加载网页之类的,可能会执行第三方的js代码,渲染进程的权限是被限制了的,所以某些敏感操作就需要渲染进程给主进程发消息,让主进程去做,然后完事了再通知渲染进程。

在使用electron开发客户端程序的时候,将其类比为web端的B/S架构,其渲染进程就是前端的页面,是门面,而主进程则是服务器后台,负责处理一些与UI无关的业务逻辑,主进程和渲染进程不可避免的要进行一些数据、指令的交换,即这两个进程之间要通信交换数据,这就是进程间通信,electron提供了ipc模块用于在主进程和渲染进程之间通信。

2 渲染进程向主进程发送异步消息

渲染进程向主进程发送消息默认就是异步的,在渲染进程的html或者render.js中向主进程发送异步消息:

01
02
03
04
const electron = require("electron");
// 第一个参数是约定的事件的名称,主进程要监听这个事件
// 第二个及之后的参数是要发送的具体的消息
electron.ipcRenderer.send("render-to-main-message", message);

send方法至少需要两个参数,第一个是事件名称,在主线程中需要监听此事件,然后是至少一个参数的事件参数,可以有多个,但是至少有一个。

在主线程main.js中接收事件:

01
02
03
04
05
06
07
08
09
// 接收从渲染进程发送到主进程的消息
ipcMain.on("render-to-main-message", (event, message) => {
 
    // 在控制台上打印一下
    console.log(`receive message from render: ${message}`);
 
    // 回复消息
    event.reply("main-to-render-message", `来自主进程:我收到了你的消息“${message}”`);
})

使用 event.reply 在主进程中回复渲染进程发过来的消息,因为这个replay指定了一个事件名称,因此在渲染进程render.js中也要监听事件才能收到回复:

01
02
03
04
05
06
// 接收主进程发来的消息
// 第一个参数是约定的事件的名称
// 第二个参数是处理事件的callback
electron.ipcRenderer.on("main-to-render-message", (event, message) => {
    alert(message);
});

 

3. 渲染进程向主进程发送同步消息

同步消息是渲染进程向主进程发送的,因为渲染进程页面可以有多个,而主进程node进程只有一个,因此渲染进程可以等主进程,而主进程不能同步等渲染进程。

渲染进程向主进程发送同步消息,使用 electron.ipcRenderer.sendSync 方法,这个方法的返回值是从主进程中返回的,在渲染进程render.js中向主进程发送消息:

01
02
03
04
const electron = require("electron");
// 发送同步消息
const replayMessage = electron.ipcRenderer.sendSync("render-to-main-message-sync", message);
alert(replayMessage);
0条评论
作者已关闭评论
y****n
2文章数
0粉丝数
y****n
2 文章 | 0 粉丝
y****n
2文章数
0粉丝数
y****n
2 文章 | 0 粉丝

Electron Ipc通信

2023-12-08 01:28:38
2
0

 

 

1. 主进程和渲染进程的环境区别

认为主进程的代码是开发者自己写的,就是普通的node程序,但是渲染进程有可能会加载网页之类的,可能会执行第三方的js代码,渲染进程的权限是被限制了的,所以某些敏感操作就需要渲染进程给主进程发消息,让主进程去做,然后完事了再通知渲染进程。

在使用electron开发客户端程序的时候,将其类比为web端的B/S架构,其渲染进程就是前端的页面,是门面,而主进程则是服务器后台,负责处理一些与UI无关的业务逻辑,主进程和渲染进程不可避免的要进行一些数据、指令的交换,即这两个进程之间要通信交换数据,这就是进程间通信,electron提供了ipc模块用于在主进程和渲染进程之间通信。

2 渲染进程向主进程发送异步消息

渲染进程向主进程发送消息默认就是异步的,在渲染进程的html或者render.js中向主进程发送异步消息:

01
02
03
04
const electron = require("electron");
// 第一个参数是约定的事件的名称,主进程要监听这个事件
// 第二个及之后的参数是要发送的具体的消息
electron.ipcRenderer.send("render-to-main-message", message);

send方法至少需要两个参数,第一个是事件名称,在主线程中需要监听此事件,然后是至少一个参数的事件参数,可以有多个,但是至少有一个。

在主线程main.js中接收事件:

01
02
03
04
05
06
07
08
09
// 接收从渲染进程发送到主进程的消息
ipcMain.on("render-to-main-message", (event, message) => {
 
    // 在控制台上打印一下
    console.log(`receive message from render: ${message}`);
 
    // 回复消息
    event.reply("main-to-render-message", `来自主进程:我收到了你的消息“${message}”`);
})

使用 event.reply 在主进程中回复渲染进程发过来的消息,因为这个replay指定了一个事件名称,因此在渲染进程render.js中也要监听事件才能收到回复:

01
02
03
04
05
06
// 接收主进程发来的消息
// 第一个参数是约定的事件的名称
// 第二个参数是处理事件的callback
electron.ipcRenderer.on("main-to-render-message", (event, message) => {
    alert(message);
});

 

3. 渲染进程向主进程发送同步消息

同步消息是渲染进程向主进程发送的,因为渲染进程页面可以有多个,而主进程node进程只有一个,因此渲染进程可以等主进程,而主进程不能同步等渲染进程。

渲染进程向主进程发送同步消息,使用 electron.ipcRenderer.sendSync 方法,这个方法的返回值是从主进程中返回的,在渲染进程render.js中向主进程发送消息:

01
02
03
04
const electron = require("electron");
// 发送同步消息
const replayMessage = electron.ipcRenderer.sendSync("render-to-main-message-sync", message);
alert(replayMessage);
文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
1
0