Skip to content

Ipc

IPC(Inter-Process Communication)是 Electron 的一个重要特性,它允许主进程与渲染进程之间,以及不同渲染进程之间的消息通信。框架在这个模块做了一些 IPC 相关的封装,让使用者更加方便使用相关的通信方法。

作用

IPC 的主要作用是在主进程和渲染进程之间传递数据和消息,实现不同进程间的通信。常见的使用场景包括:

  • 主进程需要控制渲染进程
  • 渲染进程需要调用主进程的方法
  • 不同页面的渲染进程间需要通信

初始化

为了正常使用 IPC 模块相关的 API,需要做一些初始化工作。

重要!!!

为了让尽可能多的 API 可以在主进程、渲染进程、preload 预加载脚本中无差别的使用,框架抹平了很多差异,所以如果要顺利的使用框架里面的 API,IPC 初始化非常重要。

主进程

ts
// 初始化
import { initIpc } from "electron-prokit";
initIpc();
// 初始化
import { initIpc } from "electron-prokit";
initIpc();

preload 脚本

ts
// 暴露注册函数
import { initExposeInMainWorld } from "electron-prokit";
initExposeInMainWorld();
// 暴露注册函数
import { initExposeInMainWorld } from "electron-prokit";
initExposeInMainWorld();

API 概览

函数名使用环境描述
initIpc主进程初始化 IPC
onMsgFromRender主进程接收渲染进程消息
sendMsgToRender主进程发送消息给渲染进程
initExposeInMainWorldPreload暴露注册函数
onMsgFromMain渲染进程/Preload接收主进程消息
sendMsgToMain渲染进程/Preload发送消息给主进程
onMsgFromOtherRender渲染进程/Preload接收其他渲染进程消息
sendMsgToOtherRender渲染进程/Preload发送消息给其他渲染进程

API 使用

initIpc

初始化 IPC,需要在主进程中调用。

ts
// 主进程
import { initIpc } from "electron-prokit";
initIpc();
// 主进程
import { initIpc } from "electron-prokit";
initIpc();

onMsgFromRender

在主进程中监听渲染进程发送来的消息。

ts
// 主进程
import { onMsgFromRender } from "electron-prokit";
onMsgFromRender((event, args) => {
  console.log(event, args);
});
// 主进程
import { onMsgFromRender } from "electron-prokit";
onMsgFromRender((event, args) => {
  console.log(event, args);
});

💬 参数

ts
onMsgFromRender(callback: (event: Electron.IpcMainEvent, args: any) => void)
onMsgFromRender(callback: (event: Electron.IpcMainEvent, args: any) => void)
  • callback:回调函数,包含两个参数

    • event: ipcMain 事件对象
    • args: 渲染进程发送来的参数

sendMsgToRender

主进程发送消息给渲染进程。

ts
// 主进程
import { sendMsgToRender } from "electron-prokit";
sendMsgToRender("mainWin", "Hello");
// 主进程
import { sendMsgToRender } from "electron-prokit";
sendMsgToRender("mainWin", "Hello");

💬 参数

ts
sendMsgToRender(windowName: string, msg: any)
sendMsgToRender(windowName: string, msg: any)
  • windowName: 发送消息的目标窗口名称
  • msg: 发送的消息内容

initExposeInMainWorld

在 Preload 脚本中暴露注册函数。

ts
// Preload 脚本
import { initExposeInMainWorld } from "electron-prokit";
initExposeInMainWorld();
// Preload 脚本
import { initExposeInMainWorld } from "electron-prokit";
initExposeInMainWorld();

onMsgFromMain

监听主进程发送过来的消息。

ts
// 渲染进程或 Preload 脚本
import { onMsgFromMain } from "electron-prokit";
onMsgFromMain((event, args) => {
  console.log(event, args);
});
// 渲染进程或 Preload 脚本
import { onMsgFromMain } from "electron-prokit";
onMsgFromMain((event, args) => {
  console.log(event, args);
});

💬 参数

ts
onMsgFromMain(callback: (event: Electron.IpcRendererEvent, args: any) => void)
onMsgFromMain(callback: (event: Electron.IpcRendererEvent, args: any) => void)
  • callback:回调函数,包含两个参数
    • event: ipcRenderer 事件对象
    • args: 主进程发送来的参数

sendMsgToMain

发送消息给主进程。

ts
// 渲染进程或 Preload 脚本
import { sendMsgToMain } from "electron-prokit";
sendMsgToMain("Hello main").then((res) => {
  console.log(res);
});
// 渲染进程或 Preload 脚本
import { sendMsgToMain } from "electron-prokit";
sendMsgToMain("Hello main").then((res) => {
  console.log(res);
});

💬 参数

ts
sendMsgToMain(msg: any)
sendMsgToMain(msg: any)
  • msg: 发送的消息内容

onMsgFromOtherRender

监听其他渲染进程发送的消息。

ts
// 渲染进程或 Preload 脚本
import { onMsgFromOtherRender } from "electron-prokit";
onMsgFromMain((event, args) => {
  console.log(event, args);
});
// 渲染进程或 Preload 脚本
import { onMsgFromOtherRender } from "electron-prokit";
onMsgFromMain((event, args) => {
  console.log(event, args);
});

💬 参数

ts
onMsgFromOtherRender(callback: (event: Electron.IpcRendererEvent, args: any) => void)
onMsgFromOtherRender(callback: (event: Electron.IpcRendererEvent, args: any) => void)
  • callback:回调函数,包含两个参数
    • event: ipcRenderer 事件对象
    • args: 主进程发送来的参数

sendMsgToOtherRender

发送消息给其他渲染进程。

ts
// 渲染进程或 Preload 脚本
import { sendMsgToOtherRender } from "electron-prokit";
sendMsgToOtherRender("work", "Hello work");
// 渲染进程或 Preload 脚本
import { sendMsgToOtherRender } from "electron-prokit";
sendMsgToOtherRender("work", "Hello work");

💬 参数

ts
sendMsgToOtherRender(windowName:string,msg:any)
sendMsgToOtherRender(windowName:string,msg:any)
  • windowName: 发送消息的目标窗口名称
  • msg: 发送的消息内容

示例

点击查看示例源码

alt ipc