Electron 主进程与渲染进程、预加载preload.js

news2024/11/20 17:54:50

在 Electron 中,主要控制两类进程: 主进程渲染进程

Electron 应⽤的结构如下图:
在这里插入图片描述
如果需要更深入的了解electron进程,可以访问官网 流程模型 文档。

主进程

  • 每个 Electron 应用都有一个单一的主进程,作为应用程序的入口点(主进程具有唯一性)。任何 Electron 应用程序的入口都是 main 文件,负责控制应用的生命周期、创建和管理窗口、与操作系统进行交互等。
  • 主进程在 Node.js 环境中运行,它具有 require 模块和使⽤所有 Node.js API 的能力。
  • 主进程的核心:使用 BrowserWindow 来创建和管理应用程序窗口。

main.js 中,打印:

console.log(__dirname)
console.log('node版本:', process.versions.node)
console.log('chrome版本:', process.versions.chrome)
console.log('electron版本:', process.versions.electron)

在终端中输入结果如下:
在这里插入图片描述

注意:在主进程中执行的console.log()语句,都在vs code 的终端中输出,不会在electron 应用中打印。

main.js 中,打印 window

console.log(window)

报错:window is not defined…
在这里插入图片描述

渲染进程

每个 Electron 应用都会为每个打开的 BrowserWindow ( 与每个网页嵌入 ) 生成一个单独的渲染器进程。 洽如其名,渲染器负责 渲染 网页内容。

  • 每个 BrowserWindow 实例都对应⼀个单独的渲染进程。
  • 一个 Electron 窗口可以包含一个或多个渲染进程,每个渲染进程负责渲染网页内容并执行网页中的 JavaScript 代码。(关系类似于 浏览器、浏览器中的标签页)
  • 运行在渲染器进程中的代码,必须遵守网页标准。这意味着 渲染进程无权直接访问 require 或 使用 任何 Node.js API。
  • 渲染进程主要负责呈现用户界面、响应用户交互、执行网页中的业务逻辑等。

pages/index.html 中:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      http-equiv="Content-Security-Policy"
      content="default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;"
    />
    <title>Hello Electron!</title>
  </head>
  <body>
    <h1>Hello Electron!</h1>
    We are using Node.js 
    <span id="node-version"></span>, Chromium
    <span id="chrome-version"></span>, and Electron
    <span id="electron-version"></span>.
  </body>
  <script src="./render.js"></script>
</html>

pages/render.js 中:

console.log(window)
console.log(process)

在应用窗口中查看打印结果:
在这里插入图片描述

window能成功打印,console.log(process)报错:process is not defined…

pages/render.js 中,不能访问 Node.js API。那么,该如何实现在index.html中展示chrome、node、electron的版本呢?

处于渲染器进程的用户界面,该怎样才与 Node.js 和 Electron 的原生桌面功能进行交互?


通过预加载脚本从渲染器访问Node.js


预加载(preload)脚本在 Electron 应用中起着重要的桥梁作用,它允许渲染进程安全地与主进程进行交互,同时增强了应用的安全性和性能。

预加载(preload)脚本在渲染器进程加载之前加载,并有权访问两个 渲染器全局 (例如 windowdocument) 和 Node.js 环境。

预加载(preload)脚本是运行在渲染器进程中的,但它是在网页内容加载之前执行的。 这意味着它具有比普通渲染器更高的权限,可以访问 Node.js API ,同时也可以与网页内容进行更安全的交互。

创建一个名为 preload.js 的新脚本如下:

// contextBridge:在隔离的上下文中创建一个安全的、双向的、同步的桥梁。
const {contextBridge} = require('electron')

// 暴露数据给渲染进程
contextBridge.exposeInMainWorld('aaaAPI', {
  version: process.version,
  versions: process.versions,
  num: 666
})

在主线程中引⼊ preload.js

const { app, BrowserWindow } = require('electron')
// 导入 Node.js 的 path 模块
const path = require('node:path')

// 修改已有的 createWindow() 方法
function createWindow() {
  const win = new BrowserWindow({
    width: 500, // 窗口宽度
    height: 300, // 窗口高度
    autoHideMenuBar: true, // 隐藏菜单栏
    webPreferences: {
      // 此处只能使用绝对路径
      preload: path.join(__dirname, 'preload.js')
    }
  });

  // 在窗口中加载一个远程页面
  win.loadFile('./pages/index.html');
}

