首页 > 其他分享 >electron中定义ipc的完美方案

electron中定义ipc的完美方案

时间:2024-09-23 18:14:24浏览次数:1  
标签:ipc const ... 完美 js -- electron ipcMainHandlers 进程

前语

发现在主进程和渲染进程通信的设计中,很多代码都是重复的,导致最后非常臃肿,且不利于后期扩展

方案

electron项目中 核心文件结构如下

| -- index.js
| -- index.html
| -- ipc
  | -- handlers
    | -- other.js
    | -- xxx.js
  | -- index.js
| -- preload.js

ipc/handlers 里放你需要曝漏给渲染进程和主进程的方法,比如other.js

import processa from "node:process"

export const getEnv = ()=>{
  return JSON.stringify(processa.env)
}

// export const setXXX = ()=>{
//   xxxx
//   return xxxx
// }

ipc/index.js里做将handler 内容分别注册到渲染进程和主进程的逻辑

// 此文件不需要动
import path from "node:path";
import { readdirSync } from "node:fs";
import { ipcMain } from "electron";

export const getIcpMainHandler = async () => {
  let allHandler = {};
  const dirs = readdirSync(path.join(__dirname, "handlers"), "utf8");
  for (const file of dirs) {
    const filePath = path.join(__dirname, "handlers", file);
    const handlers = await import(filePath);
    allHandler = {
      ...allHandler,
      ...handlers,
    };
  }
  return allHandler;
};

// 主进程中定义(注册) ipcMain.handle方法
export const registerHandlerForIcpMain = async () => {
  const ipcMainHandlers = await getIcpMainHandler();
  for (const key in ipcMainHandlers) {
    const handler = ipcMainHandlers[key];
    ipcMain.handle(key, (event, ...params) => handler(...params));
  }
};

// 渲染进程定义(注册) ipcMain.handle方法
export const registerHandlerForPreload = async () => {
  const ipcMainHandlers = await getIcpMainHandler();
  return Object.keys(ipcMainHandlers);
};


// 以上两个方法的汇总
export const registerHandlerForMainAndPreload = async () => {
  registerHandlerForIcpMain();
  ipcMain.handle("registIcpHandler", registerHandlerForPreload);
};

在主进程的入口处 index.js,调用此方法

...
import {registerHandlerForMainAndPreload } from "./ipc/index.js";
...
app.whenReady().then(() => {
  registerHandlerForMainAndPreload();
  ...
});

在 preload.js , 也需要做一些处理,用来配合将handler注册渲染进程相关逻辑

const { contextBridge, ipcRenderer } = require("electron");

const main = async () => {
  if (!window.electronApi) {
    // 获取主进程里的ipcMainHandlers
    const ipcMainHandlers = await ipcRenderer.invoke("registIcpHandler");
    // 注入到渲染进程的electronApi对象中
    const electronAPIContent = {};
    for (const handlerName of ipcMainHandlers) {
        electronAPIContent[handlerName] = function(){return ipcRenderer.invoke(handlerName, ...arguments)}
    }
    contextBridge.exposeInMainWorld("electronApi", electronAPIContent);
  }
};
main();

最后,在渲染进程的页面中,我们就可以用此handler中的api了

window.electronApi.getEnv()

好处

后续直接在handler文件夹中直接定义方法就行,会自动注入到渲染进程中。
既保证了安全,写起来又方便。

标签:ipc,const,...,完美,js,--,electron,ipcMainHandlers,进程
From: https://www.cnblogs.com/dingshaohua/p/18427595

相关文章

  • 电商数据飞轮:从数据仓库到数据中台的完美转变
    在电子商务行业,数据是一切决策的根基。随着技术的迭代和业务需求的深化,数据管理的方式也经历了从数据仓库、数据中台到现在的数据飞轮的演变。本文将从技术角度分析如何在电商行业通过使用先进的数据管理技术和理念,实现数据的全面价值。数据仓库到数据中台传统的数据仓库主要聚焦......
  • electron nsis打包windows应用程序
    使用electron开发应用程序之后,经常会单独对windows做32位或者是64位程序打包操作,有时候默认的程序做不了相应的需求,往往需要添加单独的页面或者是修改默认的操作,比如一下添加一个默认的选择页面:自定义脚本代码如下所示:!defineMUI_LANGUAGE"Chinese"Unicodetrue!includensDial......
  • AIGC8: 高通骁龙AIPC开发者大会记录B
    图中是一个小男孩在市场卖他的作品。AI应用开发出来之后,无论是个人开发者还是企业开发者。如何推广分发是面临的大问题。做出来的东西一定要符合商业规律。否则就是实验室里面的玩物,或者自嗨的东西。背景上次是回顾和思考前面两个硬件营销总的分享,接下来看软件营销总的分享。......
  • 右值引用、转移和完美转发(刨析std::move的实现原理)
    文章目录0、类型和值类别1、左值2、右值2.1纯右值2.2将亡值3、左值引用和右值引用左值引用左值引用的特性常量左值引用的特性右值引用4、&&的特性4.1函数重载5、转移和完美转发5.1std::move5.2剖析move的实现std::remove_reference::type5.3forward0......
  • 如何使用 Electronjs 创建跨平台桌面应用程序
    在当今的软件开发环境中,构建跨不同操作系统无缝运行的应用程序比以往任何时候都更加重要。无论您的目标是windows、macos还是linux,electron.js都提供了一个强大的框架,可以使用熟悉的web技术创建桌面应用程序。本文将指导您完成设置electron环境、创建应用程序ui、与node......
  • 《C++高效字符串拼接之道:解锁性能与优雅的完美结合》
    在C++编程中,字符串拼接是一项常见的操作。然而,如果不采用合适的方法,字符串拼接可能会导致性能低下和代码繁琐。本文将深入探讨如何在C++中进行高效的字符串拼接,带你解锁性能与优雅的完美结合。一、C++中字符串拼接的常见方法及问题在C++中,有几种常见的字符串拼接方法,但......
  • Docker 与 GitHub:完美结合实现容器化部署与持续集成
    Docker与GitHub:完美结合实现容器化部署与持续集成使用Docker和GitHub,开发者可以将代码构建、测试和部署流程自动化,从而提高开发效率,确保应用程序的一致性与可靠性。本文将介绍如何使用Docker和GitHubActions实现容器化部署与持续集成。目录概述Docker基础知识Docker镜......
  • Java开发环境搭建:JDK与Eclipse的完美组合
    摘要:本文简述了Java开发环境的搭建,包括JDK的安装、环境变量配置,以及EclipseIDE的设置。提供了详细的步骤指导,帮助Java初学者快速搭建开发环境并运行第一个项目。Java的跨平台特性与环境需求我们写C/C++时,直接下载VisualStudio,然后在里面直接写代码就可以了。但是Java不行。这不是......
  • 完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
    完美解决Array方法(map/filter/reduce)不按预期工作的正确解决方法,亲测有效!!!亲测有效完美解决Array方法(map/filter/reduce)不按预期工作的正确解决方法,亲测有效!!!报错问题可能出现的原因解决思路解决方法1.确保回调函数正确返回值2.检查数组的数据类型3.使......
  • 完美解决 Async/await 不按预期工作 的正确解决方法,亲测有效!!!
    完美解决Async/await不按预期工作的正确解决方法,亲测有效!!!亲测有效完美解决Async/await不按预期工作的正确解决方法,亲测有效!!!报错问题可能出现的原因解决思路解决方法1.确保在`async`函数内部使用`await`2.正确返回Promise3.使用`try...catch`捕获错误4.......