图解 Electron 进程模型

在这里插入图片描述

此前,已经介绍了《如何从 0 开始,创建一个 Electron 的 App》,每个人就有了一个梦开始的地方。如果想实现一个功能丰富的 App,了解一点基础知识,是非常必要的。比如,Electron 的进程模型。

一、简介 Chrome 的进程模型

Chrome 浏览器是多进程的结构,使用一个管理器,来管理多个页面进程,每个页面存在一个沙盒中,如果崩溃了,也不会影响其他的页面。

插图,Chrome浏览器进程管理模型

从上图我们看到,每个页面独占一个进程,管理器负责管理所有的页面。这种架构,使得浏览器的稳定性加强,但是资源占用更加庞大,系统架构也更加复杂。

二、Electron 的进程模型

Electron的进程模型图

Electron 的进程模型参考 Chrome,也存在一个管理器进程,即主进程,这是一个系统进程,启动的时候,会首先加载我们项目里的 main.js 文件,这个文件的路径,需要在 package.json 文件里配置,用 main 这个 key,告诉 electron 启动的时候,去哪个路径找入口文件,显然,入口文件的名字也是可以改的。

{
  "name": "my-electron-app",
  "version": "1.0.0",
  "description": "Hello World!",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Jane Doe",
  "license": "MIT",
  "devDependencies": {
    "electron": "23.1.3"
  }
}

上面是一个 package.json 的代码范例,注意第 5 行。

这个主进程,暴露给开发者的接口,是一个对象 —— app,在上篇系列文章中,我们可以看看 main.js 的代码,里面引用的 app 对象,就是主进程的句柄。

而 Web 网页,是通过另一个进程加载的,就是 BrowserWindow,我们在 appready 回调里,创建浏览器窗口对象,并加载我们写好的网站 App,至此完成了一个 Electron 的应用的启动和加载。

const { app, BrowserWindow } = require('electron')

const createWindow = () => {
  const win = new BrowserWindow({
    width: 800,
    height: 600
  })

  win.loadFile('index.html')
}

app.whenReady().then(() => {
  createWindow()
})

上面是一个 main.js 的代码范例,注意 app 这个对象,以及倒数第二行,createWindow() 的调用时点。whenReady 是主进程 app 初始化完毕的时点,另外 Electron 还会提供一些其他的事件钩子,比如 activateclose 或者 window-all-closed 等等。我们可以给这些钩子注册各自的处理函数,只要确定,这些处理器在被调用时,应该是已经处于可以正确的调用的时候,才不会报错。

不难看出,BrowserWindow 对象的数量,本质上是没有限制的,也就是我们可以用这种方式创建一个多窗口的 App,不过创建一个单窗口的 App,更符合一般简单 App 的习惯。在一个浏览器窗口内,完成所有的功能操作,这本身和 Web 开发里的 SPA 概念很像,也即单页应用。而 Vue 就是非常适合开发单页应用的一种前端框架,所以 Vue 3 和 Electron 可以说是开发桌面 App 的绝配。

三、如何在 Eletron App 中使用 Vue 框架

BrowserWindow 对象提供一个 API,就是 laodURL,在一个窗口创建完毕后,我们可以加载一个 Web App 的首页,其实也就是一个 Vue App 的入口文件,index.html,加载成功后,我们就看到了页面。注意看上面 main.js 的第 9 行,这里加载一个 index.html,也就是你的 Vue App 的 index.html

在 Eletron App 中,BrowserWindow 也是运行所有 js 代码的地方,因为 index.html 文件里,肯定会用 <script> 标签来加载 js,这样就启动了 Vue 的框架代码。Vue 3 的默认的入口文件,也叫 mian.js 或者 main.ts,如果和 Electron 一起开发的话,我们可以给入口主文件改个名字,叫 renderer.js 或者 renderer.ts,这样概念就会更清楚,让其他开发者也更能理解你的项目的结构。

在 Electron 中,这个 BrowserWindow 的进程,也叫 renderer。其实,从这里不难看出,其实 Vue 实现的 App 的 js 代码,和 main.js 里的 js 代码,本质上运行在两个不同的进程里。这也就是为什么两者的互相调用,需要进行进程中通信的原因。

四、衔接者 preload.js

以前的 Electron 的规范不那么严格,我们一般会把 ipcRenderer 直接暴露到 Web App 一侧,不过这么做并不安全,如果需要访问主进程的一些资源,还是应该通过 IPC 通信的方式更正规和安全。

方法是通过 preload.js 来给 BrowserWindow 注入一些预定义的 API,方便从 Web 侧给主进程发送进程间通信。在 prelaod.js 里,能够使用的 API 是收到很大的限制的。

