electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互

这篇具有很好参考价值的文章主要介绍了electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引入

electron项目常常由一个主进程和多个渲染进程构成,渲染进程之间是隔离的,而所有渲染进程都和主进程共享资源。

  • 所有的渲染进程都是由主进程创建的
  • 每个窗口都对应着一个渲染进程
  • 所有的渲染进程共享一个主进程

我们主进程与渲染进程交互,渲染进程与渲染进程交互【多窗口交互】,都需要借助ipc通信来实现
封装加载进度显示,新建窗口 演示主进程与渲染进程通信
demo项目地址
官方ipc进程通信讲解教程
electron官方文档ipc通信

IPC通信[主/渲染]进程对应

方向 主进程【ipcMain】 渲染进程【ipcRenderer】
渲染=>主 【同步/异步】 ipcMain.on() ipcRender.send() / ipcRender.sendSync() 【同步取值】
渲染=>主 【异步】 ipcMain.handle() ipcRender.invoke()
主=>渲染 【异步】 BrowserWindow【实例】.webContents.send() ipcRender.on()

渲染进程=>主进程

electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互,electron+vue3全家桶,electron,ipc通信,进程交互,vue3全家桶

代码测试

1.我们创建一个ipc测试文件,ipcDemo.ts

  • electron\main\ipcDemo.ts
  • 注意:按官方文档来看,sendSync和handle中的return,是属于双向通信,这里为了方便演示同步/异步,直接拿他们来做演示,其实实际使用看来,只要不返回值,完全也可以当做单向通信
import { ipcMain } from "electron";

export const initIpcDemo = () => {
  // 同步处理通信,并等待主进程返回值
  ipcMain.on("event-on-test", (e, data: string) => {
    setTimeout(() => {
      e.returnValue = "主进程同步响应:" + data;
    }, 2000);
  });

  // 异步处理通信,异步返回结果
  ipcMain.handle("event-handle-test", (e, data: string) => {
      return "主进程异步响应:" + data;
  });

  // 异步处理一次
  ipcMain.handleOnce("event-handleOnce-test", (e) => {
    console.log("异步通信处理一次!");
  });
};

2.接着我们在electron的入口文件中引入

  • electron\main\index.ts
import {initIpcDemo} from './ipcDemo'

// 初始化ipc通信Demo
initIpcDemo();

3.我们创建一个ipcDemo的.vue文件,测试渲染进程=>主进程的单向通信:

  • src\components\demo\ipcDemo.vue
<template>
  <div>
    <go-back></go-back>
    <ul>
      <li><el-button @click="eventOnTest">同步通信测试</el-button></li>
      <li><el-button @click="eventHandleTest">异步通信测试</el-button></li>
      <li><el-button @click="eventHandleOnceTest">异步通信一次</el-button></li>
    </ul>
  </div>
</template>

<script setup lang="ts">
import { ipcRenderer } from "electron";
import { onMounted, onUnmounted } from "vue";
// 同步通信测试
function eventOnTest() {
  const result = ipcRenderer.sendSync("event-on-test", "狼来了");
  console.log(result);
}

// 异步通信测试
function eventHandleTest() {
  ipcRenderer.invoke("event-handle-test", "小龙你好").then((res) => {
    console.log(res);
  });
}

// 异步通信一次
function eventHandleOnceTest() {
  ipcRenderer.invoke("event-handleOnce-test");
}
</script>

<style scoped lang="scss"></style>

4.补充对应的页面路由后,我们看一下测试结果

测试效果

electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互,electron+vue3全家桶,electron,ipc通信,进程交互,vue3全家桶

主进程=>渲染进程

electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互,electron+vue3全家桶,electron,ipc通信,进程交互,vue3全家桶

代码测试

1.我们在主窗口初始化完毕的地方补充代码逻辑,创建一个定时器每隔两秒向渲染进程发送消息

  • electron\main\index.ts
 let number = 1;
  setInterval(() => {
    if (win && win.webContents) {
      win.webContents.send("event-from-main", "计数" + number++);
    }
  }, 2000);

electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互,electron+vue3全家桶,electron,ipc通信,进程交互,vue3全家桶

2.渲染进程补充监听:

+src\components\demo\ipcDemo.vue

<script setup lang="ts">
    onMounted(()=>{
      ipcRenderer.on("event-from-main",eventFromMain);
    });
    
    // 来自主进程的消息
    function eventFromMain(e:any,data:string){
      console.log("监听到消息",data)
    }

    onUnmounted(()=>{
      ipcRenderer.removeListener("event-from-main",eventFromMain);
    });
</script>

测试效果

electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互,electron+vue3全家桶,electron,ipc通信,进程交互,vue3全家桶

双向通信

按官方文档来看,主进程handle并return,渲染进程用promise语法,或主进程on并e.returnValue,渲染进程用sendSync就是双向通信
electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互,electron+vue3全家桶,electron,ipc通信,进程交互,vue3全家桶
这里我个人认为多窗口间的双向通信适合用下面的写法,上面的写法在渲染进程=>主进程中已经演示,故不赘述,这里主要演示下下面的使用
electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互,electron+vue3全家桶,electron,ipc通信,进程交互,vue3全家桶

代码测试

1.主进程补充逻辑,在收到渲染进程的调用后,主动给渲染进程的窗口发送消息

  • electron\main\ipcDemo.ts
import { ipcMain } from "electron";

export const initIpcDemo = () => {
  // 双向通信处理
  ipcMain.handle("event-handle-togeter-test", (e, data: string) => {
    e.sender.send("event-handle-togeter-test", "主进程通知" + data);
  });
};

2.测试代码补充逻辑

  • src\components\demo\ipcDemo.vue
<template>
  <div>
    <ul>
      <li>
        <el-button @click="eventHandleTogeterTestClick">双向通信</el-button>
      </li>
    </ul>
  </div>
</template>

<script setup lang="ts">
import { ipcRenderer } from "electron";
import { onMounted, onUnmounted } from "vue";

onMounted(()=>{
  ipcRenderer.on("event-handle-togeter-test",eventHandleTogeterTest);
});

function eventHandleTogeterTestClick(){
  ipcRenderer.invoke("event-handle-togeter-test","奥利给");
}

// 双向通信测试
function eventHandleTogeterTest(e:any,data:string) {
  console.log("渲染进程监听到:",data);
}

onUnmounted(()=>{
  ipcRenderer.removeListener("event-handle-togeter-test",eventHandleTogeterTest);
});
</script>

<style scoped lang="scss"></style>

测试效果

  • 这里我们可以思考一下,假如我需要点击一个窗口的按钮,通知另一个窗口操作,就可以利用双向通信,将另一个窗口的id传递给主进程以及对应的消息,主进程通过窗口id找到对应窗口,然后主动通知窗口进行对应操作

electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互,electron+vue3全家桶,electron,ipc通信,进程交互,vue3全家桶文章来源地址https://www.toymoban.com/news/detail-687551.html

