用JS开发桌面应用(Electron)原理篇

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

2021.11.12

另外electron-react还可作为使用Electron+React+Mobx+Webpack技术栈的脚手架工程。

桌面应用程序,又称为GUI程序(GraphicalUserInterface),但是和GUI程序也有一些区别。桌面应用程序将GUI程序从GUI具体为“桌面”,使冷冰冰的像块木头一样的电脑概念更具有人性化,更生动和富有活力。

我们电脑上使用的各种客户端程序都属于桌面应用程序,近年来WEB和移动端的兴起让桌面程序渐渐暗淡,但是在某些日常功能或者行业应用中桌面应用程序仍然是必不可少的。

传统的桌面应用开发方式,一般是下面两种:

直接将语言编译成可执行文件,直接调用系统API,完成UI绘制等。这类开发技术,有着较高的运行效率,但一般来说,开发速度较慢,技术要求较高,例如:

一开始就有本地开发和UI开发。一次编译后,得到中间文件,通过平台或虚机完成二次加载编译或解释运行。运行效率低于原生编译,但平台优化后,其效率也是比较可观的。就开发速度方面,比原生编译技术要快一些。例如:

不过,上面两种对前端开发人员太不友好了,基本是前端人员不会设计的领域,但是在这个【大前端】的时代,前端开发者正在想方设法涉足各个领域,使用WEB技术开发客户端的方式横空出世。

使用WEB技术进行开发,利用浏览器引擎完成UI渲染,利用Node.js实现服务器端JS编程并可以调用系统API,可以把它想像成一个套了一个客户端外壳的WEB应用。

在界面上,WEB的强大生态为UI带来了无限可能,并且开发、维护成本相对较低,有WEB开发经验的前端开发者很容易上手进行开发。

本文就来着重介绍使用WEB技术开发客户端程序的技术之一【electron】

Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库。Electron通过将Chromium和Node.js合并到同一个运行时环境中,并将其打包为Mac,Windows和Linux系统下的应用来实现这一目的。

当然,我们也要认清它的缺点:性能比原生桌面应用要低,最终打包后的安装包和其他文件都比较大。

兼容性

虽然你还在用WEB技术进行开发,但是你不用再考虑兼容性问题了,你只需要关心你当前使用Electron的版本对应Chrome的版本,一般情况下它已经足够新来让你使用最新的API和语法了,你还可以手动升级Chrome版本。同样的,你也不用考虑不同浏览器带了的样式和代码兼容问题。

Node环境

这可能是很多前端开发者曾经梦想过的功能,在WEB界面中使用Node.js提供的强大API,这意味着你在WEB页面直接可以操作文件,调用系统API,甚至操作数据库。当然,除了完整的NodeAPI,你还可以使用额外的几十万个npm模块。

跨域

你可以直接使用Node提供的request模块进行网络请求,这意味着你无需再被跨域所困扰。

强大的扩展性

借助node-ffi,为应用程序提供强大的扩展性(后面的章节会详细介绍)。

现在市面上已经有非常多的应用在使用electron进行开发了,包括我们熟悉的VSCode客户端、GitHub客户端、Atom客户端等等。印象很深的,去年迅雷在发布迅雷X10.1时的文案:

从迅雷X10.1版本开始,我们采用Electron软件框架完全重写了迅雷主界面。使用新框架的迅雷X可以完美支持2K、4K等高清显示屏,界面中的文字渲染也更加清晰锐利。从技术层面来说,新框架的界面绘制、事件处理等方面比老框架更加灵活高效,因此界面的流畅度也显著优于老框架的迅雷。至于具体提升有多大?您一试便知。

你可以打开VSCode,点击【帮助】【切换开发人员工具】来VSCode客户端的界面。

Electron结合了Chromium、Node.js和用于调用操作系统本地功能的API。