什么情况需要进行这种 IPC 通信呢?比如,你作为一个 Web App,你需要访问用户本地的系统资源,比如文件系统,或者其他宿主操作系统的资源,比如剪贴板,系统托盘区,打印机之类的外设。Node.js 的系统进程身份给这种调用提供了方便,但是其开发接口,是通过 API,更像是前后台程序在互相调用。所以前端程序员很适合来开发 Eletron 的 App。

const { contextBridge } = require('electron')

contextBridge.exposeInMainWorld('versions', {
  node: () => process.versions.node,
  chrome: () => process.versions.chrome,
  electron: () => process.versions.electron
  // we can also expose variables, not just functions
})

上面是一个 preload.js 脚本的范例,里面看起来使用了 require,但是这个脚本其实是收到限制的,只有非常有限的 node 模块可以在这里加载,上面使用 contextBridge 对象,给浏览器内部的 App,暴露了三个 API,即 windows.versions.node 等三个,显示类库版本的接口。实际上我在开发过程中,也是用类似的方法来做到网页和系统的 node 进行通信。实现磁盘文件操作和系统进程服务调用的。

总结

本文简介了 Eletron 的各种进程的类型和交互原理,讲清楚了如何将流行的 Web 开发框架嵌入到 Electron 中,并说明了 Web 侧进程和后台 node 如何进行互相调用。更多 Electron + Vue 3 的 App 的操作方法,请参考我的开源项目HexoPress,这里提到的技术,里面都有用到。大家感兴趣可以看看真实项目是怎么写的,谢谢!如果感到有用,请给我一个免费的👍🏻和小⭐️,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

空指针和Void指针的基本概念和用法

前言&#xff1a;本文只是限于说明空指针与void指针的基本性质和用法&#xff0c;关于更深层次的用法&#xff0c;则不介绍&#xff0c;因为本人自己还没有搞懂&#xff01;&#xff01;&#xff01; 1&#xff1a;空指针 1.1空指针的基本定义 定义:在C语言中&#xff0c;如…

APP自动化第一步:Appium环境搭建

一、安装Appium Python client包 1.直接cmd窗口输入pip install Appium-Python-Client 2.要确保安装匹配版本的selenium和appium 使用命令pip install selenium -U 首先进入网盘下载这三个软件的压缩包 二、安装Appium Server 1.双击打开压缩包Appium 2.双击进行安装。 3.点…

unity导航网格无法烘培到台阶和斜坡

如图是我在b站学Unity导航网格时建的一个示例场景&#xff0c;本场景使用的为棱长1m的立方体&#xff0c;读者可以以此为参照度量其他物体大小。 可见导航网格根本无法烘焙到斜坡和台阶上&#xff0c;为解决问题我做了不少尝试&#xff0c;调整最大坡度和步高都没办法解决问题…

Kafka 面试八股题整理

前言&#xff1a;本文是博主自行收集的Kafka相关的八股文问题&#xff0c;博主还在准备暑期实习中&#xff0c;应该会持续更新.... 参考&#xff1a; 32 道常见的 Kafka 面试题你都会吗&#xff1f;附答案 【Kafka】10道不得不会的 Kafka 面试题 掌握这10个常见的Kafka经典面试…

openssl3.2 - crypto-mdebug被弃用后, 内存泄漏检查的替代方法

文章目录 openssl3.2 - crypto-mdebug被弃用后, 内存泄漏检查的替代方法概述笔记查看特性列表openssl3.2编译脚本 - 加入enable-crypto-mdebug看看有没有替代内存诊断的方法?main.cppmy_openSSL_lib.hmy_openSSL_lib.c备注备注这招不行啊显势调用默认上下文也不行END openssl3…

【设计模式】工厂模式、建造者模式、原型设计模式

文章目录 1、简单工厂模式2、工厂方法模式3、抽象工厂模式4、建造者模式5、原型设计模式 设计模式即总结出来的一些最佳实现。23种设计模式可分为三大类&#xff1a; 创建型模式&#xff1a;隐藏了创建对象的过程&#xff0c;通过逻辑方法进行创建对象&#xff0c;而不是直接n…

【python开发】面向对象高级和应用

这里写目录标题 一、继承&#xff08;一&#xff09;mro和c3算法&#xff08;二&#xff09;py2和py3区别&#xff08;了解即可&#xff09; 二、内置函数补充&#xff08;一&#xff09;callable&#xff1a;是否可以在后面加括号执行&#xff08;二&#xff09;super()&#…

雷达一维成像:基于数据集的实践

雷达一维成像&#xff1a;基于数据集的实践 (距离压缩\距离-时间图\距离-多普勒图\微多普勒图) 说明 雷达成像技术是雷达发展的一个重要里程碑&#xff1a;从此雷达的功能不仅仅是将所观测的对象视为点目标&#xff0c;并只测量它的位置与运动参数。雷达成像技术使得我们可以获…

