当前位置: 首页 > news >正文

electron + vue3 + vite 主进程到渲染进程的单向通信

用示例讲解下主进程到渲染进程的单向通信
初始版本项目结构可参考项目:https://github.com/ylpxzx/electron-forge-project/tree/init_project

请添加图片描述

主进程到渲染进程(单向)

以Electron官方文档给出的”主进程主动触发动作,发送内容给渲染进程“为例。
实现整项目示例:https://github.com/ylpxzx/electron-forge-project/tree/main_to_render

mainWindow.webContents.send(消息名, 消息内容)

  • mainWindow是一个 BrowserWindow 实例,表示应用程序的主窗口
  • webContents是 mainWindow 的一个属性,允许你访问和控制窗口中的网页内容
  • send 方法用于从主进程向渲染进程发送异步消息

通信逻辑

  • src/main.js
    通过点击菜单栏的按钮,模拟主进程向渲染进程发送消息
    请添加图片描述具体来说,这段代码的作用是:从主进程向渲染进程发送一个名为 ‘update-counter’ 的消息。该消息携带一个参数值 1。在渲染进程中,你可以通过监听 ‘update-counter’ 事件来接收这个消息并进行相应的处理

    完整代码如下:

    import { app, BrowserWindow, Menu } from 'electron';
    import path from 'node:path';
    import started from 'electron-squirrel-startup';// Avoid Warning:Electron Security Warning (Insecure Content-Security-Policy) This renderer process has either no Content Security
    process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true";if (started) {app.quit();
    }const createWindow = () => {const mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {preload: path.join(__dirname, 'preload.js'),},});const menu = Menu.buildFromTemplate([{label: 'Menu',submenu: [{click: () => mainWindow.webContents.send('update-counter', 1),label: 'Increment'},{click: () => mainWindow.webContents.send('update-counter', -1),label: 'Decrement'}]}])Menu.setApplicationMenu(menu)if (MAIN_WINDOW_VITE_DEV_SERVER_URL) {mainWindow.loadURL(MAIN_WINDOW_VITE_DEV_SERVER_URL);} else {mainWindow.loadFile(path.join(__dirname, `../renderer/${MAIN_WINDOW_VITE_NAME}/index.html`));}mainWindow.webContents.openDevTools();
    };app.whenReady().then(() => {createWindow();app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow();}});
    });app.on('window-all-closed', () => {if (process.platform !== 'darwin') {app.quit();}
    });
    

    在这个示例中,当用户点击窗口菜单的Increment 时向渲染进程发送1,点击窗口菜单的Decrement时向渲染进程发送-1

  • src/preload.js

    preload.js 用于上下文隔离;将确保您的 预加载脚本Electron的内部逻辑 运行在所加载的webcontent网页之外的另一个独立的上下文环境里。 有助于阻止网站访问Electron 的内部组件和 预加载脚本可访问的高等级权限的API。简而言之就是提供一个入口给渲染进程(前端页面)使用,避免被攻击者随意调用electron内部API。

    该段代码的作用是向外暴露一个监听函数onUpdateCounter , 前端页面调用该方法进行监听。

    const { contextBridge, ipcRenderer } = require('electron/renderer')contextBridge.exposeInMainWorld('electronAPI', {onUpdateCounter: (callback) => ipcRenderer.on('update-counter', (_event, value) => callback(value)),
    })
    

页面示例

通信逻辑实现后,接下来就用一个页面来验证结果

  • src/vue-project/pages/mainToRenderTo/TwoWay.vue

    <template><div><div>click menu to set counter</div>Current value: <strong id="counter">{{ inputVal }}</strong></div>
    </template><script setup>
    import { ref } from 'vue'
    const inputVal = ref(0)
    electronAPI.onUpdateCounter((value) => {inputVal.value = inputVal.value + value
    })
    </script>
    
  • src/vue-project/router/index.js

    import { createWebHashHistory, createRouter } from 'vue-router'import HomeView from '@/vue-project/pages/home/index.vue'
    import MainToRender from '@/vue-project/pages/mainToRender/index.vue'const routes = [{ path: '/', component: HomeView },// 注册示例页面路由{ path: '/mainToRender', component: MainToRender },
    ]
    const router = createRouter({history: createWebHashHistory(),routes,
    })export default router;
    
  • src/vue-project/App.vue

    <template><h1>🖥️ Hello World!</h1><p>Welcome to your Electron application.</p><p><strong>Current route path:</strong> {{ $route.fullPath }}</p><nav><div><RouterLink to="/">Go to Home</RouterLink></div><div><RouterLink to="/mainToRender">Main-Process --> Render-Process</RouterLink></div></nav><div style="margin-top: 20px; border: 1px solid grey; padding: 20px; border-radius: 10px;"><router-view></router-view></div>
    </template><script setup>
    </script>
    

项目结构

请添加图片描述

相关文章:

electron + vue3 + vite 主进程到渲染进程的单向通信

用示例讲解下主进程到渲染进程的单向通信 初始版本项目结构可参考项目&#xff1a;https://github.com/ylpxzx/electron-forge-project/tree/init_project 主进程到渲染进程&#xff08;单向&#xff09; 以Electron官方文档给出的”主进程主动触发动作&#xff0c;发送内容给渲…...

《白帽子讲 Web 安全》之身份认证

目录 引言 一、概述 二、密码安全性 三、认证方式 &#xff08;一&#xff09;HTTP 认证 &#xff08;二&#xff09;表单登录 &#xff08;三&#xff09;客户端证书 &#xff08;四&#xff09;一次性密码&#xff08;OTP&#xff09; &#xff08;五&#xff09;多因…...

postgrel

首先按照惯例&#xff0c;肯定是需要对PostgreSQL数据库进行一系列信息收集的&#xff0c;常用的命令有以下这些&#xff1a;-- 版本信息select version();show server_version;select pg_read_file(PG_VERSION, 0, 200);-- 数字版本信息包括小版号SHOW server_version_num;SEL…...

Java基础——java8+新特性——方法引用(::)

1. 什么是方法引用&#xff1f; 定义&#xff1a;Java 8 引入的语法糖&#xff0c;用于 简化 Lambda 表达式&#xff0c;直接引用已有的方法。 符号&#xff1a;使用 :: 双冒号操作符。 本质&#xff1a;将方法作为函数式接口的实例传。 2. 方法引用的四种类型 类型 语法 …...

基于SpringBoot的商城管理系统(源码+部署教程)

运行环境 数据库&#xff1a;MySql 编译器&#xff1a;Intellij IDEA 前端运行环境&#xff1a;node.js v12.13.0 JAVA版本&#xff1a;JDK 1.8 主要功能 基于Springboot的商城管理系统包含管理端和用户端两个部分&#xff0c;主要功能有&#xff1a; 管理端 首页商品列…...

uniapp实现的个人中心页面(仿小红书)

采用 uniapp 实现的一款仿小红书个人中心页面模板&#xff0c;支持vue2、vue3, 同时适配H5、小程序等多端多应用。 简约美观大方 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?id22516 示例...

K8s面试题总结(十一)

1.如何优化docker镜像的大小&#xff1f; 使用多阶段构建&#xff08;multi-stage build&#xff09;选择更小的基础镜像&#xff08;如alpine&#xff09;减少镜像层数&#xff0c;合并RUN命令 2.请解释Docker中的网络模式&#xff08;如bridge,host,none) Bridge&#xff…...

用CMake编译glfw进行OpenGL配置,在Visual Studio上运行

Visual Studio的下载 Visual Studio 2022 C 编程环境 GLFW库安装 GLFW官网地址 GLFW官网地址&#xff1a;https://www.glfw.org下载相应版本&#xff0c;如下图&#xff1a; CMake软件进行编译安装 下载CMake 下载的如果是源码包&#xff0c;需要下载CMake软件进行编译安装…...

仿12306项目(4)

基本预定车票功能的开发 对于乘客购票来说&#xff0c;需要有每一个车次的余票信息&#xff0c;展示给乘客&#xff0c;供乘客选择&#xff0c;因此首个功能是余票的初始化&#xff0c;之后是余票查询&#xff0c;这两个都是控台端。对于会员端的购票&#xff0c;需要有余票查询…...

【GPT入门】第9课 思维树概念与原理

【GPT入门】第9课 思维树概念与原理 1.思维树概念与原理2. 算24游戏的方法 1.思维树概念与原理 思维树&#xff08;Tree of Thought&#xff0c;ToT &#xff09;是一种大模型推理框架&#xff0c;旨在解决更加复杂的多步骤推理任务&#xff0c;让大模型能够探索多种可能的解决…...

uniapp登录用户名在其他页面都能响应

使用全局变量 1、在APP.vue中定义一个全局变量&#xff0c;然后在需要的地方引用它&#xff1b; <script>export default {onLaunch: function() {console.log(App Launch)this.globalData { userInfo: {} };},onShow: function() {console.log(App Show)},onHide: fu…...

一周热点-OpenAI 推出了 GPT-4.5,这可能是其最后一个非推理模型

在人工智能领域,大型语言模型一直是研究的热点。OpenAI 的 GPT 系列模型在自然语言处理方面取得了显著成就。GPT-4.5 是 OpenAI 在这一领域的又一力作,它在多个方面进行了升级和优化。 1 新模型的出现 GPT-4.5 目前作为研究预览版发布。与 OpenAI 最近的 o1 和 o3 模型不同,…...

Linux基础--用户管理

目录 查看用户 使用命令: id 创建用户 使用命令: useradd ​编辑 为用户设置密码 使用命令: passwd ​编辑 删除用户 使用命令: userdel 创建用户组 使用命令: groupadd 删除用户组 使用命令: groupdel 用户设置 使用命令: usermod 将用户从组中去除 使用…...

软件测试的基础入门(二)

文章目录 一、软件&#xff08;开发&#xff09;的生命周期什么是生命周期软件&#xff08;开发&#xff09;的生命周期需求分析计划设计编码测试运行维护 二、常见的开发模型瀑布模型流程优点缺点适应的场景 螺旋模型流程优点缺点适应的场景 增量模型和迭代模型流程适应的场景…...

【SpringMVC】深入解析@ RequestMapping 注解的概念及使用和 MVC 介绍

Spring Web MVC入门 1. Spring Web MVC 什么是 Spring Web MVC&#xff1f; MVC官方文档介绍 Spring Web MVC是Spring框架中的一个用来做网站开发的部分&#xff0c;它是基于Servlet技术的。 虽然它的正式名字叫“Spring Web MVC”&#xff0c;但大家一般都简称它“SpringMVC”…...

YOLOv8 自定义目标检测

一、引言 YOLOv8 不仅支持预训练模型的推理&#xff0c;还允许用户将其应用于自定义对象检测。本文将详细介绍如何使用 YOLOv8 训练一个新的模型&#xff0c;并在自定义数据集上进行对象检测。 二、数据集准备 1. 数据集格式 YOLOv8 支持多种数据集格式&#xff0c;包括 CO…...

抓包分析工具介绍

什么是抓包分析工具&#xff1f; 抓包分析工具&#xff0c;也称为网络数据包嗅探器或协议分析器&#xff0c;用于捕获和检查网络上传输的数据包。这些数据包包含了网络通信的详细信息&#xff0c;例如请求的资源、服务器的响应、HTTP 头信息、传输的数据内容等等。通过分析这些…...

