桌面应用开发解决方案
桌面应用开发解决方案
Electron 和当下其他的桌面开发方法相比如何?
我大概开发Electron快两年的时间了,期间也做过一些产品。
首先我们看一下我们常用的客户端软件开发都有哪些技术:
首先是Microsoft阵营的
Winform
如雷贯耳,大多数人开发CS程序都是基于Winform去做的,它的有点在于简单、高效,但是它的缺点在于,如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样式表来讲,美化Winform的界面以及自定义控件是需要耗费更多的时间的。
并且,Winform由于其出身,原生是不可以运行在其他操作系统之上的,当然,我已经很久很久很久没有用过Winform了,所以对其现在的发展现状并不是很了解。
在开发上,Winforms简直不要太简单,如果对UI没有苛求的话,Visual Studio能够拖到你怀疑人生。
WPF
微软的又一个杀手锏,其基于XML+C#+CSS的呈现方式让它在UI上有了更加灵活的设计宽度,并且对大多数开发者来讲,前后端分离式的开发方式能够更好的组织代码逻辑,我是先学的Flex,后来才知道有WPF这么个东西存在,瞬间觉得非常亲切,不过其子集Silverlight却没有在WEB端发扬光大。
同样,WPF不能运行在其他操作系统,并且在XAML中编写样式表,通用性还是不如HTML强,从学习应用的范围来讲,还是HTML更好一些。
在开发上WPF前端X(A)ML、后台C#,与HTML+JS差不多,但是所学的知识点可能更偏向于.NET内部,也有可视化的编辑器,但是我之前用的时候手感比Winform的差太多了,不过熟练了之后基本上都是基于代码设计,倒也无所谓。
UWP
微软为了针对移动端市场开放的开发框架,我本人没有用过,所以不好做太多评价,但是从目前看来,有个老外说的好:UWP is dead because Windows apps are dead,有兴趣的同学可以去找找相关资料。
总而言之,如果你的APP只需要运行在Windows下,我认为WPF或者UWP是最好的选择,毕竟在调用系统原生API上微软的亲儿子们有着巨大的优势。
没有开发过,不做讨论。
然后是Java阵营
Swing
零几年学Java的老头子们几乎都是从Swing开始学起的,Swing谜一般的默认UI审美观让我直接放弃了继续学习下去的动力
不过我还是利用NetBeans和一个UI控件库开发出了一个比较漂亮的产品,给我的感觉就是这个家伙实在太重了,我也已经很久很久没有碰过Swing了,所以对于现在的Swing是个什么情况也不能详细介绍。
使用NetBeans能勉强达到Visual Studio拖拽控件十分之一的手感吧,其他的我没试过,对我来讲简直是一种灾难……
JavaFx
怎么说呢……说实话我是Java程序员,但是JavaFx出来的时候我根本还没来得及做任何反应,这个家伙就消失在了大众的视野中,也许是我孤陋寡闻,也许是圈子不同,我身边的开发朋友没有一个在用JavaFx。
他的优点在于可以跨平台,缺点在于整个生态环境非常不好,与Winforms一样,自定义一些控件相对比较困难。
接下来是Adobe阵营
Air
我开发过很长一段时间的Flex程序,当Air第一次出现在我眼前的时候,给了我眼前一亮的感觉,相对于Swing来讲,Air更漂亮,因为有很多Flash控件的积累,可选择的资源也会更多一些。
但是随着Flash在浏览器上的节节败退,Air也悄无声息的消失在了大众的视野当中。
它的优点在于可以跨平台,可以基于Flash做出很多超级炫酷的动画特效,但是缺点主要就是效率实在是太低下了,并且在调用操作系统原生API的时候也非常不方便。
开发方式就是硬编码,虽然有FlexBuilder可以使用,但是简直是一个灾难级别的存在……绝对怀疑人生……
而Flash、Flex本身就可以基于Flash Player独立运行,所以不再详细说了。
夹带着谈谈Apple
苹果的桌面开发,我没有开发过,但是在自己的MBP上玩过,基于Objective-C(或现在的Swift)对于很多程序员来讲有点难,现在大多数程序员都是基于C#、Java进行开发,能够使用C、CPP之类中古语言的程序员着实不多,并且与Windows一样,不跨平台,所以开发纯Objective-C的苹果桌面程序的程序员真的是少之又少。
优势嘛,跟Winforms一样,可以非常方便的调用操作系统底层API,劣势也一样,不跨平台、自定义控件比较复杂,可用资源太少。
再来说说QT
QT C++是一个神奇的存在!
我相信现在有非常多的跨平台Desktop Application是基于QT编写的,它不仅能够保证跨平台,而且能够将运行效率最大化。
QT最近在跟车企进行合作,很多监控设备的图形化展示,甚至是试验车内部的液晶仪表盘上都使用QT进行开发的,QT最大的优势就是跨平台!高效率!但是与Objective-C一样,CPP如同一座小山横在了众多server side程序员的面前,如果没有CPP这道小山横贯在前,我认为QT是最好的Desktop Application特别是嵌入式终端的UI开发框架。
QT另外有一个优势在于,它在UI上似乎要比之前几位要方便一些,在它的QML中甚至可以直接使用JavaScript(当然,Java也内置了JS引擎),同时QT中也包含了大量的标准CSS样式表可以使用。
虽然这些特性在其他的语言中也有,例如WPF等,但是QT在保证效率的前提下还能做到跨平台就显得弥足珍贵了!
所以,如果希望自己从事真正意义上的Desktop Application development,QT绝对值得你去学习。
QT有可视化编辑器,但是相比较而言,可能略强于NetBeans的Swing,但是跟VS比起来还是差太远了,不过大多是实际开发都是基于代码的,倒也无所谓。聊胜于无吧。
最后,我们聊聊Electron、NW.js
介于NW的日渐式微,所以我更推荐Electron一些。
我是做大数据开发的,但是我的前端技术还不错,对Sass、Less信手拈来,不基于Bootstrap也能基于Sass或者Less开发类似Bootstrap的UI(虽然审美观还有待大大的加强),我从AngularJS转到VUE这个阵营差不多只花了两天时间,自己可以基于Canvas硬实现流程图(不基于任何框架),但是我自认还达不到熟练使用D3.js或者开发WebGL的水准。
我不需要QT的高效率, 也不希望渲染个大列表需要很长时间,还希望能够达到跨平台的目的,对于DirectUI之类更低层的UI技术根本没有精力去掌握,所以对我来讲Electron简直是最完美的解决方案。
我使用Electron的理由还包括:可以方便的通过Node.JS调用系统API、可以使用SQLite做本地字典项的缓存处理,可以将复杂的计算逻辑放在客户端进行,从而减轻服务器端的压力等等。
所以,Desktop Application的开发,我只推荐两种:
Electron(或NW.js)和QT
其他方案我都不是特别推荐。
当然,如果你的程序只是跑在Windows上,就不用考虑了,WPF是你最好的选择。
Electron开发不要太简单,只要会写HTML,就能写客户端,剩下的交给时间慢慢打磨即可,Node.JS虽说不是最终极的优秀中间件,但是目前来看在Desktop这一块还有发挥余热的地方。
当然,很多人说,我就是不喜欢Electron的应用,体积大效率低。
无可厚非。
但是我不在乎,因为我的硬件,跑个Electron,绰绰有余的多,十几年前刚入行的时候还有人跟我扯打孔机呢。
完结
本文所提到的技术,我并不完全掌握,特别是Objective-C,因为是即兴回答,我也不可能把上面所有的技术都自己跑一便,所以难免有错误,如有笔误之处,还希望各位看官大佬轻拍指点。
资料:
Electron调用DLL:
Kehaw's blog-Electron下调用DLL文件www.kehaw.com
Electron串口通信:
Kehaw's blog-Electron使用串口通信www.kehaw.com
跨平台解决方案中,Qt 和 Electron 孰优孰劣?
看场景,不能一概而论说哪个更好。
Qt适合一些性能要求高的桌面应用,如果你只打算做桌面端的话。或者是一些特殊的场景,比如你要做个类似绘声绘影的视频编辑器,做个类似word之类的桌面应用,那你用electron要么是没法做,要不就是体验非常烂。实际应用上,比如wps,yy语音,VirtualBox,以及部分adobe的桌面工具都是Qt做的。
Electron适合一些偏业务的应用,对性能没有很多要求,主要是业务逻辑和UI展示,比较轻量级的应用。因为Electron可以一份代码同时得到网页版和桌面版,所以如果你的应用还需要网页版,那么Electron可以极大地节省你的开发和维护成本。比如钉钉,slack,现在越来越多的偏业务型(并不是需要高性能的专业工具)应用开始使用Electron来做了。
当然了,native还是web只是一种权衡,并不是有唯一答案的。
比如微信桌面版是native(当然不是Qt,是腾讯自己的UI库)而定位类似的钉钉则是web。豌豆荚这个不需要网页版的应用居然也是web方案(不是Electron,不过方案类似),wunderlist的win32版本也使用了web方案和网页版共用一套代码。
总的来说,native方案(Qt,WPF等)适合于高性能的专业应用,Electron适合想要把网页版和桌面端共享代码,同时对性能没有苛刻要求的场景。如果不在乎成本,native一定是体验更好的(微信),但是如果认为桌面端复用网页版的体验也能接受,那Electron成本会更低一些。
PS:其他回答说到了移动端。无论是Qt还是Electron都不应该考虑移动端,Qt支持很烂,Electron并不支持(官方已经表态不会考虑支持移动端)。这个问题显然只是考虑桌面端的。
PPS:手机淘宝/手机京东并不是web app,不要想当然了。
PPPS:如果想用web方案,就用Electron,不要考虑用Qt去包一个QWebkit(或者任何其他让你自己去包webkit的方案)。做当然是可以做的,不过这等于把Electron又实现了一遍(基本实现倒是简单,但是细节上完善起来需要成吨的工作),同时还不能使用Electron社区已有的大量支持,何必呢。微软都没有选择再造一个而是直接用Electron。
Qt在传统的嵌入式领域无可替代,在跨平台桌面应用UI开发上也是为数不多的好选择(相比于WxWidgets更成熟,同时能够和各个平台自己的本身UI风格基本一致,毕竟实际上都是自己模拟绘制的,有些细微地方还是有差异),electron更多的是前端的一种延伸,前端本身在UI上的开发效率和轮子都是比较多的。完全是两个都很完整的开发生态,各有优缺点,没必要争执一下哪个好。
技术选型更多还是考虑你的团队人员技术积累(C++或者PyQt也行,跟前端,差异还是比较大的)和具体场景。
总结
感觉electron和前端的关系比较大,可以作为全栈学习之后的一个附加学习环节
Qt需要大量用到C++,可以先不学了
PyQt用的是python,比c++方便的多,但是和electron相比没什么优势,因为这两个都不如Qt稳定、快,但是electron起码是基于Web的,一套代码可以实现两个端的应用
所以,综上,要学习桌面端的开发的话建议还是学electron,当然前提是把全栈都做好了,后端问题不大了,现在需要学一学前端,主要是vue框架