EMQX Enterprise 5.5 发布:新增 Elasticsearch 数据集成

EMQX Enterprise 5.5.0 版本已正式发布&#xff01; 在这个版本中&#xff0c;我们引入了一系列新的功能和改进&#xff0c;包括对 Elasticsearch 的集成、Apache IoTDB 和 OpenTSDB 数据集成优化、授权缓存支持排除主题等功能。此外&#xff0c;新版本还进行了多项改进以及 B…

Linux第63步_为新创建的虚拟机添加必要的目录和安装支持linux系统移植的软件

1、创建必要的目录 输入密码“123456”&#xff0c;登录虚拟机 这个“zgq”&#xff0c;是用户名&#xff0c;也是下面用到的的“zgq”目录。 1)、创建“/home/zgq/linux/”目录 打开终端&#xff0c;进入“/home/zgq/”目录 输入“mkdir linux回车”&#xff0c;创建“/ho…

电子版证件照怎么弄?分享完整制作方法!

在数字化时代&#xff0c;电子版证件照已成为我们生活中不可或缺的一部分。无论是求职、办理证件还是网络注册&#xff0c;都需要用到电子版证件照。那么&#xff0c;如何制作一份合格的电子版证件照呢&#xff1f;本文将为您详细介绍电子版证件照的制作方法&#xff0c;并推荐…

开年大吉!安全狗入选工信部工业互联网试点示范名单

近日&#xff0c;工业和信息化部信息通信管理局公布了2023年工业互联网试点示范名单。此次名单根据《工业和信息化部办公厅关于组织开展2023年工业互联网试点示范项目申报工作的通知》&#xff08;工信厅信管函﹝2023﹞319号&#xff09;&#xff0c;经企业申报、地方推荐、专家…

通过OCR实现纯数字识别

基于飞浆paddle训练框架 照这个改的 https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/cv/image_ocr.html 训练不到10分钟 10epoch cpu&#xff1a;inter i5 8250 U 脚本生成的图10000 验证训练&#xff1a;3:7 预测结果 chatgpt写的代码&#xff0c;生成数…

从ChatGPT到Sora,来了解大模型训练中的存储

1 从chatGPT到Sora 2022年底&#xff0c;OpenAI推出人工智能聊天机器人ChatGPT&#xff0c;开启了大模型领域的“竞速跑”模式。2024年2月15日&#xff0c;随着视频生成模型Sora的横空出世&#xff0c;OpenAI再度掀起热潮。 Sora将视频生成内容拉到了一个全新的高度&#xff0c…

Pybind11 在C++中运行python脚本操作内存数据

pybind11资料 官方Github:Pybind11 Github Pybind11文档&#xff1a;Pybind11 文档 文档在深入使用后需要细细读懂&#xff0c;包括全局只能有一个解释器&#xff0c;如何从C中返回指针/引用等。基本文档中需要注意的点都会遇到 Python环境安装及维护 对于正常使用人员&…

python自动化测试三部曲之request+django实现接口测试

这里废话少说&#xff0c;进入正题 我的思路是这样的 1、先用django实现登陆、增加、删除、查看4个接口 2、在excel定义好测试案例、然后读取excel中的案例&#xff0c;然后把案例用unittest框架组装和封装 3、启动django&#xff0c;执行测试案例 一、先跑通unittest到dj…

Scikit-Learn逻辑回归

Scikit-Learn逻辑回归 1、逻辑回归概述1.1、逻辑回归1.2、逻辑回归的优缺点1.3、逻辑回归与线性回归 2、逻辑回归的原理2.1、逻辑回归的概念与原理2.2、逻辑回归的损失函数 3、 1、逻辑回归概述 1.1、逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;主要解决二…

【IDEA】java 项目启动偶现Kotlin 版本问题 error:Kotlin:module was

一、问题描述&#xff1a; error:Kotlin:module was compiled with an incompatible version of kotlin the binary version of its metadata is二、问题原因&#xff1a; jar包版本冲突 三、解决方式&#xff1a; 1、Rebuild Project&#xff08;推荐☆&#xff09; 重新构…

【web】云导航项目部署及环境搭建(复杂)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、项目介绍1.1项目环境架构LNMP1.2项目代码说明 二、项目环境搭建2.1 Nginx安装2.2 php安装2.3 nginx配置和php配置2.3.1 修改nginx文件2.3.2 修改vim /etc/p…

内存溢出排查

1、进入k8s容器对应服务节点查看进程号 ps aux|grep javaps aux 是用BSD的格式来显示 java这个进程 显示的项目有&#xff1a;USER , PID , %CPU , %MEM , VSZ , RSS , TTY , STAT , START , TIME , COMMAND USER: 行程拥有者 PID: pid %CPU: 占用的 CPU 使用率 %MEM: 占用的记…