桌面应用的多种跨平台方式跨平台桌面应用开发
眾所周知,個(gè)人PC安裝的操作系統(tǒng)主要有三種:Windows、MacOS、Linux(像Chrome OS這種小眾的就不計(jì)較了),國(guó)產(chǎn)操作系統(tǒng)例如UOS、Deepin、優(yōu)麒麟等大多是基于Linux定制開發(fā)的系統(tǒng)。隨著國(guó)產(chǎn)化替代的推進(jìn)以及Mac電腦在開發(fā)設(shè)計(jì)領(lǐng)域逐漸受到歡迎,Windows的老大哥地位越來越不穩(wěn)固,考慮到完善生態(tài)是各家面向大眾推廣的重要一環(huán),跨平臺(tái)開發(fā)應(yīng)用便是其行之有效的手段。下面列舉三種跨平臺(tái)的方式。
「沒有最好,只有最適合。」
虛擬機(jī)(代表JVM、CoreCLR)
Java Virtual Machine
JVM是Java應(yīng)用運(yùn)行所依賴的虛擬機(jī),Java宣稱的“write once, run anywhere”就是靠JVM實(shí)現(xiàn)。得益于Linux服務(wù)器的高市場(chǎng)占有率,眾多的Java Web應(yīng)用被開發(fā)出來通過JVM運(yùn)行在Linux服務(wù)器之上,也因此Java程序員的比例非常高,就業(yè)最容易。常見的場(chǎng)景是,Java開發(fā)人員在個(gè)人電腦(大多是Windows系統(tǒng))上編程,然后打包部署到Linux服務(wù)器??赡苁且?yàn)镴ava的前端框架SWT、Swing等上手不太容易,GUI界面不夠美觀,所以Java桌面應(yīng)用是比較少的,雖然也有例如Eclipse這樣的明星級(jí)應(yīng)用。
CoreCLR是微軟.NET框架的虛擬機(jī),也就是說C#程序依賴它來運(yùn)行。微軟一開始的跨平臺(tái)框架叫做.NET Core,后來與.NET Framework大一統(tǒng)發(fā)布了.NET 5,2021年發(fā)布了.NET 6。名字確實(shí)更簡(jiǎn)潔了,但微軟隨意命名的作風(fēng)一直被人詬病,希望以后不要再改了,像Java一樣幾十年如一日,現(xiàn)在已經(jīng)持續(xù)發(fā)展到Java17了。
值得一提的是,.NET有一個(gè)開源版本Mono也是跨平臺(tái)的,Mono最初由Xamarin公司(前身是Novell公司)開發(fā),2016年被微軟收購(gòu)。著名的游戲引擎Unity就運(yùn)行在Mono之上,但是Mono整體上不如.NET強(qiáng)大,C#的很多新特性在.NET上支持得更好,Unity也有意遷移,替換掉Mono。
交叉編譯(代表Qt、Flutter)
Flutter
Qt可謂是跨平臺(tái)的佼佼者,綜合考量界面統(tǒng)一美觀、穩(wěn)定性、性能等,Qt是當(dāng)前桌面跨平臺(tái)應(yīng)用開發(fā)的不二之選。Qt通過封裝底層操作系統(tǒng)API,交叉編譯后生成對(duì)應(yīng)平臺(tái)的動(dòng)態(tài)鏈接庫(kù)(.dll或.so)和靜態(tài)鏈接庫(kù)(.lib或.a),然后打包時(shí)將這些庫(kù)放入安裝包內(nèi),所以Qt應(yīng)用的安裝包會(huì)稍微有點(diǎn)大。
2017年谷歌推出的Flutter也是交叉編譯,只不過UI層是通過Skia圖像渲染引擎進(jìn)行自繪渲染,3D方面甚至可通過OpenGL、DirectX等使用到硬件加速功能,界面效果更加炫酷。Flutter開發(fā)使用的是Dart語(yǔ)言,提到Dart又一個(gè)小插曲,就是來自于Mozilla的Rust語(yǔ)言,Rust沒有GC,防內(nèi)存泄漏方面卻遠(yuǎn)勝于其他語(yǔ)言,也易上手學(xué)習(xí);與Dart相比之下,網(wǎng)絡(luò)上有人提議為什么不用Rust將Flutter重寫,這種提議得到了很多人響應(yīng),F(xiàn)lutter+Rust組合確實(shí)看起來很美好。Rust其實(shí)也可以跨平臺(tái),它有一個(gè)框架叫Tauri,有興趣的條友可自行研究下。
交叉編譯是一種很靠譜的方式,但開發(fā)環(huán)境的搭建往往異常復(fù)雜,使用到的開發(fā)工具種類多且體積大,總體來說對(duì)開發(fā)人員的要求較高。
腳本語(yǔ)言執(zhí)行環(huán)境(代表NodeJS、Python)
NodeJS的出現(xiàn)掀起了前端領(lǐng)域的腥風(fēng)血雨,使JavaScript真正成為了全棧語(yǔ)言,因?yàn)镹odeJS讓JavaScript不僅僅只運(yùn)行在瀏覽器中,還可以讓它具備訪問操作系統(tǒng)API的能力,做很多瀏覽器不能做的事情。Electron框架就打包了NodeJS作為運(yùn)行時(shí)環(huán)境,以及Chromium瀏覽器內(nèi)核,這樣極大降低了Web應(yīng)用改造成桌面應(yīng)用的成本,微軟開發(fā)VSCode就是一個(gè)強(qiáng)大的Electron跨平臺(tái)應(yīng)用,有在線和本地兩種形態(tài)。但是,微軟似乎對(duì)Electron仍不太滿意,發(fā)布的新版Edge瀏覽器,使用了一種webview2控件,webview2有獨(dú)立和嵌入式兩種版本,感覺獨(dú)立版本可以當(dāng)作JS虛擬機(jī)安裝到各家操作系統(tǒng)上,以后JS跨平臺(tái)應(yīng)用就不用再將Chromium和NodeJS打包進(jìn)自身安裝包內(nèi)了,這樣就大大降低了安裝包的體積。
除了Electron,React Native也是JS跨平臺(tái)陣營(yíng)的一員大將,尤其是2019年微軟推出了React Native for Windows,更是讓React Native在PC端也可以大放異彩。微軟真是跨平臺(tái)領(lǐng)域的模范生,到處都可見它的身影,危機(jī)感很濃烈呀......
Python的GUI框架也有很多種,內(nèi)置的有tkinter,其他框架有wxPython、PyQt5等,但是Python的桌面應(yīng)用做著玩,做些小應(yīng)用什么的還可以,大型應(yīng)用從兼容性、穩(wěn)定性等方面考慮,不建議使用Python。
腳本語(yǔ)言是邊解釋邊執(zhí)行,這是一把雙刃劍,雖然開發(fā)速度快,但是對(duì)內(nèi)存等計(jì)算機(jī)資源的占用卻比較高,Election應(yīng)用太耗內(nèi)存這是不爭(zhēng)的事實(shí),這跟瀏覽器打開太多頁(yè)簽會(huì)占用過多內(nèi)存導(dǎo)致卡頓是一樣的道理。
總結(jié)一下,虛擬機(jī)是服務(wù)端常用的方式,現(xiàn)代虛擬機(jī)也已優(yōu)化的足夠好了,在桌面領(lǐng)域跨平臺(tái),Qt是一種潛意識(shí)中比較靠譜的方式,如果開發(fā)團(tuán)隊(duì)實(shí)力沒問題,Qt往往是首選的方式;Electron是當(dāng)前比較流行的方式,有很多成功的范例;但是,我個(gè)人傾向于webview2這種方式,因?yàn)閃ebAssembly、WebGL這些技術(shù)的發(fā)展使得Web應(yīng)用和原生應(yīng)用的差距越來越小,再加之Web渲染器也能呈現(xiàn)比較美觀的界面,開發(fā)難度也小,未來與Flutter一較高下也未嘗不可。
總結(jié)
以上是生活随笔為你收集整理的桌面应用的多种跨平台方式跨平台桌面应用开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中hashmap_HashMap
- 下一篇: 微软 Xbox 无线手柄繁星紫配色上架,