[Electron] 主进程 / 渲染进程通信

ipcMain / ipcRenderer

  • 使用场景

渲染进程通知主进程帮忙处理指定业务,主进程在通知渲染进程是否处理完成

  • 同步通信

channel:通知事件名称,可随意命名
arg:发送通知时传递的参数
event.returnValue:同步返回数据

// 主进程 - 接收消息 - 返回数据
const { ipcMain } = require('electron')
ipcMain.on('channel', (event, arg) => {
  console.log(arg) // prints "ping"
  event.returnValue = 'pong'
})
// 渲染进程 - 发送通知
const { ipcRenderer } = require('electron')
console.log(ipcRenderer.sendSync('channel', 'ping')) // prints "pong"
  • 异步通信

event.reply:将异步消息发送回发送者

// 主进程 - 接收消息 - 发送异步通知
const { ipcMain } = require('electron')
ipcMain.on('channel', (event, arg) => {
  console.log(arg) // prints "ping"
  event.reply('channel-reply', 'pong')
})
// 渲染进程 - 发送通知 - 主进程处理完后 - 接收通知
const { ipcRenderer } = require('electron')
ipcRenderer.on('channel-reply', (event, arg) => {
  // 接收主进程发送的异步通知
  console.log(arg) // prints "pong"
})
ipcRenderer.send('channel', 'ping')

remote

与 ipc 模块不同,remote 更加简便,可以直接调用 electron 中的内置模块, 而不必通过 ipc 发送通信

注意事项: 因为安全原因,remote 模块能在以下几种情况下被禁用:

  • BrowserWindow - 通过设置 enableRemoteModule 选项为 false
  • - 通过把 enableremotemodule属性设置成 false
  • 引用
// NodeJs 引用
const { remote } = require('electron').remote

// VUE 中直接引用
remote: window.require('electron').remote
  • 使用

remote 可以直接调用 electron 中的内置模块,所以使用方式例子如下

// 以使用 ipcRenderer 为例
// 直接调用 ipcRenderer
remote.ipcRenderer.send('channel', 'ping')

remote 也可以获取当前窗口 remote.getCurrentWindow()

  • remote 模块有以下方法:

# 在Vue中可通过此方法调用 electron 中的自定义js模块
# 例如:this.electron.remote.require('./util/test.js')
# 返回在主进程中执行 `require(module)` 所返回的对象。
# `module` String
remote.require(module)

# 返回该网页所属的 `BrowserWindow` 对象。
remote.getCurrentWindow()

# 返回该网页的 `WebContents` 对象
remote.getCurrentWebContents()

# 返回在主进程中名为 `name` 的全局变量(即 `global[name]`) 。
# `name` String
remote.getGlobal(name)

# 返回主进程中的 `process` 对象。等同于 `remote.getGlobal('process')` 但是有缓存。
remote.process

你可能感兴趣的:([Electron] 主进程 / 渲染进程通信)