Chromium是Google为发展Chrome浏览器而启动的开源项目,Chromium相当于Chrome的工程版或称实验版,新功能会率先在Chromium上实现,待验证后才会应用在Chrome上,故Chrome的功能会相对落后但较稳定。

Chromium为Electron提供强大的UI能力,可以在不考虑兼容性的情况下开发界面。

Node.js是一个让JavaScript运行在服务端的开发平台,Node使用事件驱动,非阻塞I/O模型而得以轻量和高效。

单单靠Chromium是不能具备直接操作原生GUI能力的,Electron内集成了Nodejs,这让其在开发界面的同时也有了操作系统底层API的能力,Nodejs中常用的Path、fs、Crypto等模块在Electron可以直接使用。

为了提供原生系统的GUI支持,Electron内置了原生应用程序接口,对调用一些系统功能,如调用系统通知、打开系统文件夹提供支持。

在开发模式上,Electron在调用系统API和绘制界面上是分离开发的,下面我们来看看Electron关于进程如何划分。

Electron区分了两种进程:主进程和渲染进程,两者各自负责自己的职能。

Electron运行package.json的main脚本的进程被称为主进程。一个Electron应用总是有且只有一个主进程。

职责:

可调用的API:

由于Electron使用了Chromium来展示web页面,所以Chromium的多进程架构也被使用到。每个Electron中的web页面运行在它自己的渲染进程中。

主进程使用BrowserWindow实例创建页面。每个BrowserWindow实例都在自己的渲染进程里运行页面。当一个BrowserWindow实例被销毁后,相应的渲染进程也会被终止。

你可以把渲染进程想像成一个浏览器窗口,它能存在多个并且相互独立,不过和浏览器不同的是,它能调用NodeAPI。

在上面的章节我们提到,渲染进和主进程分别可调用的ElectronAPI。所有Electron的API都被指派给一种进程类型。许多API只能被用于主进程中,有些API又只能被用于渲染进程,又有一些主进程和渲染进程中都可以使用。

你可以通过如下方式获取ElectronAPI

在后面的章节我们会选择其中常用的模块进行详细介绍。

你可以同时在Electron的主进程和渲染进程使用Node.jsAPI,)所有在Node.js可以使用的API,在Electron中同样可以使用。

import{shell}from"electron";importosfrom"os";document.getElementById("btn").addEventListener("click",()=>{shell.showItemInFolder(os.homedir());});有一个非常重要的提示:原生Node.js模块(即指,需要编译源码过后才能被使用的模块)需要在编译后才能和Electron一起使用。

主进程和渲染进程虽然拥有不同的职责,然是他们也需要相互协作,互相通讯。

ipcRenderer是一个EventEmitter的实例。你可以使用它提供的一些方法从渲染进程发送同步或异步的消息到主进程。也可以接收主进程回复的消息。

在渲染进程引入ipcRenderer:

import{ipcRenderer}from"electron";异步发送:

通过channel发送同步消息到主进程,可以携带任意参数。

在内部,参数会被序列化为JSON,因此参数对象上的函数和原型链不会被发送。

ipcRenderer.send("sync-render","我是来自渲染进程的异步消息");同步发送:

constmsg=ipcRenderer.sendSync("async-render","我是来自渲染进程的同步消息");注意:发送同步消息将会阻塞整个渲染进程,直到收到主进程的响应。

主进程监听消息:

ipcMain模块是EventEmitter类的一个实例。当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息。从渲染器进程发送的消息将被发送到该模块。

ipcMain.on:监听channel,当接收到新的消息时listener会以listener(event,args...)的形式被调用。

在主进程中可以通过BrowserWindow的webContents向渲染进程发送消息,所以,在发送消息前你必须先找到对应渲染进程的BrowserWindow对象。:

ipcMain.on("sync-render",(event,data)=>{console.log(data);event.sender.send("main-msg","主进程收到了渲染进程的【异步】消息!");});渲染进程监听:

ipcRenderer.on:监听channel,当新消息到达,将通过listener(event,args...)调用listener。