执行npm start,启动应用,打开应用的控制台。
可以看到pages/render.js打印的window
在这里插入图片描述

完善pages/render.js,在渲染进程中使用versions,实现在 pages/index.html 页面展示版本信息:

let nodeDom = document.getElementById('node-version')
let chromeDom = document.getElementById('chrome-version')
let electronDom = document.getElementById('electron-version')

const { node, chrome, electron } = aaaAPI.versions

nodeDom.innerHTML = node
chromeDom.innerHTML = chrome
electronDom.innerHTML = electron

查看应用窗口渲染结果:
在这里插入图片描述


现在,项目的目录结构如下图所示:
在这里插入图片描述
注意: 预加载(preload)脚本只能访问部分 Node.js API,但是主进程可以访问全部API。此时,需要使用进程通信。

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

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

相关文章

如何通过VSM识别生产过程中的信息流浪费?

VSM&#xff08;价值流图&#xff09;&#xff0c;作为精益生产的核心工具之一&#xff0c;它不仅仅是一张简单的流程图&#xff0c;更是企业优化生产流程、提升价值传递效率的指南针。通过VSM&#xff0c;我们可以清晰地看到从原材料到成品交付的全过程&#xff0c;包括物料流…

kafka集群跨双网段及多网段通信问题解决(避免踩坑)

一、问题场景&#xff1a; 实际生产环境总存在很多kafka集群跨网段的问题。kafka集群可能存在多个网卡&#xff0c;对应多个网段。不同网段之间需要同时与集群通信&#xff0c;即跨网段生产消费问题。 单机 # broker 的唯一标识符&#xff0c;在 Kafka 集群中必须唯一 broker.…

uniapp修改uni-ui组件样式(对微信小程序/H5有效,vue3)

寻找要修改的样式 使用开发者工具找到具体要修改的class类名 修改 <style lang"scss">//.nav为上一级的class.nav::v-deep .uni-navbar--border {border-bottom-style: none !important;} </style>完整代码 <template><view><uni-na…

基于SpringBoot+Vue的在线考试管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

24年Novartis诺华制药社招入职SHL测评:综合能力、性格问卷、动机问卷高分攻略

尊敬的求职者&#xff0c;若您渴望在医药行业的领军企业——诺华制药——开启您的职业生涯&#xff0c;深入了解其社招与校招测评流程至关重要。以下是对诺华SHL测评题型的全面解读&#xff0c;助您在招聘季脱颖而出。 测评构成 诺华的招聘测评由以下三个部分组成&#xff1a…

Arthas trace (方法内部调用路径,并输出方法路径上的每个节点上耗时)

文章目录 二、命令列表2.3 monitor/watch/trace/stack/tt 相关2.3.3 trace &#xff08;方法内部调用路径&#xff0c;并输出方法路径上的每个节点上耗时&#xff09;举例1&#xff1a;查看方法整体耗时举例2&#xff1a;trace次数限制 本人其他相关文章链接 二、命令列表 2.3…

【项目总结】工程构建思路分析与分享

背景 写这篇文章的初衷是因为国产化项目临近结束&#xff0c;在做项目总结时&#xff0c;回想起了代码管理的相关问题。虽然工程搭建及管理是一个高级工程师必备的能力&#xff0c;但似乎每次一个新项目立项&#xff0c;都是从老的项目中拷贝工程框架&#xff0c;再进行定制修…

【C++】C++17中可以存储任意类型数据的对象——any类的使用与设计思想

目录 引言 any类的使用 构造 号运算符重载 std::any::swap std::any::has_value std::any::type std::any::reset std::any_cast any类的设计思想 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 C专栏&#xff1a;C_东洛的克莱斯韦克的博客-CSDN博客 引言 一提到存…

按键 tab 则 切换输入框, 按键 ↑↓ 则 加减数值

1) 页面内输入框,按键 tab 则 切换输入框, 按键 ↑↓ 则 加减数值 2) 思路 1、按键 tab切换input框&#xff0c;默认tab切换会聚焦到浏览器地址栏&#xff08;F12时会聚焦到开发者工具选项&#xff09;&#xff0c;我们需要阻止该默认事件。 2、进入页面就聚焦到第一个输入框…

