原生開發(fā)應(yīng)用開發(fā)
Microsoft陣營(yíng)的
Winform
WinForm是·Net開發(fā)平臺(tái)中對(duì)Windows Form的一種稱謂体箕。
如果你想深入的美化UI,需要耗費(fèi)很大的力氣政溃,對(duì)于目前主流的CSS樣式表來講,美化Winform的界面以及自定義控件是需要耗費(fèi)更多的時(shí)間的。
WPF
基于XML+C#+CSS的呈現(xiàn)方式讓它在UI上有了更加靈活的設(shè)計(jì)寬度
WPF和WinForms是兩種完全不一樣的UI技術(shù)誉结,WPF也并不能完全取代WinForms。
WPF不能運(yùn)行在其他操作系統(tǒng)券躁,并且在XAML中編寫樣式表惩坑,通用性還是不如HTML強(qiáng),從學(xué)習(xí)應(yīng)用的范圍來講也拜,還是HTML更好一些以舒。
UWP
微軟為了針對(duì)移動(dòng)端市場(chǎng)開放的開發(fā)框架,如果你的APP只需要運(yùn)行在Windows下慢哈,我認(rèn)為WPF或者UWP是最好的選擇蔓钟,畢竟在調(diào)用系統(tǒng)原生API上微軟的親兒子們有著巨大的優(yōu)勢(shì)。
windows上各種各樣的技術(shù)開發(fā)的IDE和其他程序
性能上:Java最差 -> Electron -> WindowsForms -> 原生 -> WPF
占內(nèi)存:Java最多 -> Electron -> WPF -> WindowsForms -> 原生
Java陣營(yíng)
Swing
零幾年學(xué)Java的老頭子們幾乎都是從Swing開始學(xué)起的卵贱,Swing謎一般的默認(rèn)UI審美觀讓我直接放棄了繼續(xù)學(xué)習(xí)下去的動(dòng)力滥沫。
JavaFx
優(yōu)點(diǎn)在于可以跨平臺(tái),缺點(diǎn)在于整個(gè)生態(tài)環(huán)境非常不好键俱,與Winforms一樣兰绣,自定義一些控件相對(duì)比較困難。
Adobe陣營(yíng)
Air
Flex程序编振,它的優(yōu)點(diǎn)在于可以跨平臺(tái)缀辩,可以基于Flash做出很多超級(jí)炫酷的動(dòng)畫特效,但是缺點(diǎn)主要就是效率實(shí)在是太低下了党觅,并且在調(diào)用操作系統(tǒng)原生API的時(shí)候也非常不方便雌澄。隨著Flash在瀏覽器上的節(jié)節(jié)敗退,Air也悄無聲息的消失在了大眾的視野當(dāng)中杯瞻。
Apple
Objective-C(或現(xiàn)在的Swift)镐牺,跟Winforms一樣惋戏,可以非常方便的調(diào)用操作系統(tǒng)底層API列赎,劣勢(shì)也一樣睁冬,不跨平臺(tái)矗晃、自定義控件比較復(fù)雜,可用資源太少∑枧ǎ現(xiàn)在大多數(shù)程序員都是基于C#痹束、Java進(jìn)行開發(fā),如果不是Apple死忠讶请,根部不會(huì)花大力氣研究
跨平臺(tái)軟件應(yīng)用開發(fā)
直接元素開發(fā)肯定是最好的——這樣的性能肯定最有保證祷嘶,但是跨平臺(tái)的主要優(yōu)勢(shì)在于代碼邏輯的復(fù)用,減少各平臺(tái)同一邏輯夺溢,因人而異的開發(fā)成本论巍。對(duì)于企業(yè)而言,一套業(yè)務(wù)邏輯可以在多處使用是最理想也是最保險(xiǎn)的风响。
Electron是由Github開發(fā)嘉汰,用HTML,CSS和JavaScript來構(gòu)建跨平臺(tái)桌面應(yīng)用程序的一個(gè)開源庫(kù)状勤。 Electron通過將Chromium和Node.js合并到同一個(gè)運(yùn)行時(shí)環(huán)境中鞋怀,并將其打包為Mac,Windows和Linux系統(tǒng)下的應(yīng)用來實(shí)現(xiàn)這一目的持搜。通過Node它提供了通常瀏覽器所不能提供的能力密似。?
electron的特點(diǎn)就是可以復(fù)用前端的各種輪子。所以它開發(fā)快朵诫,招人方便辛友。
可以方便的通過Node.JS調(diào)用系統(tǒng)API、可以使用SQLite做本地字典項(xiàng)的緩存處理剪返,可以將復(fù)雜的計(jì)算邏輯放在客戶端進(jìn)行废累,從而減輕服務(wù)器端的壓力等等。
electron都成千上萬個(gè)成熟項(xiàng)目在桌面里用了脱盲,什么flutter邑滨,javafx,swiftui钱反,目前還是無法比
electron和node-webkit(現(xiàn)在叫nw.js)的區(qū)別:
掖看。從概念上,Electron與nw.js很相似面哥,但是他們有很重要的區(qū)別:一個(gè)主要的不同點(diǎn)是Electron 通過 Googles Chromium Content Module 來使用 Chromium 的功能哎壳,nw.js 則直接使用了 Chromium本身。
electron建立在?Chromium 和 NodeJS 之上的尚卫,一個(gè)負(fù)責(zé)界面归榕,一個(gè)負(fù)責(zé)背后的邏輯
Cordova,PhoneGap
Cordova[?k??d?b?]是 hybride 類框架吱涉,基于HTML刹泄,CSS和JavaScript的外里,創(chuàng)建移動(dòng)跨平臺(tái)移動(dòng)應(yīng)用程序的快速開發(fā)平臺(tái)
2011年10月4日Adobe公司收購(gòu)了PhoneGap和PhoneGap Build的新創(chuàng)公司Nitobi Software,隨后將Phonegap的核心代碼剝離并捐給了Apache公司特石,并改名為了Cordova盅蝗。
核心的東西就是H5與Native的交互原理、Bridge姆蘸、定義的解析規(guī)則(Engine)
Cordova Application是Cordova框架獨(dú)立于不同手機(jī)操作系統(tǒng)的一個(gè)封裝層墩莫。具體包括
Web App層是開發(fā)人員編寫代碼的主要地方,應(yīng)用程序以網(wǎng)頁的形式呈現(xiàn)乞旦,在一個(gè)index.html的本地頁面文件中引用所需要的各種Web資源贼穆,如CSS、JavaScript兰粉、圖像、影音文件等顶瞳。應(yīng)用程序的配置保存在config.xml文件中玖姑。
對(duì)于使用cordova cli初始化的web app 在主目錄下會(huì)存在一個(gè)config.xml,其中包含了整個(gè)app的一些基本信息:比如appName慨菱、app入口文件焰络、白名單、webview初始化的一些配置符喝、plugin信息闪彼、圖標(biāo)資源信息
WebView層用來呈現(xiàn)用戶界面,即web頁面的展現(xiàn)协饲。例如畏腕,在Android平臺(tái)是通過WebView控件實(shí)現(xiàn)web頁面的呈現(xiàn)。
Plugins主要用于在JavaScript代碼中調(diào)用各平臺(tái)native的功能茉稠。Cordova項(xiàng)目已經(jīng)包含一些核心的plugin描馅,如電池、攝像頭而线、通訊錄等铭污。開發(fā)人員也可以開發(fā)自定義的plugin,來實(shí)現(xiàn)所需要的功能膀篮。
Mobile OS就是具體的手機(jī)操作系統(tǒng)層
Cordova預(yù)先幫我們預(yù)先封裝了各種mobile os上最常用的本地api調(diào)用嘹狞,然后以統(tǒng)一的JavaScript api形式提供給webapp開發(fā)者調(diào)用。
對(duì)于webapp的開發(fā)者來說誓竿,無需關(guān)注系統(tǒng)底層調(diào)用實(shí)現(xiàn)細(xì)節(jié)磅网,也就實(shí)現(xiàn)了所謂的“跨平臺(tái)”。實(shí)際上烤黍,各平臺(tái)涉及到本地能力的調(diào)用知市,以插件形式被封裝了傻盟。(每個(gè)插件的實(shí)現(xiàn)實(shí)際上還是Native模式)。
JS和Native是如何實(shí)現(xiàn)互調(diào)的嫂丙,這里先研究安卓的
Cordova-Android是通過addJavascriptInterface(Android Webview的API)和JS Prompt這兩種方式來實(shí)現(xiàn)JS對(duì)于Native API的調(diào)用娘赴。
我們先來看一個(gè)Cordova-Android框架中的一個(gè)關(guān)鍵類: CordovaActivity.java。
該類繼承了Android Activty類跟啤,實(shí)際上是Cordova-Android的Launcher Activity诽表,也就是啟動(dòng)入口activity。
應(yīng)用啟動(dòng)后隅肥,核心干了兩件事:讀取config.xml和loadUrl竿奏。這個(gè)loadUrl實(shí)際上就是加載webapp的啟動(dòng)頁(默認(rèn)是index.html)。
IOS具體參看《Cordova 工作原理(IOS篇)》腥放,這里關(guān)于原理這是簡(jiǎn)介泛啸。
Xamarin ['z?m?r?n]是一個(gè)開放源代碼平臺(tái),用于通過 .NET 構(gòu)建適用于 iOS秃症、Android 和 Windows 的新式高性能應(yīng)用程序候址。
Xamarin主要有這么幾項(xiàng)技術(shù),Xamarin.Android种柑、Xamarin.iOS和Xamarin.Forms岗仑,此外還有Xamarin.UWP、Xamarin.Windows聚请、Xamarin.WinPhone等荠雕。本質(zhì)都是對(duì)原生API做了一層C#的封裝,因此在使用上與原生API會(huì)十分相似驶赏。這種封裝會(huì)結(jié)合一些C#的語法特性炸卑,讓開發(fā)者可以享受C#的語法糖。Xamarin.iOS是直接編譯成ARM的二進(jìn)制代碼母市,因此執(zhí)行效率肯定是非常高的矾兜。
Xamarin.Android被編譯成中間語言,Xamarin在APK安裝包中會(huì)包含一個(gè)mono(跨平臺(tái)的.NET運(yùn)行環(huán)境)患久,代碼是在mono運(yùn)行時(shí)和安卓本地的運(yùn)行時(shí)上完成工作的椅寺。
Mono?[?m?n??]?虛擬機(jī)包含一個(gè)實(shí)時(shí)編譯引擎,該引擎可用于如下處理器:x86蒋失,SPARC返帕,PowerPC,ARM篙挽,S390(32位模式和64位模式)荆萤,x86-64,IA64 和64位模式的 SPARC。該虛擬機(jī)可以將代碼實(shí)時(shí)編譯或者預(yù)先編譯到原生代碼链韭。對(duì)于那些沒有列出來的系統(tǒng)偏竟,則使用的是代碼解釋器。
Xamarin 是一個(gè)抽象層敞峭,可管理共享代碼與基礎(chǔ)平臺(tái)代碼的通信踊谋。 Xamarin 在提供便利(如內(nèi)存分配和垃圾回收)的托管環(huán)境中運(yùn)行。
Xamarin始創(chuàng)于2011年旋讹,旨在使移動(dòng)開發(fā)變得難以置信地迅捷和簡(jiǎn)單殖蚕。
Xamarin 適用于具有以下目標(biāo)的開發(fā)人員:
跨平臺(tái)共享代碼、測(cè)試和業(yè)務(wù)邏輯沉迹。
使用 Visual Studio 在 C# 中編寫跨平臺(tái)應(yīng)用程序睦疫。
?Xamarin 允許在每個(gè)平臺(tái)上創(chuàng)建本機(jī) UI,并在 C# 中編寫跨平臺(tái)共享的業(yè)務(wù)邏輯鞭呕。 在大多數(shù)情況下蛤育,80% 的應(yīng)用程序代碼可使用 Xamarin 進(jìn)行共享。
Xamarin最為關(guān)鍵的技術(shù)Xamarin.Forms琅拌,把IOS缨伊、android、UWP等平臺(tái)的GUI進(jìn)行了一統(tǒng)地抽象进宝,開發(fā)者只需要寫一套代碼,編譯器會(huì)在編譯時(shí)將界面映射到原先控件上枷恕,從而獲得原生平臺(tái)的外觀和性能党晋。
Xamarin 在 .NET 的基礎(chǔ)之上進(jìn)行構(gòu)建,它自動(dòng)處理諸如內(nèi)存分配徐块、垃圾回收以及與基礎(chǔ)平臺(tái)的互操作性等任務(wù)未玻。
Xamarin之前是收費(fèi)的,而且據(jù)說收費(fèi)不菲胡控,所以使用的人數(shù)比較少扳剿,在國(guó)內(nèi)幾乎無人問津。后來Xamarin被微軟收購(gòu)昼激,現(xiàn)已免費(fèi)開放庇绽,但是從白學(xué).net開始,就對(duì)微軟的東西不感冒了橙困。微軟的東西雖好瞧掺,但是叫好不叫座。
Flutter
flutter 其實(shí)就是一套谷歌開源的跨平臺(tái) UI 開發(fā)框架凡傅,支持 Android 和 iOS 辟狈,并且目前開始支持 Web 和 MacOS,未來還會(huì)繼續(xù)支持 Win和 Linux 平臺(tái)的一套 UI 框架。
Dart UI是一個(gè) C++實(shí)現(xiàn)的 dart:ui庫(kù)的 Native Binding哼转,并且 UI Lib也是 Dart GUI程序的應(yīng)用主要入口明未。
Dart UI向上層提供了 window、text壹蔓、canvas趟妥、geometry等通用的繪圖能力, Runtime在調(diào)用 Dart UI時(shí)庶溶,Dart UI根據(jù)傳遞的 main entrypoint 來執(zhí)行并且向 window渲染圖像煮纵。
react-native 、weex 和 flutter 都只是 UI 框架偏螺,它解決的其實(shí)是跨平臺(tái)上的 UI 實(shí)現(xiàn)行疏,讓界面布局或者實(shí)現(xiàn)的業(yè)務(wù)邏輯可以在多端統(tǒng)一。但是它也僅僅只是 UI 框架套像,比如 react-native 本身就是依賴于原生控件酿联,而 flutter 的 webview 、mapview 也都需要依賴原生開發(fā)來支撐夺巩。
Dart這門語言最初就是一幫Java程序員為了方便寫UI搞出來的贞让。如果你們團(tuán)隊(duì)Java/Swift程序員比較多,那Flutter從上手方面來說更快柳譬。
為什么選擇Dart
Dart 的性能更好喳张。Dart在 JIT模式下,速度與 JavaScript基本持平美澳。但是 Dart支持 AOT销部,當(dāng)以 AOT模式運(yùn)行時(shí),JavaScript便遠(yuǎn)遠(yuǎn)追不上了制跟。
Native Binding舅桩。在 Android上雨膨,v8的 Native Binding可以很好地實(shí)現(xiàn)擂涛,但是 iOS上的 JavaScriptCore不可以,所以如果使用 JavaScript聊记,F(xiàn)lutter 基礎(chǔ)框架的代碼模式就很難統(tǒng)一了撒妈。而 Dart的 Native Binding可以很好地通過 Dart Lib實(shí)現(xiàn)。
Fuchsia?[?fju???] OS內(nèi)置的應(yīng)用瀏覽器就是使用 Dart語言作為 App的開發(fā)語言甥雕。而且實(shí)際上踩身,F(xiàn)lutter是 Fuchisa OS的應(yīng)用框架概念上的一個(gè)子集。
Dart是類型安全的語言社露,擁有完善的包管理和諸多特性挟阻。Google召集了如此多個(gè)編程語言界的設(shè)計(jì)專家開發(fā)出這樣一門語言,旨在取代 JavaScript,所以 Fuchsia OS內(nèi)置了 Dart附鸽。Dart可以作為 embedded lib嵌入應(yīng)用脱拼,而不用只能隨著系統(tǒng)升級(jí)才能獲得更新,這也是優(yōu)勢(shì)之一坷备。
Skia是什么熄浓?
Skia是一個(gè) 2D的繪圖引擎庫(kù),其前身是一個(gè)向量繪圖軟件省撑,Chrome和 Android均采用 Skia作為繪圖引擎赌蔑。Skia提供了非常友好的 API,并且在圖形轉(zhuǎn)換竟秫、文字渲染娃惯、位圖渲染方面都提供了友好、高效的表現(xiàn)肥败。Skia是跨平臺(tái)的趾浅,所以可以被嵌入到 Flutter的 iOS SDK中,而不用去研究 iOS閉源的 Core Graphics / Core Animation馒稍。因?yàn)锳ndroid自帶了 Skia皿哨,所以 Flutter Android SDK要比 iOS SDK小很多。
QT C++
QT最大的優(yōu)勢(shì)就是跨平臺(tái)纽谒!高效率证膨!但是與Objective-C一樣,CPP如同一座小山橫在了眾多server side程序員的面前鼓黔,如果沒有CPP這道小山橫貫在前椎例,我認(rèn)為QT是最好的Desktop Application特別是嵌入式終端的UI開發(fā)框架。
QT另外有一個(gè)優(yōu)勢(shì)在于请祖,它在UI上似乎要比之前幾位要方便一些,在它的QML中甚至可以直接使用JavaScript(當(dāng)然脖祈,Java也內(nèi)置了JS引擎)肆捕,同時(shí)QT中也包含了大量的標(biāo)準(zhǔn)CSS樣式表可以使用
如果希望自己從事真正意義上的Desktop Application development,QT絕對(duì)值得你去學(xué)習(xí)盖高。
QT有可視化編輯器慎陵,但是相比較而言,可能略強(qiáng)于NetBeans的Swing喻奥,但是跟VS比起來還是差太遠(yuǎn)了席纽,不過大多是實(shí)際開發(fā)都是基于代碼的
x-platform
這玩意,個(gè)人覺得沒有啥奔頭撞蚕。
參考文章:
快速了解Electron:新一代基于Web的跨平臺(tái)桌面技術(shù)?https://www.cnblogs.com/imstudy/p/11022315.html
Flutter原理簡(jiǎn)解?https://zhuanlan.zhihu.com/p/36861174
轉(zhuǎn)載本站文章《客戶端軟件GUI開發(fā)技術(shù)漫談:原生與跨平臺(tái)解決方案分析》,
請(qǐng)注明出處:https://www.zhoulujun.cn/html/webfront/engineer/Architecture/8468.html