图解 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,这里提到的技术,里面都有用到。大家感兴趣可以看看真实项目是怎么写的,谢谢!如果感到有用,请给我一个免费的👍🏻和小⭐️,谢谢!

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

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

相关文章

数据湖delta lake

Table of Content1. 课程2. 前置技能3. 一、数据湖概念[了解] 3.1. 1.1 企业的数据困扰 3.1.1. 困扰一&#xff1a;互联网的兴起和数据孤岛3.1.2. 困扰二&#xff1a;非结构化数据3.1.3. 困扰三&#xff1a;保留原始数据3.1.4. 补充&#xff1a;什么是结构化&#xff1f; 3.1.4…

【Simulink系列】——动态系统仿真 之 混合系统

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 一、混合系统概述 由不同类型系统共同构成的系统称为混合系统&#xff01;仿真时必须考虑连续信号和离散信号的采样匹配问题&#xff0c;一般使用变步长连续求…

AI智能分析网关V4智慧工厂视频智能监管与风险预警平台建设方案

一、背景需求分析 1&#xff09;随着信息技术的迅猛发展和制造业竞争的加剧&#xff0c;智慧工厂成为了推动制造业转型升级的重要引擎。智慧工厂解决方案通过整合物联网、人工智能、大数据分析等先进技术&#xff0c;实现生产过程的智能化、自动化和高效化&#xff0c;为企业提…

初识Lombok

前言 最近读一些公司的业务代码&#xff0c;发现近几年的java项目工程中都使用了lombok&#xff0c;lombok是一个可以自动生成get,set、toString等模板类方法的工具框架&#xff0c;程序再引入lombok后&#xff0c;添加一个注解便可以不写get\set\toString等方法。 Lombok示例…

【Java程序设计】【C00286】基于Springboot的生鲜交易系统(有论文)

基于Springboot的生鲜交易系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的生鲜交易系统 本系统分为系统功能模块、管理员功能模块、用户功能模块以及商家功能模块。 系统功能模块&#xff1a;在系统首页可以…

定制红酒:设计专属标签与包装,打造与众不同个性

在云仓酒庄洒派的定制红酒服务中&#xff0c;为消费者提供个性化、专属的标签与包装设计是提升红酒与众不同性和纪念价值的关键环节。通过巧妙的设计&#xff0c;消费者可以打造出与众不同的红酒&#xff0c;展现自己的个性与品味。 首先&#xff0c;标签设计是展现红酒个性的重…

经典文献阅读之--InsightMapper(深入研究矢量化高精地图的内部实例信息)

0. 简介 高精地图作为自动驾驶中最关键的组成部分&#xff0c;矢量化高精&#xff08;HD&#xff09;地图包含有关周围道路元素的详细信息&#xff0c;这对于现代自动驾驶汽车的各项下游任务是至关重要的&#xff0c;例如车辆规划和控制。最近的工作试图直接检测矢量化高精地图…

微服务篇之任务调度

一、xxl-job的作用 1. 解决集群任务的重复执行问题。 2. cron表达式定义灵活。 3. 定时任务失败了&#xff0c;重试和统计。 4. 任务量大&#xff0c;分片执行。 二、xxl-job路由策略 1. FIRST&#xff08;第一个&#xff09;&#xff1a;固定选择第一个机器。 2. LAST&#x…

提供英语自我介绍(带翻译)的软件有哪些?分享五款实用软件

提供英语自我介绍(带翻译)的软件有哪些&#xff1f;在全球化日益加速的今天&#xff0c;英语自我介绍已成为我们展示个人风采、赢得机会的重要一环。本文将为您介绍五款提供英语自我介绍及翻译功能的软件&#xff0c;帮助您轻松撰写并呈现一个吸引人的英文自我介绍。 1. 语音翻…

不同电平信号的控制器如何通信?

步入21世纪后&#xff0c;控制器&#xff08;MCU&#xff09;开始呈现出各种类型及功能作用&#xff0c;在此过程中&#xff0c;通信是关键环节&#xff0c;然而不同电平信号的控制器该如何通信&#xff1f;下面来看看如何实现&#xff01; 首先&#xff0c;先了解下电平信号的…

Hack The Box-Jab

总体思路 端口扫描->访问Jabber服务&#xff08;自建用户&#xff09;->john解密->访问Jabber服务&#xff08;服务器用户&#xff09;->获取用户权限->端口转发openfire后台管理界面->上传CVE-2023-32315插件->获取system权限 信息收集&端口利用 …

【Flink CDC(一)】实现mysql整表与增量读取

文章目录 一. 运行前准备1. 依赖1.1. Maven dependency1.2. SQL Client JAR&#xff08;推荐&#xff09; 2. 配置 MySQL 服务器&#xff08;必须&#xff09; 二. 功能说明1. 启动模式2. 全量阶段支持 checkpoint3. 关于无主键表Exactly-Once 处理 三. 实战1. 实现mysql整表与…