在计算机系统设计中,不同的进程间内存资源都是相互隔离的,因此进程间的数据交换,会使用进程间通讯方式达成。而不同于一般的原生应用开发,Electron 的渲染进程与主进程分别属于独立的进程中,而且进程间会存在频繁的数据交换,这时选择一个合理的进程间通讯方式显得尤为重要。下面是 Electron 中官方提供的进程间通讯方式:
window.postMessage,LocalStorage
在前端开发中,鉴于浏览器对本地数据有严格的访问限制,所以一般通过该两种方式进行窗口间的数据通讯,该方式同样适用于 Electron 开发中。然而因为 API 设计目的仅仅是为了前端窗口间简单的数据传输,大量以及频繁的数据通讯会导致应用结构松散,同时传输效率也值得怀疑。
使用IPC进行通信
Electron 中提供了 ipcRender 、ipcMain 作为主进程以及渲染进程间通讯的桥梁,该方式属于 Electron 特有传输方式,不适用于其他前端开发场景。Electron 沿用 Chromium 中的 IPC 方式,不同于 socket、http 等通讯方式,Chromium 使用的是命名管道 IPC ,能够提供更高的效率以及安全性。
最近在开发一款桌面端应用,用到了
Electron
和React
。React
作为日常使用比较频繁的框架,这里就不详细说明了,这里主要是想通过几篇文章让大家快速上手Electron
以及与React
完美融合。本篇是系列文章的第一篇,主要是给大家分享
Electron
的一些概念,让大家对Electron
有一个初步的认知。先来了解一下什么是
Electron
吧,可能很多小伙伴还没有听过Electron
,相信很多小伙伴此时的表情是这样的:看下官网的自我介绍:
Electron
是一个可以使用Web
技术如JavaScript
、HTML
和CSS
来创建跨平台原生桌面应用的框架。借助Electron
,我们可以使用纯JavaScript
来调用丰富的原生APIs
。Electron
用web
页面作为它的GUI
,而不是绑定了GUI
库的JavaScript
。它结合了Chromium
、Node.js
和用于调用操作系统本地功能的APIs
(如打开文件窗口、通知、图标等)。上面这张图很好的说明了
Electron
的强大之处。正因如此,现在已经有很多由
Electron
开发的应用,比如Atom
、Visual Studio Code
等。我们可以在Apps Built on Electron看到所有由Electron
构建的项目。快速开始
前面说了那么多
废话,下面进入正题,带大家用五分钟(为什么是五分钟?我猜的 🐶 )的时间运行一个Electron
的Hello World
。安装
这一步很简单:
第一个
Electron
应用一个最简单的
Electron
应用目录结构如下:package.json
的格式和Node
的完全一致,并且那个被main
字段声明的脚本文件是你的应用的启动脚本,它运行在主进程上。你应用里的package.json
看起来应该像:创建
main.js
文件并添加如下代码:然后是
index.html
文件:到这里
main.js
,index.html
和package.json
这几个文件都有了。万事俱备,来运行这个项目。因为前面已经全局安装了electron
,所以我们可以使用electron
命令来运行项目。在hello-world/
目录里面运行下面的命令:你会发现会弹出一个
electron
应用客户端,如图所示:到这里,我们已经完成了一个最简单的
electron
应用。但你一定会对上面用到的一些
api
有疑惑,下面我将带大家深入浅出的了解一下electron
的常用概念和api
。相关概念
Electron
的进程分为主进程和渲染进程。在说这个之前,我觉得有必要先说一下进程和线程的概念。进程和线程
对于操作系统来说,一个任务就是一个进程(
Process
),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word
就启动了一个Word
进程。有些进程还不止同时干一件事,比如
Word
,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread
)。主进程和渲染进程
主进程
在
electron
里面,运行package.json
里面main
脚本的进程被称为主进程
。主进程控制整个应用的生命周期,在主进程中可以创建Web
形式的GUI
,而且整个Node API
是内置其中。渲染进程
由于
Electron
使用Chromium
来展示页面,所以Chromium
的多进程架构也被充分利用。每个Electron
的页面都在运行着自己的进程,这样的进程我们称之为渲染进程
。在一般浏览器中,网页通常会在
沙盒环境
下运行,并且不允许访问原生资源。然而,Electron
用户拥有与底层操作系统直接交互的能力。主进程与渲染进程的区别
主进程使用
BrowserWindow
实例创建页面。每个BrowserWindow
实例都在自己的渲染进程里运行页面。当一个BrowserWindow
实例被销毁后,相应的渲染进程也会被终止。主进程管理所有页面和与之对应的渲染进程。每个渲染进程都是相互独立的,并且只关心他们自己的页面。
在
electron
中,页面不直接调用底层APIs
,而是通过主进程进行调用。所以如果你想在网页里使用GUI
操作,其对应的渲染进程必须与主进程进行通讯,请求主进程进行相关的GUI
操作。在
electron
中,主进程和渲染进程的通信主要有以下几种方式:进程通信将稍后在下文详细介绍。
BrowserWindow 的创建
BrowserWindow
用于创建和控制浏览器窗口。像上面的hello-world
中:创建了一个
1024*680
的窗口,并通过loadURL
方法来加载了一个本地的html
文件。进程间的通信
在计算机系统设计中,不同的进程间内存资源都是相互隔离的,因此进程间的数据交换,会使用进程间通讯方式达成。而不同于一般的原生应用开发,
Electron
的渲染进程与主进程分别属于独立的进程中,而且进程间会存在频繁的数据交换,这时选择一个合理的进程间通讯方式显得尤为重要。下面是Electron
中官方提供的进程间通讯方式:window.postMessage,LocalStorage
在前端开发中,鉴于浏览器对本地数据有严格的访问限制,所以一般通过该两种方式进行窗口间的数据通讯,该方式同样适用于
Electron
开发中。然而因为API
设计目的仅仅是为了前端窗口间简单的数据传输,大量以及频繁的数据通讯会导致应用结构松散,同时传输效率也值得怀疑。使用
IPC
进行通信Electron
中提供了ipcRender
、ipcMain
作为主进程以及渲染进程间通讯的桥梁,该方式属于Electron
特有传输方式,不适用于其他前端开发场景。Electron
沿用Chromium
中的IPC
方式,不同于socket
、http
等通讯方式,Chromium
使用的是命名管道IPC
,能够提供更高的效率以及安全性。主进程收发信息
渲染进程收发信息
使用
remote
实现跨进程访问remote
模块提供了一种在渲染进程(网页)和主进程之间进行进程间通讯(IPC
)的简便途径。Electron
中, 与GUI
相关的模块(如dialog
,menu
等)只存在于主进程,而不在渲染进程中 。为了能从渲染进程中使用它们,需要用ipc
模块来给主进程发送进程间消息。使用remote
模块,可以调用主进程对象的方法,而无需显式地发送进程间消息。总结
本小节我们大概的了解了
Electron
的一些概念以及运行了一个入门的hello-world
程序。但这远远还不够,下一节我会讲一下如何将Electron
与React
完美融合,毕竟还是要更贴近业务的~好了,不早了,我要去开启我的网易云时光了 🤖
❤️ 爱心三连击
1.如果觉得这篇文章还不错,来个分享、点赞、在看三连吧,让更多的人也看到~
2.关注公众号前端森林,定期为你推送新鲜干货好文。
3.特殊阶段,带好口罩,做好个人防护。