ipcRenderer.on("main-msg",(event,msg)=>{console.log(msg);});4.6通信原理ipcMain和ipcRenderer都是EventEmitter类的一个实例。EventEmitter类是NodeJS事件的基础,它由NodeJS中的events模块导出。

EventEmitter的核心就是事件触发与事件监听器功能的封装。它实现了事件模型需要的接口,包括addListener,removeListener,emit及其它工具方法.同原生JavaScript事件类似,采用了发布/订阅(观察者)的方式,使用内部_events列表来记录注册的事件处理器。

remote模块为渲染进程(web页面)和主进程通信(IPC)提供了一种简单方法。使用remote模块,你可以调用main进程对象的方法,而不必显式发送进程间消息,类似于Java的RMI。

import{remote}from"electron";remote.dialog.showErrorBox("主进程才有的dialog模块","我是使用remote调用的");但实际上,我们在调用远程对象的方法、函数或者通过远程构造函数创建一个新的对象,实际上都是在发送一个同步的进程间消息。

在上面通过remote模块调用dialog的例子里。我们在渲染进程中创建的dialog对象其实并不在我们的渲染进程中,它只是让主进程创建了一个dialog对象,并返回了这个相对应的远程对象给了渲染进程。

Electron并没有提供渲染进程之间相互通信的方式,我们可以在主进程中建立一个消息中转站。

渲染进程之间通信首先发送消息到主进程,主进程的中转站接受到消息后根据条件进行分发。

在两个渲染进程间共享数据最简单的方法是使用浏览器中已经实现的HTML5API。其中比较好的方案是用StorageAPI,localStorage,sessionStorage或者IndexedDB。

就像在浏览器中使用一样,这种存储相当于在应用程序中永久存储了一部分数据。有时你并不需要这样的存储,只需要在当前应用程序的生命周期内进行一些数据的共享。这时你可以用Electron内的IPC机制实现。

将数据存在主进程的某个全局变量中,然后在多个渲染进程中使用remote模块来访问它。

在主进程中初始化全局变量:

import{ipcRenderer,remote}from"electron";const{getGlobal}=remote;constmainId=getGlobal("mainId");constdirname=getGlobal("__dirname");constdeviecMac=getGlobal("device").mac;在渲染进程中改变:

getGlobal("myField").name="code秘密花园";多个渲染进程共享同一个主进程的全局变量,这样即可达到渲染进程数据共享和传递的效果。

THE END
1.据悉互联网前10大企业排行榜1:字节跳动,毫无疑问处于独一12月21日,抗癌博主湘妹子去世瘦成皮包骨,电影制暴包贝尔迅雷下载,《我家浴缸的二三事动漫》在线观看/下载_2014日本喜,榴莲视频app下载安装无限看-丝瓜安卓七客,《侏罗纪世界3》高清在线观看-免费下载-6080电影,“fulao2国内下载点安卓轻量版v1.1.4 安卓-fula,2023已经更新黄色软件app3.0.3免费vivo版,管家http://www.hubeipuqi.com/?id=VqsaiE5720241220.shtml
2.最新超算排名全球超级计算机最新榜单揭晓聚焦热点技术升级,性能更强 随着我国超级计算机技术的不断发展,未来国产超算的性能将得到进一步提升。预计在未来几年内,我国将有望推出性能更强大的超级计算机。 应用拓展,助力产业升级 随着国产超算技术的成熟,其在各领域的应用将更加广泛。未来,国产超算将助力我国产业升级,为经济社会发展提供强大动力。 https://good.zhiri0930.cn/post/1292.html
3.2024专业大型网站建设公司top10:谁家实力最强?高超界面设计各位网络探险家们,是时候打开你的电脑,泡上一杯咖啡,准备迎接一场网站的盛宴了!2024年大型网站建设公司哪家强?今天咱们就揭开这个神秘的面纱,看看谁家实力最强。 1.互橙文化 首先得说说这位“网红”选手,互橙文化。他们家网站建设,就像是一道美味的大餐,色香味俱佳。从界面设计到功能实现,每一个细节都让人惊叹不https://www.163.com/dy/article/JJS2H4HP0556ABQ1.html
4.Web2月入2万+现在的90后“钞能力”真是太强了Web2月入2万+ 现在的90后“钞能力”真是太强了 。 币界网报道: 这段时间休假,见了不少亲戚朋友,也从亲戚朋友口中知道到各家亲戚优秀的“后生”们,颇有感慨。 初晓链在加密市场做自媒体内容创作2年多,看到群友们的十倍和百倍似乎很容易。 偶尔是这个群友的100倍PEPE,或者是那个群友的万倍ORDI,或者是这个https://www.528btc.com/news/116118104.html
5.云风的BLOG:杂记Archives另外,最近间歇性的出过 web 访问无法返回的现象。经过排查,是原来用的一个 wiki 系统的某个 bug 导致的死锁。那个系统虽然是开源的,但早就无人维护了,这几年我试着修过几个 bug ,这次真的懒得修了,直接把链接从首页去掉。 最后一个问题是 blog 的留言处理的很慢(导致很多同学多次提交),不知道是不是数据太https://blog.codingnow.com/ooc/
6.WebStorm强大的调试前端项目功能经过WebStorm版本的更迭,现在已经经过WebStorm版本的更迭,现在已经可以非常方便的使用它来调试前端项目,无论是Vue还是React项目,都可以使用它进行调试,还不需要做任何的配置! 2. 启动调试 其实平时在使用WebStorm的时候,启动项目时是会提示你如何进入调试模式,但可能很多人都没有注意。 https://juejin.cn/post/7057070180089724959
7.目前我国互联网总市值101177亿元,其中排名来自老鬼逻辑目前我国互联网总市值101177亿元,其中排名第一的是腾讯,市值37459亿元;排名第二的是阿里巴巴,市值19044亿元;排名第三的竟然是我们平时看不起的拼多多,市值13180亿元。而当年和腾讯、阿里巴巴并驾齐驱的百度,目前仅剩2671亿元的市值,已经完全不是一个梯队的了。但这只是上市公司的统计数据,其实很多大企业都不屑于上市的https://weibo.com/6510323344/P5TDWEEc0
8.国内网络购物的现状通过对“http://www.world68.com/shopping.asp”网站上公布的32家综合网络购物平台进行调查分析和研究相关行业报告及文献, 并融合Web 2.0环境下互联网出现的新特点及人们购物观念和方式的变化, 发现我国网络购物平台建设存在以下几个方面的问题: (1) 平台界面个性化不强。除了一些大型的网络购物平台, 比如淘宝、易趣https://www.360wenmi.com/f/files0ccmimf.html
9.布罗格登:目前东部比西部强4年前骑士是乐透队&现在东部前6直播吧10月16日讯 近日,凯尔特人球员布罗格登在采访中谈到了东部和西部。 布罗格登表示:“到目前为止,东部是比西部更强的分区。几年前人们会说西部更强,但是现在东部更强,东部现在的天赋更高。3、4年前人们认为骑士是乐透球队,但现在骑士是东部前6,他们肯定是季后赛球队。所以,这对我们、雄鹿、76人等队来说变得https://m.zhibo8.cc/news/web/nba/2022-10-16/634b6b7435714.htm
10.前端工作总结(通用12篇)在运维中心工作期间,我工作认真,具有较强的责任心和进取心,极富工作热情,确实完成上级交付的工作,善于与他人沟通,和公司部门同事之间能够通力合作,关系相处融洽而辑穆,配合各部分负责人成功的完成各项工作,具有很强的团队合作精神。注重自己的个人发展,不断努力学习系统、网站架构知识。所以我现在已经能够纯熟维护公司的https://www.ruiwen.com/gongwen/gongzuozongjie/555535.html
11.前端面试笔试题总结持续更新~江阴雨辰互联19.说说如何借助webpack来优化前端性能 20. 说说React中setState执行机制? 21.说说react的事件机制 22.说说你对fiber架构的理解?解决了什么问题? 是什么? 如何解决? 23.什么是强缓存和协商缓存 24.如何使用css实现一个三角形 transparent 25.说说webpack中常见的loader?解决了什么问题 https://www.yc00.com/news/1702616044a1238032.html
12.Android开源项目和文章集合(更新:2022.03.21)安卓项目1.下拉刷新、上拉加载、二级刷新、淘宝二楼、RefreshLayout、OverScroll,Android智能下拉刷新框架,支持越界回弹、越界拖动,具有极强的扩展性,集成了几十种炫酷的Header和 Footer。 https://github.com/scwang90/SmartRefreshLayout#1 2.多图片选择器 https://github.com/LuckSiege/PictureSelector https://blog.csdn.net/z979451341/article/details/78864907
13.ComponentOne2023破解版ComponentOneStudiov2023在2020 v1中,这些Web API已经过测试版,支持.NET Core 2.0及更高版本。我们还添加了许多平台示例,这些示例演示了如何从WinForms,JavaScript(使用TypeScript)和MVC应用程序中使用这些API。 另外,新的Mac版C1ControlPanel意味着您现在可以在Mac上安装ComponentOne Web API组件。 七、Xamarin增强功能2020 v1 1、FlexGridhttp://www.sd173.com/soft/8836.html
14.最新互联网前10大企业排行榜1:字节跳动,毫无疑问处于独一12月22日,刘畊宏帮女儿追星贺峻霖,「御宅屋高辣」御宅屋高辣免费在线阅读第39章她第一,我的美艳的岳第66部分我的美艳的岳第66部分全,《五十公里桃花坞第三季》高清免费无广告免费观看,不能说的秘密2高清完整版在线观看-三明影视,推荐几个黄油网站:游戏爱好者必备,校园狂少2txt全集下载,《你是我的姐妹》http://www.lieren2000.com/wap/colormethod_view.asp?/www/windows/26750_20241221.shtml
15.大连职业技术学院2、配备专职及兼职指导教师队伍。从企业调入或聘请实践能力强的实训指导教师;选派专业教学到企业挂职锻炼,强化专业教学的双师能力。 3、专职管理及维修维护人员。保证实训设备设施的正常使用。 4、对校外实训实行全程指导和督导。 5、施行实践教学的奖励机制,鼓励广大专业教师积极参与实践教学工作。 https://zzb.dlvtc.edu.cn/web/guest/detail?articleId=93F1A4D0-7578-5378-0D01-0E4E79AF8AD1
16.2022年春招,Java后端最全面试攻略,吃透25个技术栈31、用最有效率的方法算出2乘以8等于几? 32、String 和 StringBuilder、StringBuffer 的区别? 33、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)? 34、一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? https://maimai.cn/article/detail?fid=1693041914&efid=0wLQeU_zXMLDQKbP5PYRMg
17.推荐几款强大流行的BI系统腾讯云开发者社区企业在日常运营过程中,需要根据公司实时经营数据来做未来决测或者发现经营中的问题,在此过程中离不开对数据的分析,而平常利用 excel 等方式极大的提高了领导层快速做出决测的成本,所以市面上出现很多商业智能的需求也即是 BI 的出现,极大的方便了企业通过可视化在只管的数据展示中快速做出判断与决测,这里推荐几款 https://cloud.tencent.com/developer/article/1988880
18.Web3.0到底是什么?为何它很重要?以上是Web3.0是什么的详细介绍。Web3.0时代的到来将引领产业和商业模式走向新的变革。在未来,我们或许可以像现在使用互联网一样,通过电脑、智能手机、电视等设备体验Web3.0,甚至可能通过元宇宙的VR头盔直接感受其魅力。当然,无论是Web3.0还是元宇宙的发展,都还需要历经长时间的探索和实践。与此同时,我们也应警惕市场热点https://www.mimajike.com/web3/13.html
19.专科医师数据检索PubMed与WebofScience哪家强而Web of Science是科学界最经典权威的引文数据库,其核心数据库为科学引文索引扩展版(Science Citation Index Expanded,就是目前通俗说的SCI.如果有人问SCI和SCIE有什么区别,我在这里简要回答一下:“现在没区别”)。那么,这两个数据库在检索方面,哪家强呢?下面进行逐条比较。https://www.med66.com/zhuankeyishipeixun/zh1704078961.shtml
20.freemarker定义变量循环赋值freemarker循环map<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /> 注:这里我把struts-tags.tld放在WEB-INF下面 4.现在我们可以在FreeMarker模板中使用标签了。 --- 测试 1. 2. 3. 4. 5. 6. 7. list索引_index <#list list as city> city{city_indexhttps://blog.51cto.com/u_16099242/11273005
21.FreeMarker的基础语法使用&&心得和技巧javaeyeFreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图) FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件。 https://www.iteye.com/blog/mxdxm-2407315
22.郑州“千年难遇”的强降雨:被困在车里24小时,把坐垫拆下来盖在持续了近一周的雨在7月20日达到峰值,郑州遭遇的这场极端的强降雨,被认为“千年难遇”。 暴雨淹没了道路、涵洞,积水,阻挡了人们上班、回家的路。突如其来的暴雨彻底打乱了人们的正常生活。我们找到了郑州的一些普通人,他们有的在暴雨中冒险蹚水回家,有的被困在公司一夜,有的留在学校里待命。以下是他们的自述:https://web.shobserver.com/staticsg/res/html/web/newsDetail.html?id=387924
23.Web版Photoshop来了,用到了哪些前端技术?本文就来看看 Photoshop 所使用的 Web 能力、进行的性能优化以及未来可能的发展方向。愿景:在浏览器中使用 Photoshop Adobe 的愿景就是将 Photoshop 带到浏览器中,让更多的用户能够方便地使用它进行图像编辑和平面设计。过去几十年,Photoshop一直是图像编辑和平面设计的黄金标准,但它只能在桌面上运行。现在,通过将它https://www.imooc.com/article/337119
24.我在中东搞科创:疫情后涌入很多华人,不讲好本地故事难成功讲一个插曲,我在阿联酋总理办公室工作时做了一个区块链政策,从立项到正式公布花了4个月时间。他们的政策更新速度快,试错态度强,小国家的政策错了也没事,及时调整过来就行。阿联酋敢快速试错,它把政府当创业公司一样运营,同时又按照非常现代的金融监管方式监管Web 3.0。 https://www.thepaper.cn/newsDetail_forward_25528125
25.salvo:Salvo是一个极其简单易用却又功能强大的RustWeb后端框架Salvo(赛风) 是一个极其简单且功能强大的 Rust Web 后端框架。仅仅需要基础 Rust 知识即可开发后端服务。 中国用户可以添加我微信 (chrislearn), 拉微信讨论群或者直接加入 QQ 群:823441777. 功能特色 基于Hyper 1,Tokio开发; 支持HTTP1, HTTP2 和HTTP3; https://gitee.com/salvo-rs/salvo
26.中国共产党威海市委员会组织部经验交流PPT演示文稿的基本操作这后,在PowerPoint中就出现了Web工具栏,只要在地址栏中键入站点的URL地址,回车,系统就会启动IE,并连接到相应的网站。 35.用超级链接做目录 在PowerPoint中,可以对文字做一些超级链接,从而建立很实用的目录。只是要注意的是,在设置超级链接时,不要选中文字,而要选中文字所在的文本框,这样可避免字带有下划线的问题:先http://www.whzzb.gov.cn/art/2014/7/15/art_34385_941618.html