【JAVA基础】lombok的@Data会生成什么?和无参构造器有关系吗

问题&#xff1a; 前提&#xff1a;实体中有三个属性&#xff1b;问题一、lombok在实体上如果只加Data会生成哪些构造器。问题二 编译器默认生成无参构造器&#xff0c;如果自己写了有一个参数的构造器&#xff0c;还会生成默认的无参构造器吗 &#xff1f; 问题一解答 当在Jav…

免费送源码:Java+B/S+ssm+MySQL 公众养老服务网上预订系统 计算机毕业设计原创定制

摘 要 本论文主要论述了如何使用JAVA语言开发一个公众养老服务网上预订系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;SSM框架进行开发。在引言中&#xff0c;作者将论述公众养老服务网上预订系统的当前背景以及系统开发…

本地生活服务项目有哪些:如何利用本地生活市场,打开线下流量!

随着各大互联网公司在本地生活服务板块的布局力度持续加大&#xff0c;越来越多的人都开始意识到了它背后所蕴含着的发展前景和收益潜力&#xff0c;进而纷纷打听起了与之相关的消息。而就小编与多位创业者的交流情况而言&#xff0c;在众多问题中&#xff0c;属本地生活服务项…

巨控协议转换网关GRM321GRM322GRM323应用场景

巨控工业协议网关GRM321,GRM322,GRM323是网口型网关&#xff0c;支持各种PLC的TCP协议&#xff0c;具备多路RS485,RS232和三个TCP网口。能实现RS485&#xff0c;RS232和TCP的工业协议的零代码无缝转换&#xff0c;能极大节约工程师编程时间&#xff0c;保障数据采集的可靠性。 …

遥感图像分割

遥感图像分割是一种应用于遥感图像的计算机视觉技术&#xff0c;用于将图像划分为不同的区域&#xff0c;每个区域代表地表的不同特征&#xff0c;如水体、森林、城市区域等。这种分割帮助我们更好地理解和分析地球表面的变化&#xff0c;对于环境监测、城市规划、农业、灾害管…

阿里云ACP云计算高级工程师知识点,超详细,看完就够了!

本文以访问控制章节知识点为例&#xff0c;不说废话直接上干货&#xff01; 考法1&#xff1a;VPC访问控制方式对比 1.VPC可以通过安全组、防火墙、RDS白名单、SLB白名单等方式进行访问控制。 2.专有网络内的ECS使用安全组防火墙进行三层网络访问控制&#xff0c;ACL进行二层…

基于STM32的无人驾驶汽车路径规划与视觉识别系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 摄像头图像采集与处理路径规划算法实现实时视觉障碍物检测电机控制与执行应用场景结论 1. 引言 无人驾驶技术是当前自动化和人工智能领域的热门课题之一&#xff0c;涉及到复杂的感知、…

Python数据分析和可视化详解

Python数据分析和可视化详解 Python 是当前最受欢迎的数据分析和可视化工具之一。凭借其简单的语法和强大的第三方库&#xff0c;Python 为数据科学家、分析师和工程师提供了广泛的工具&#xff0c;用于处理、分析和展示数据。本文将介绍如何使用 Python 进行数据分析与可视化…

【NLP修炼系列之玩转LLM】基于 P-Tuning的高效微调ChatGLM方法

引言 上周给大家介绍了另一种基于LORA的高效微调ChatGLM-6B模型的方法。本周分享一下另一种高效的微调方法——P-Tuning v2方法&#xff0c;同时在文章的最后对比一下两种高效微调方法的效果怎么样&#xff0c;只有自己动手做实验了才能很客观的看出哪种方法效果更好&#xff…

超详细超实用!!!AI编程之cursor编写设计模式迪米特法则实例(八)

云风网 云风笔记 云风知识库 一、设计模式迪米特法则定义 只与你的直接朋友交谈&#xff0c;不跟“陌生人”说话 其含义是&#xff1a;如果两个软件实体无须直接通信&#xff0c;那么就不应当发生直接的相互调用&#xff0c;可以通过第三方转发该调用。其目的是降低类之间的耦…

leetcode面试题 03.04. 化栈为队

实现一个MyQueue类&#xff0c;该类用两个栈来实现一个队列。 示例&#xff1a; MyQueue queue new MyQueue();queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false 说明&#xff1a; 你只能使用标准的栈操作 -…