你得了解:
进程(process):
一个进程是计算机程序执行中的一个实例。 Electron 应用同时使用了 main
进程和一个或者多个 renderer
进程来运行多个程序。
在 Node.js 和 Electron 里面,每个运行的进程包含一个 process
对象。 这个对象作为一个全局的提供当前进程的相关信息和操作方法。 作为一个全局变量,它在应用内能够不用 require() 来随时取到。
主进程(main process):
主进程,通常是指 main.js
文件,是每个 Electron 应用的入口文件。 控制着整个应用的生命周期,从打开到关闭。 它也管理着系统原生元素比如菜单,菜单栏,Dock 栏,托盘等。 主进程负责创建 APP 的每一个渲染进程。 包含了全功能的 Node API。
应用的主进程定义在 package.json
中的 main
属性中。 当您运行 electron .
时 Electron 便会知道需要运行哪个文件。
在Chromium中,此进程被称为“浏览器进程”。 Electron 中这样称呼是为了不与渲染进程混淆。
渲染进程(renderer process):
渲染进程是应用中的浏览器窗口。 与主进程不同,渲染进程可能同时存在多个,同时,每一个渲染进程都运行与独立的进程中。 渲染进程也可以隐藏。
正文:
IPC
IPC
代表进程间通信。 Electron使用IPC在主进程和渲染器进程之间发送 序列化的JSON消息。
ipcMain
进程:主进程
从主进程到渲染进程的异步通信
ipcMain
是一个 EventEmitter 的实例。 当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息。 从渲染器进程发送的消息将被发送到该模块。
ipcRenderer
进程: Renderer
从渲染器进程到主进程的异步通信
ipcRenderer
是一个 EventEmitter 的实例。 你可以使用它提供的一些方法从渲染进程 (web 页面) 发送同步或异步的消息到主进程。 也可以接收主进程回复的消息。
渲染进程间的直接通讯不被允许的,虽然ipcRenderer
是一个 EventEmitter 的实例,可以自己emit
自己on
webContents
进程:主进程
webContents
是一个 EventEmitter。 负责渲染和控制网页, 是 BrowserWindow
对象的一个属性。
主进程与主进程
1.ipcMain.emit 和 ipcMain.on
因为ipcMain
是一个 EventEmitter 的实例,可以自己emit
给自己on
const { ipcMain } = require("electron");
//发事件
ipcMain.emit(customEventName, params);
//监听事件
ipcMain.on(customEventName, (event, params) => {});
2.mainWin.webContents.emit 和 mainWin.webContents.on
因为 webContents
是一个 EventEmitter 的实例,可以自己emit
给自己on
注意: 使用 webContents.send
在此场景下,webContents.on
监听不到,webContents.send
不等同于 webContents.emit
const { ipcMain, BrowserWindow } = require("electron");
app.on("ready", () => {
const mainWin = new BrowserWindow();
//发事件
mainWin.webContents.emit(customEventName, params);
//监听事件
mainWin.webContents.on(customEventName, (event, params) => {});
});
主进程与渲染进程
假设 mainWin
是 BrowserWindow
的一个实例,mainWin.send == mainWin.webContents.send
主进程 -> 渲染进程
const { ipcMain, BrowserWindow } = require("electron");
app.on("ready", () => {
const mainWin = new BrowserWindow();
//发事件
mainWin.webContents.send(customEventName, params);
//或者mainWin.send
});
// 渲染进程,如render.js
const { ipcRenderer } = require("electron");
ipcRenderer.on(eventName, handler);
渲染进程 -> 主进程
//发
ipcRenderer.send(customEventName, params);
//监听
ipcMain.on(customEventName, (event, params) => {});
渲染进程与渲染进程
渲染进程1 -> 渲染进程2 的实现:
- 渲染进程1 -> 主进程 -> 渲染进程2