开发跨平台app推荐React Native还是flutter?
嗯。。。這個問題十分不好回答啊(捋下魚須)。閑魚作為flutter領域的先驅(qū)者,以及fish_redux、flutter_boost等當紅flutter庫的作者,當然是歡迎廣大的開發(fā)者多多使用flutter相關技術棧 逃~:)。咳咳,不過呢,我們還是正經(jīng)得聊一下React Native(下面簡稱RN)和flutter之前的異同:
0x00 簡單介紹一下
React Native
React Native是Facebook開源的一款基于react思想、使用JS、能夠給移動平臺帶來native般體驗的框架,官網(wǎng)最新的版本是0.5.9。
flutter
flutter來自Google,上層使用dart語言構建跨平臺應用,通過平臺相關的embedded層接入到使用c++編寫的engine層,再通過skia庫直接與GPU進行交互。通過對dart代碼的AOT編譯,擁有優(yōu)異的計算(CPU)、渲染(GPU)性能。官網(wǎng)最新的版本為1.2。
0x01 跨平臺性
開發(fā)者們使用跨平臺技術棧,首要的目的是為了能夠省事兒,所以跨平臺能力是首先要被衡量的指標。
Build native mobile apps using JavaScript and React
這意味著開發(fā)者可以復用龐大的JavaScript生態(tài)和優(yōu)雅的react思想來書寫RN的代碼,給開發(fā)提供很多的便利性。
從實現(xiàn)原理上來說,RN進行完排版之后會把最終的渲染交給native view,這種方式帶來的是如native般的UI性能,但同時也給給平臺一致性帶來了一些問題。除開渲染層的不一致,在iOS和Android沒有使用同一個JavaScript虛擬機也會帶來一些暗坑。
手勢的處理上兩個平臺不好統(tǒng)一,RN官方也沒有提供一個抹平差異的庫,雖然開源社區(qū)有react-native-gesture-handler。
Beautiful native apps in record time
flutter官方的口氣很大,說自己是”空前“的。是不是”空前“,我們得來評估一下。
編程語言層面,flutter使用dart語言構建應用,這門語言對大多數(shù)人來說應該是比較陌生,好在dart的語法并不復雜,與Java等強類型oop語言非常相似,還加入了函數(shù)式的特性,使用起來還是挺方便的。
flutter提供類似React思想的響應性UI編程模型,讓UI開發(fā)變得更加fancy。
原理上來說,flutter在各個平臺上使用統(tǒng)一的vm(dart vm),自帶GDI(skia)。skia是一個已經(jīng)發(fā)展多年成熟度相當高的2D圖形庫,也是Android系統(tǒng)和Chrome一直在使用的圖形庫。
flutter從邏輯計算到渲染繪圖,都是自己的,使得它在跨平臺一致性上有良好的表現(xiàn)。dart提供的AOT特性也可以保證應用在線上有一個好的性能表現(xiàn)。
多平臺支持
RN目前支持iOS和Android兩個平臺,另外有個非官方的ReactNativeX的項目旨在讓RN運行到其他平臺。
flutter早期支持iOS和Android,desktop的支持目前尚不完善。近期flutter團隊發(fā)布了Hummingbird,旨在讓flutter編寫的應用可以運行在瀏覽器端。
從多平臺支持的角度看,兩邊差距不大。相比RN,flutter在desktop的支持上有些優(yōu)勢,但目前都是不怎么可用狀態(tài)。
0x02 開發(fā)便利性
工具鏈
RN在打包發(fā)布方面有被前端廣泛使用的webpack支持,官方自己提供了基于瀏覽器的debug工具,與前端同學管用的調(diào)試方式并無二致。
flutter基于iOS和Android已有的打包工具添加了flutter產(chǎn)物打包功能,同樣debug工具也由官方自己提供,除了剛發(fā)布的基于瀏覽器的調(diào)試工具外,flutter團隊提供的調(diào)試工具可以直接在Android Studio或者VScode這類IDE上直接使用。
調(diào)試便利性
JS的調(diào)試方式已經(jīng)很成熟了,這里不多做展開。
flutter在debug階段可以使用集成于IDE插件中的hot reload功能做到亞秒級的新代碼加載速度,十分適合與設計師坐在一起結(ya)對(li)編(tiao)程(shi) :)。
第三方庫
在RN上你可以使用JS的大部分庫,平臺相關的plugin也相對豐富。
flutter在這方面稍顯欠缺,庫的數(shù)量上無法與JS生態(tài)相比較。flutter/plugins項目提供了大量的平臺相關插件供開發(fā)者使用,倒也是滿足了日常開發(fā)的需求,另外dart pubs上的公開庫數(shù)量也日趨上升。
在混合開發(fā)和大型app業(yè)務框架上,閑魚技術開源的flutter_boost提供了與native混合開發(fā)的可能,而fish_redux使得大型app中的復雜頁面的開發(fā)在flutter中變得更加容易。
0x03 未來的發(fā)展
開發(fā)者選擇一個技術,都是壓了”身家性命“在上面,誰也不想剛?cè)腴T就發(fā)現(xiàn)這門技術即將被淘汰。
RN是個很好的項目,在發(fā)布之初給移動開發(fā)帶來了一陣旋風。但不得不說,Airbnb宣布放棄使用RN技術棧對于整個社區(qū)有不小的打擊,而文章中對原因的闡述也相當有說服力。
flutter在1.0發(fā)布之后趨于成熟,被欽定為Google Fuchsia系統(tǒng)的應用層框架。從團隊2019 roadmap中可以看到,flutter當前重點在于完善一些現(xiàn)有功能上的細節(jié)與bugfix,另外對于廣受期待的動態(tài)化特性,flutter團隊也在開發(fā)code push功能。從flutter團隊目前的方向和筆者在閑魚開發(fā)中實際使用的flutter的感受來看,整體上flutter在框架層面目前已經(jīng)基本上穩(wěn)定。
從桌面端跨平臺框架發(fā)展的歷程來看,Java GUI從最初使用peer(對等設計模式)的AWT,到基于Java圖形繪制接口性能巨慢無比的Swing,再到公認性能最好目前應用最廣泛的基于目標平臺繪制接口的SWT,我們可以從中窺見一些歷史規(guī)律。
peer(對等設計模式),即AWT中的一個控件,對應目標平臺(如Windows)上的一個控件(是不是看起來跟RN有一些相似),最終AWT被放棄是因為peer模式傳輸層級過多造成效率低下,GUI部分為了保證可移植性只能保留各個平臺公共的接口。
SWT與QT(另一個被廣泛使用的桌面端跨平臺GUI框架),犧牲了一部分可移植性(主要是因為直接調(diào)用了目標平臺的圖形繪制接口),帶來了GUI的高性能。flutter也采用了類似技術棧,skia來抹平各個平臺的繪制接口差異,并向上提供統(tǒng)一的圖形接口。
從這個角度來說,無疑flutter可能會是一個更有未來的跨平臺框架。
0x04 寫在最后
當然Facebook官方對于RN正在進行重構,包括把大部分邏輯移動到c++層來減少線程切換的開銷提升性能等。
選擇一個框架需要考慮的實際情況比框架的優(yōu)劣比較更加重要,比如你的項目大小、開發(fā)人員構成等,
RN和flutter作為目前移動平臺上炙手可熱的框架,兩者并不是孰優(yōu)孰劣的對立關系。
紙上得來終覺淺,如果你是個對新技術感興趣,抑或是希望在移動平臺上有所突破的開發(fā)者,何不嘗試一下Google最新的成果咧?
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結
以上是生活随笔為你收集整理的开发跨平台app推荐React Native还是flutter?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于实时计算(Flink)与高斯模型构建
- 下一篇: UI2Code智能生成Flutter代码