计算机毕业设计SpringBoot+Vue.js爱心捐赠项目推荐系统 慈善大数据(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Python----数据分析(Matplotlib四:Figure的用法,创建Figure对象,常用的Figure对象的方法)

一、Figure的用法 在 Matplotlib 中&#xff0c; Figure对象是整个绘图的顶级容器&#xff0c;它是所有绘图元素的基础&#xff0c; 提供了一个用于绘制图形的画布空间。 在 Matplotlib 中&#xff0c; Axes对象是进行数据绘制和设置坐标轴等操作的核心区域&#xff0c;它与 Fi…...

CameraX学习2-关于录像、慢动作录像

CameraX实现录像 首先在起预览时就要配置录像usecase&#xff0c;对于cameraX来说就是绑定录像usecase到lifecycle。如下。 1&#xff0c;创建Recorder对象&#xff0c;是与 VideoCapture 紧密耦合的 VideoOutput 实现。Recorder可以用来配置录像的分辨率、比例等&#xff0c;还…...

Java链接redis

一、准备工作就像谈恋爱 首先咱们得来点仪式感是不是&#xff1f;打开你的Maven&#xff08;Gradle玩家别打我&#xff09;&#xff0c;把这两个宝贝依赖给我焊死在pom.xml里&#xff1a; <!-- 经典永不过时的Jedis --> <dependency> <groupId>redis.cli…...

2025最新群智能优化算法:基于RRT的优化器(RRT-based Optimizer,RRTO)求解23个经典函数测试集,MATLAB

一、基于RRT的优化器 基于RRT的优化器&#xff08;RRT-based Optimizer&#xff0c;RRTO&#xff09;是2025年提出的一种新型元启发式算法。其受常用于机器人路径规划的快速探索随机树&#xff08;RRT&#xff09;算法的搜索机制启发&#xff0c;首次将RRT算法的概念与元启发式…...

VBA 数据库同一表的当前行与其他行的主键重复判断实现方案

目的&#xff0c;判断是否主键重复&#xff0c;不重复则登录新数据&#xff0c;重复则不登录。 定义类型&#xff1a; DataRecord   tableName 表名   rowNumber 行号   columnName 列名   data 数据 想要实现的代码逻辑如下&#xff1a; 模拟数据库的登录过程。假设…...

DeepSeek开启AI办公新模式,WPS/Office集成DeepSeek-R1本地大模型!

从央视到地方媒体&#xff0c;已有多家媒体机构推出AI主播&#xff0c;最近杭州文化广播电视集团的《杭州新闻联播》节目&#xff0c;使用AI主持人进行新闻播报&#xff0c;且做到了0失误率&#xff0c;可见AI正在逐渐取代部分行业和一些重复性的工作&#xff0c;这一现象引发很…...

android为第三方提供部分系统接口

文章目录 Settings - 亮灭屏Settings - 恢复出厂设置Settings - 数字锁屏/解锁Settings - 设置系统时间PackageInstaller - 安装/卸载第三方应用摘要:本文对系统模块进行改造,提供广播等形式的接口对外提供无法直接调用的系统级别接口,实现部分功能的集合。如果是广播形式,…...

Android 自定义View 加 lifecycle 简单使用

前言 本文是自定义view中最简单的使用方法&#xff0c;分别进行 ‘onMeasure’、‘onDraw’、‘自定义样式’、‘lifecycle’的简单使用&#xff0c;了解自定义view的使用。 通过lifecycle来控制 动画的状态 一、onMeasure做了什么&#xff1f; 在onMeasure中获取view 的宽和…...

在K8S中,svc底层是如何实现的?

在Kubernetes中&#xff0c;Service是集群内部的一个抽象层&#xff0c;用于定义一组Pod的逻辑分组&#xff0c;并提供统一的访问入口点&#xff0c;同时还可以对这些Pod提供负载均衡和网络代理功能。Service底层的实现主要包括以下几个关键组件和技术&#xff1a; 标签选择器…...

Python pyqt小技巧:默认打开某文件(即自动加载某文件)

文章目录 前言 前言 有的时候需要界面自动加载某文件。不需要人为在打开选择。 import os #自带 import sys # 获取该程序当前文件目录dir_name os.path.dirname(os.path.realpath(sys.argv[0])) f1 os.path.join(dir_name, 题目调度规程.xls) # 拼接路径 文件必须和程序在…...

vue2实现组件库的自动按需引入,unplugin-auto-import,unplugin-vue-components

1.使用ant-design-vue或者element-ui时&#xff0c;如何每个组件都去import导入组件&#xff0c;大大降低了开发效率&#xff0c;如果全局一次性注册会增加项目体积&#xff0c;那么如何实现既不局部引入&#xff0c;也不全局注册&#xff1f; 2.在element-plus官网看到有说明…...

C++第十节:map和set的介绍与使用

【本节要点】 1.关联式容器2.键值对3.map介绍与使用4.set介绍与使用5.multimap与multisedd的介绍与使用 一、关联式容器&#xff1a;数据管理的核心利器 关联式容器是STL中用于高效存储和检索键值对&#xff08;key-value pair&#xff09;的数据结构&#xff0c;其底层基于红黑…...