到了这里,关于electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • electron+vue3全家桶+vite项目搭建【16.1】electron多窗口,pinia状态同步,扩展store方法,主动同步pinia的状态【推荐】

    demo项目地址 我们之前写了一个自动同步pinia状态的插件,可以参考如下文章 electron+vue3全家桶+vite项目搭建【16】electron多窗口,pinia状态无法同步更新问题解决 这里面有一个较大的弊端,就是pinia中的store,只要其中的某个属性修改,就会触发这个store的全量更新,当我们有一

    2024年02月11日
    浏览(49)
  • vue vite ts electron ipc arm64

    系统:debian 12 vscode 安装 TypeScript Vue Plugin (Volar)、Vue Language Features (Volar)、C/C++ 扩展 新建 plugins、src/electron 文件夹 添加 src/electron/background.ts 属于主进程 ipcMain.on、ipcMain.handle 都用于主进程监听 ipc,ipcMain.on 用于监听 ipcRenderer.send,ipcMain.handle 用于监听 ipcRenderer.invoke 并 return

    2024年02月15日
    浏览(29)
  • 基于Electron24+Vite4+Vue3搭建桌面端应用

    一说到创建桌面应用,就不得不提及Electron和Tauri框架。这次给大家主要分享的是基于electron最新版本整合vite4.x构建vue3桌面端应用程序。 之前也有使用vite2+vue3+electronc创建桌面端项目,不过  vue-cli-plugin-electron-builder  脚手架插件构建的项目electron版本只有13.x。如今electron版本

    2024年02月06日
    浏览(37)
  • 现有的vue3+ts+vite项目集成electron

    Electron是使用JavaScript,HTML和CSS构建跨平台的桌面应用程序框架。 Electron兼容Mac、Windows和Linux,可以构建出三个平台的应用程序。 安装依赖 原来有一个vue3+ts+vite+pnpm的项目,其中sub-modules是子项目,web是主入口项目,项目结构如下: 需要将其转换成Electron项目,只需要在原来

    2024年02月12日
    浏览(39)
  • 快速搭建Electron+Vite3+Vue3+TypeScript5脚手架 (无需梯子,快速安装Electron)

    Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发经验(这段话是来自官网)。 根据vite官网文档 项目创建完成后进

    2024年02月02日
    浏览(79)
  • 使用vue3+vite+elctron构建小项目介绍Electron进程间通信

    进程间通信 (IPC) 是在 Electron 中构建功能丰富的桌面应用程序的关键部分之一。 由于主进程和渲染器进程在 Electron 的进程模型具有不同的职责,因此 IPC 是执行许多常见任务的唯一方法,例如从 UI 调用原生 API 或从原生菜单触发 Web 内容的更改。 在 Electron 中,进程使用 ipcM

    2024年02月06日
    浏览(38)
  • electron+Vue3构建桌面应用之IPC通讯

    最近在做一个C/S架构的项目预研 过程中遇到 Electron 与 Vue3 通讯的问题,费劲巴力的在网上找方案,发现都不理想,最终攻克之后,计划将过程写下来,供有需求的同学白嫖! 开始之前,先说一件重要的事情: 看文档 看官方文档 一定要看官方文档 好,言归正传。 先说需求

    2024年04月29日
    浏览(24)
  • vite+ vue3(现有项目或者新项目)+electron打包教程,以及electron代码热重载页面(保姆级教程),一文带你走完全过程

      1.删掉type这个字段,不然会报错  2.然后加上\\\"main\\\": \\\"electron/main.js\\\",  3.在scripts字段中加入启动electron的命令:如下图 5.这时候你去打开控制台输入输入npm run start会得到一片空白,展示如下页面 1.因为现在监听的是vue打包后的dist文件夹中的index.html 2.我就不教你们怎么打开那个

    2024年02月11日
    浏览(35)
  • vite搭建vue3项目

    参考视频 创建一个项目名称的文件夹 执行命令:npm init -y 快速的创建一个默认的包信息 安装vite: npm i vite -D -D开发环境的依赖 安装vue,现在默认是vue3. 执行命令: npm i vue -D/-S都可以 创建index.html文件,src=“入口js文件” ,添加id=\\\"app\\\"挂载点 创建src目录下的js入口文件main.js 创建

    2024年02月09日
    浏览(33)
  • Vue3+Vite项目搭建

    技术栈:vue3+ts+vite+vue-router+element-plus+pinia 为什么选择vite而不是vue-cli: vite 是一个基于 Vue3 单文件组件的非打包开发服务器,它做到了本地快速开发启动: 快速的冷启动,不需要等待打包操作; 即时的热模块更新,替换性能和模块数量的解耦让更新飞起; 真正的按需编译,

    2024年02月08日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包