第3章:Electron的核心概念(2)

3.4 预加载脚本

预加载脚本在渲染进程加载前执行,允许在渲染器上下文中暴露自定义 API,并提供与主进程安全通信的桥梁。使用预加载脚本可以提高应用的安全性,尤其是在启用了 contextIsolation 的情况下。

3.4.1 创建预加载脚本

预加载脚本在 webPreferences 中指定。以下是一个简单的预加载脚本示例:

示例代码

preload.js

const { contextBridge, ipcRenderer } = require('electron');contextBridge.exposeInMainWorld('electronAPI', {sendMessage: (message) => ipcRenderer.send('message', message),onMessage: (callback) => ipcRenderer.on('reply', (event, args) => callback(args))
});

主进程

const { app, BrowserWindow } = require('electron');
const path = require('path');let mainWindow;const createWindow = () => {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {preload: path.join(__dirname, 'preload.js')  // 指定预加载脚本}});mainWindow.loadFile('index.html');
};app.on('ready', createWindow);app.on('window-all-closed', () => {if (process.platform !== 'darwin') {app.quit();}
});app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow();}
});

渲染进程

<!DOCTYPE html>
<html><head><title>IPC Example with Preload</title></head><body><h1>Check the console</h1><script>window.electronAPI.sendMessage('Hello from renderer');window.electronAPI.onMessage((message) => {console.log(message); // 输出 'Hello from main'});</script></body>
</html>

通过使用预加载脚本,你可以确保在

渲染进程中暴露的 API 是受控且安全的。这种方法特别适用于在启用了 contextIsolation 时,确保主进程与渲染进程之间的通信安全。

3.5 进程间通信(IPC)

IPC 是主进程和渲染进程之间进行通信的重要机制。Electron 提供了 ipcMainipcRenderer 模块来实现进程间通信。

3.5.1 ipcMain 模块

ipcMain 模块在主进程中使用,用于接收渲染进程发送的消息并进行处理。

示例代码
const { ipcMain } = require('electron');ipcMain.on('message', (event, arg) => {console.log(arg); // 输出 'Hello from renderer'event.reply('reply', 'Hello from main');
});

3.5.2 ipcRenderer 模块

ipcRenderer 模块在渲染进程中使用,用于发送消息到主进程和接收主进程的回复。

示例代码
<!DOCTYPE html>
<html><head><title>IPC Example</title></head><body><h1>Check the console</h1><script>const { ipcRenderer } = require('electron');ipcRenderer.send('message', 'Hello from renderer');ipcRenderer.on('reply', (event, arg) => {console.log(arg); // 输出 'Hello from main'});</script></body>
</html>

3.6 使用 contextBridge 提高安全性

在启用了 contextIsolation 的情况下,可以使用 contextBridge 模块来暴露安全的 API 给渲染进程。这可以防止渲染进程直接访问 Node.js 的功能,从而提高安全性。

3.6.1 contextBridge 示例

使用 contextBridge 将安全的 API 暴露给渲染进程。

示例代码

preload.js

const { contextBridge, ipcRenderer } = require('electron');contextBridge.exposeInMainWorld('electronAPI', {sendMessage: (message) => ipcRenderer.send('message', message),onMessage: (callback) => ipcRenderer.on('reply', (event, args) => callback(args))
});

主进程

const { app, BrowserWindow } = require('electron');
const path = require('path');let mainWindow;const createWindow = () => {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {preload: path.join(__dirname, 'preload.js'),contextIsolation: true  // 启用上下文隔离}});mainWindow.loadFile('index.html');
};app.on('ready', createWindow);app.on('window-all-closed', () => {if (process.platform !== 'darwin') {app.quit();}
});app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow();}
});

渲染进程

<!DOCTYPE html>
<html><head><title>Context Bridge Example</title></head><body><script>window.electronAPI.sendMessage('Hello from renderer');window.electronAPI.onMessage((message) => {console.log(message); // 输出 'Hello from main'});</script></body>
</html>

通过本章内容,你已经了解了 Electron 的核心概念,包括主进程和渲染进程的角色与功能、预加载脚本的使用、以及如何通过 IPC 进行进程间通信,并且在启用 contextIsolation 时,使用 contextBridge 提高应用的安全性。在接下来的章节中,我们将深入探讨如何实现更多高级功能和最佳实践,帮助你进一步掌握 Electron 开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/36747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker Compose】掌握容器资源管理:高效限制CPU与内存使用

【Docker Compose】掌握容器资源管理:高效限制CPU与内存使用 一、Docker Compose 介绍1.1 Docker Compose简介1.2 Docker Compose V2简介1.3 Docker Compose V1与V2版本区别1.4 docker-compose.yaml部署文件介绍二、检查本地docker环境2.1 本地环境规划2.2 检查docker版本2.3 …

43.三倍游戏

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/390 题目描述 三倍游戏是一种单人游戏。玩…

基于51单片机心形LED流水灯电路原理图、PCB和源程序(SCH、PCB源文件)

资料下载地址&#xff1a;基于51单片机心形LED流水灯电路原理图、PCB和源程序&#xff08;SCH、PCB源文件&#xff09; 1、单片机心形LED流水灯功能说明&#xff1a; 单片机&#xff1a;无论是散件还是成品&#xff0c;单片机里面都烧录有LED 流水灯的程序&#xff0c;装上单片…

TCP重传机制

TCP重传机制是为了确保数据可靠传输而设计的&#xff0c;当传输的数据包丢失或损坏时&#xff0c;TCP会重新发送这些数据包。TCP重传主要有以下几种方式&#xff1a; 超时重传&#xff08;Timeout Retransmission&#xff09;&#xff1a; 当发送方发送一个数据包后&#xff…

【Promise】聊聊任务队列

历史小剧场 现实是残酷的&#xff0c;而今这个世界&#xff0c;要活下去&#xff0c;必死需要更大的勇气。 但崇祯的死&#xff0c;并非懦弱&#xff0c;而是一种态度&#xff0c;负责人的态度。 我说过&#xff0c;所谓王朝&#xff0c;跟公司单位差不多&#xff0c;单位出了事…

fly_bid项目

Ncurses库&#xff1a; 提供了创建窗口界面&#xff0c;移动光标&#xff0c;产生颜色&#xff0c;处理键盘按键功能问题等功能。 vim界面&#xff0c;内核配置界面&#xff08;make menuconfig&#xff09; #include<stdio.h> #include<curses.h>int main(int …

【UE 网络】RPC远程过程调用 入门篇

目录 0 引言1 RPC基本概念1.1 定义1.2 分类 2 RPC的使用2.1 Client RPC2.2 Server RPC2.3 Multicast RPC &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xff1a;【UE 网络】RPC远程过程调用 入门篇❣️ 寄语…

(七)React:useEffect的理解和使用

1. useEffect的概念理解 useEffect是一个React Hook函数&#xff0c;用于React组件中创建不是由事件引起而是由渲染本身引起的操作&#xff0c;比如发送AJAX请求&#xff0c;更改DOM等等 说明&#xff1a;上面的组件中没有发生任何的用户事件&#xff0c;组件渲染完毕之后就需…

Modbus TCP与TCP/IP协议间的差异与应用场景

Modbus TCP概述 Modbus协议简介 Modbus是一种专为工业自动化系统设计的通信协议&#xff0c;采用主从模式&#xff0c;即一个主设备&#xff08;通常是计算机或可编程逻辑控制器&#xff09;与多个从设备&#xff08;如传感器、执行器等&#xff09;进行通信。Modbus协议具有…

项目优化方案之---实现单设备登录限制

对于一些付费会员或者一些商业项目&#xff0c;为了保证单个用户的账号权益不会被滥用&#xff0c;并且提高系统的安全性&#xff0c;我们会限制单个账号在同一时间内只能有一台设备登录&#xff0c; 来给系统添加共享账号的检测能能力 这里是根据jwt实现的&#xff0c;要实现…

K8S集群进行分布式负载测试

使用K8S集群执行分布式负载测试 本教程介绍如何使用Kubernetes部署分布式负载测试框架&#xff0c;该框架使用分布式部署的locust 产生压测流量&#xff0c;对一个部署到 K8S集群的 Web 应用执行负载测试&#xff0c;该 Web 应用公开了 REST 格式的端点&#xff0c;以响应传入…

初探Xcode工具

初探Xcode工具 Xcode是苹果公司为Mac OS X和iOS平台开发软件的集成开发环境&#xff08;IDE&#xff09;。作为苹果开发者的首选工具&#xff0c;Xcode提供了一系列强大的功能&#xff0c;帮助开发者设计、编写、调试和发布应用程序。本文将对Xcode进行初步探索&#xff0c;介…

【吴恩达深度学习笔记系列】Logistic Regression 【理论】

Binary Classification: Logistic Regression: y ^ σ ( w T x b ) \hat{y}\sigma{(w^T xb)} y^​σ(wTxb) using sigmoid function σ 1 1 e − z \sigma \frac{1}{1e^{-z}} σ1e−z1​. 【torch.sigmoid(x)】 Sigmoid ( x ) 1 1 e − x \text{Sigmoid}(x)\frac{1}{…

综合评价 | 基于组合博弈赋权的物流系统综合评价(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 综合评价 | 基于组合博弈赋权的物流系统综合评价&#xff08;Matlab&#xff09; 组合博弈赋权&#xff08;Weighted Sum&#xff09;是一种常见的多目标决策方法&#xff0c;用于将多个目标指标进行综合评估和权衡…

Spring Boot中的国际化配置

Spring Boot中的国际化配置 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中实现国际化配置&#xff0c;使得应用能够轻松…

Android焦点窗口设定

我们经常会遇到一种Application does not hava focused window的ANR异常&#xff0c;这种异常一般是没有焦点窗口FocusedWindow导致,且这类异常只会发生在key事件的派发&#xff0c; 因为key事件是需要找到一个焦点窗口然后再派发&#xff0c;而触摸事件只需要找到当前显示的窗…

运维锅总详解HAProxy

本文尝试从HAProxy简介、HAProxy工作流程及其与Nginx的对比对其进行详细分析&#xff1b;在本文最后&#xff0c;给出了为什么Nginx比HAProxy更受欢迎的原因。希望对您有所帮助&#xff01; HAProxy简介 HAProxy&#xff08;High Availability Proxy&#xff09;是一款广泛使…

mysql 语句如何优化

MySQL语句的优化是一个复杂但重要的过程&#xff0c;因为它可以显著提高数据库的性能。以下是一些建议和方法&#xff0c;用于优化MySQL查询和语句&#xff1a; 1. 使用EXPLAIN分析查询 EXPLAIN是一个很有用的命令&#xff0c;它可以显示MySQL如何使用索引来处理SELECT语句。…

springboot在线考试 LW +PPT+源码+讲解

第三章 系统分析 3.1 可行性分析 一个完整的系统&#xff0c;可行性分析是必须要有的&#xff0c;因为他关系到系统生存问题&#xff0c;对开发的意义进行分析&#xff0c;能否通过本系统来补充线下在线考试管理模式中的缺限&#xff0c;去解决其中的不足等&#xff0c;通过对…

解释Android开发中常见的MVC、MVP和MVVM设计模式及其优缺点

在Android开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;、MVP&#xff08;Model-View-Presenter&#xff09;和MVVM&#xff08;Model-View-ViewModel&#xff09;是三种常见的设计模式&#xff0c;它们各自在解决不同问题时有其独特的优势和局限性。下…