📜  主和渲染器之间的电子通信 - Javascript(1)

📅  最后修改于: 2023-12-03 14:48:58.475000             🧑  作者: Mango

主和渲染器之间的电子通信 - JavaScript

在 Electron 应用中,主进程和渲染进程 (通常是页面) 之间的通信是至关重要的。这种通信可以用于从主进程向渲染器进程传递数据或执行命令,或者从渲染器进程向主进程请求操作系统级别的服务。

IPC (Inter-Process Communication)

Electron 提供了一种用于主进程和渲染进程之间通信的接口,称为 IPC (Inter-Process Communication)。此接口包含在 Node.js 中,因此可以使用 Node 的事件和消息机制来实现。

在主进程中发送消息

在主进程中,可以使用 webContents 对象的 send 方法来发送消息到渲染器进程。例如,如果要向渲染器进程发送消息,可以使用以下代码:

const { BrowserWindow } = require('electron');

let win; // reference to the BrowserWindow

// Create the browser window
function createWindow() {
  win = new BrowserWindow();

  // Load the index.html file
  win.loadFile('index.html');

  // Send message to renderer process
  win.webContents.send('message-from-main', 'Hello from the main process!');
}

createWindow();

在上面的代码中,win.webContents.send('message-from-main', 'Hello from the main process!') 发送了一个名为 message-from-main 的消息到渲染器进程,并带有一个额外的字符串参数 'Hello from the main process!'

在渲染器进程中接收消息

在渲染器进程中,可以使用 ipcRenderer 模块来监听消息并接收来自主进程的消息。例如,如果要监听名为 message-from-main 的消息并在收到消息时打印消息字符串,可以使用以下代码:

const { ipcRenderer } = require('electron');

ipcRenderer.on('message-from-main', (event, message) => {
  console.log(`Received message from main process: ${message}`);
});

在上面的代码中,ipcRenderer.on('message-from-main', ...) 监听名为 message-from-main 的消息,并在收到消息时执行回调函数,其中 message 参数包含来自主进程的字符串消息。

同步消息传递

除了异步发送消息,还可以使用 sendSyncipcRenderer.sendSync 方法同步发送和接收消息。这两个方法将阻塞进程,直到接收到消息或返回响应为止。

与异步消息传递不同,同步消息传递不需要回调或 Promise,消息的返回值可以直接作为函数调用的结果。

// In main process
const { ipcMain } = require('electron');

ipcMain.on('get-app-version-sync', (event) => {
  event.returnValue = app.getVersion();
});

// In renderer process
const { ipcRenderer } = require('electron');

const appVersion = ipcRenderer.sendSync('get-app-version-sync');
console.log(`App version: ${appVersion}`);

在上面的代码中,主进程暴露了一个同步的方法 get-app-version-sync,当渲染器进程调用该方法时会直接返回主进程 app.getVersion() 的结果。

总结

使用 Electron 提供的 IPC 接口,主进程和渲染器进程可以在应用程序中进行通信,并共享数据和执行命令。此外,同步和异步消息传递都可用于实现不同场景下的需求。