软件技术学习笔记

个人博客,记录软件技术与程序员的点点滴滴。

浅谈桌面应用与Electron

我从开始学习编程到现在,大部分都是在做与用户界面有关的桌面应用或Web应用,也开发过少量的后端项目。我的第一份工作就是桌面应用开发,工作的时间最长,主要用到C++/JS/HTML/CSS。

桌面应用有它自己的优点:本地数据或文件处理,传感器数据采集,响应快,不需在线,无服务器压力等。日常工作中,我们用得最多的软件就是桌面应用。目前,Electron在开发跨平台的桌面应用很方便,但在性能方面它没有优势。在项目技术选型时,我们需要做更多的考虑。

1. C++桌面应用

先说说我的C++桌面应用开发经历。2008年的时候,项目没有跨平台要求,只需在Windows下运行,有时也需要使用卫星网络发送软件安装包。我们选择Windows Template Library (WTL)框架,完成数据采集、数据处理、数据展现、仪器配置等功能,用户界面也比较多。WTL都是C++模板编写的,使用方也需要使用C++模板,生成的可执行程序比MFC的还小。

其中,有一个需求对我的感触特别深:实时采集并全屏展现,字体大小和控件位置需要动态计算,还有多种字体颜色。当前使用是Dialog控件的方式布局,每次改变窗口的大小需要重新计算字体大小、控件位置与大小。但是,Win32 API控制的字体大小没那么精确,一不小心就造成字符串超出控件边界,文本被截断,最后还得先计算文本长度,再调整控制的位置与大小。

再后来,感觉那种纯C++ Native方式开发界面的效率太低,效果也不好调整,开始搞一些内嵌的Web Browser页面。当时也没有找C++ HTML Template这样的库,就在boost::format库上开发出一个支持Key-Value的HTML格式化库,只需要写HTML模板即可。Web回调Native,选择DOM Level N API实现,技术比较难。比较幸运的是,跨越Web与Native边界的交互不多。

我没有使用过QT,但是也了解一点。QT开始也只有Widgets,后来才有QML/Qt Quick。可以看出,大家都在追求开发效率、效果容易调整。

C++桌面应用的优点:

  • 高性能。对计算密集型的程序非常合适。
  • 更接近底层(操作系统、硬件)。容易与操作系统、硬件打交道;高性能计算机视觉(DirectX、OpenGL)。

C++桌面应用的缺点:

  • 开发效率低。封装层次比较低,很多效果需要开发人员自己实现。
  • 人员技能要求高,且不容易培养。C++是最难啃的计算机语言之一,一个资深的C++程序员与初级的C++程序员写出的代码相差太远,很难在一起工作并维护对方的代码。

2. Web技术桌面应用

Web开发人员最熟悉的VSCode就是Electron桌面应用程序,主要用到JavaScript、HTML、CSS,满足跨平台的需求。这几年,新的桌面应用一般都先考虑Electron。

Electron包含一个NodeJS主进程和多个BrowserWindow渲染进程。每个BrowserWindow就相当于Web浏览器的一个页面。同时,Electron也提供了主进程与渲染进程之间的通信机制。

在学习Electron时,先从electron-quick-start开始,对一些原理进行练手。要开展实际项目时,我们从electron-react-boilerplate开始,里面包含了我们常用的TypeScript、Webpack、React、Redux、Router、应用打包等。

Electron桌面应用的优点:

  • 开发效率高,效果容易调整。Web技术是目前开发效率最快的用户界面技术。
  • 人员技能水平要求不高。经过一段时间的培养,初级程序员也可以在某一方面上写出与资深程序员差不多的代码。

Electron桌面应用的缺点:

  • 应用安装包比较大。包含整个Chromium,即使一个小页面,也会有几十MB。目前,网速比较快,资费也便宜,影响不大。
  • 占有内存比较高,特别是启动多个渲染进程之后。
  • 不适用计算密集型。JS本身是脚本语言,无法跟Native语言相比。
  • 不适用频繁调用操作系统等底层API。

3. 桌面应用技术选型

用户界面比较多时,优先考虑Electron桌面应用,除非Electron的缺点中有你不可跨越的屏障。在选择Electron桌面应用时,有的计算密集型可以包装到一个本地服务中。NodeJS或Web中再访问这个服务就可用跨越Electron本身不擅长的事情。

当用户界面很少、又需要高性能计算时,就选择原生的Native桌面程序或QT桌面程序,避免使用Web技术干它最不擅长的事情。比如,一个本地视频监控系统,还需要监控很多个摄像头。

对公司内部来说,我们优先考虑开发效率,节省成本;对用户来说,我们需要确保较高的用户体验,有时也需要选择Native的C++桌面应用程序。