桌面應用開發解決方案


桌面應用開發解決方案

Electron 和當下其他的桌面開發方法相比如何?

我大概開發Electron快兩年的時間了,期間也做過一些產品。

首先我們看一下我們常用的客戶端軟件開發都有哪些技術:

首先是Microsoft陣營的

Winform

如雷貫耳,大多數人開發CS程序都是基於Winform去做的,它的有點在於簡單、高效,但是它的缺點在於,如果你想深入的美化UI,需要耗費很大的力氣,對於目前主流的CSS樣式表來講,美化Winform的界面以及自定義控件是需要耗費更多的時間的。

imgimg

並且,Winform由於其出身,原生是不可以運行在其他操作系統之上的,當然,我已經很久很久很久沒有用過Winform了,所以對其現在的發展現狀並不是很了解。

在開發上,Winforms簡直不要太簡單,如果對UI沒有苛求的話,Visual Studio能夠拖到你懷疑人生。

WPF

微軟的又一個殺手鐧,其基於XML+C#+CSS的呈現方式讓它在UI上有了更加靈活的設計寬度,並且對大多數開發者來講,前后端分離式的開發方式能夠更好的組織代碼邏輯,我是先學的Flex,后來才知道有WPF這么個東西存在,瞬間覺得非常親切,不過其子集Silverlight卻沒有在WEB端發揚光大。

imgimg

同樣,WPF不能運行在其他操作系統,並且在XAML中編寫樣式表,通用性還是不如HTML強,從學習應用的范圍來講,還是HTML更好一些。

在開發上WPF前端X(A)ML、后台C#,與HTML+JS差不多,但是所學的知識點可能更偏向於.NET內部,也有可視化的編輯器,但是我之前用的時候手感比Winform的差太多了,不過熟練了之后基本上都是基於代碼設計,倒也無所謂。

UWP

微軟為了針對移動端市場開放的開發框架,我本人沒有用過,所以不好做太多評價,但是從目前看來,有個老外說的好:UWP is dead because Windows apps are dead,有興趣的同學可以去找找相關資料。

imgimg

總而言之,如果你的APP只需要運行在Windows下,我認為WPF或者UWP是最好的選擇,畢竟在調用系統原生API上微軟的親兒子們有着巨大的優勢。

沒有開發過,不做討論。

然后是Java陣營

Swing

零幾年學Java的老頭子們幾乎都是從Swing開始學起的,Swing謎一般的默認UI審美觀讓我直接放棄了繼續學習下去的動力

imgimg

不過我還是利用NetBeans和一個UI控件庫開發出了一個比較漂亮的產品,給我的感覺就是這個家伙實在太重了,我也已經很久很久沒有碰過Swing了,所以對於現在的Swing是個什么情況也不能詳細介紹。

使用NetBeans能勉強達到Visual Studio拖拽控件十分之一的手感吧,其他的我沒試過,對我來講簡直是一種災難……

JavaFx

怎么說呢……說實話我是Java程序員,但是JavaFx出來的時候我根本還沒來得及做任何反應,這個家伙就消失在了大眾的視野中,也許是我孤陋寡聞,也許是圈子不同,我身邊的開發朋友沒有一個在用JavaFx。

imgimg

他的優點在於可以跨平台,缺點在於整個生態環境非常不好,與Winforms一樣,自定義一些控件相對比較困難。

接下來是Adobe陣營

Air

我開發過很長一段時間的Flex程序,當Air第一次出現在我眼前的時候,給了我眼前一亮的感覺,相對於Swing來講,Air更漂亮,因為有很多Flash控件的積累,可選擇的資源也會更多一些。

但是隨着Flash在瀏覽器上的節節敗退,Air也悄無聲息的消失在了大眾的視野當中。

imgimg

它的優點在於可以跨平台,可以基於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開發框架。

imgimg

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框架


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM