開發跨平臺app推薦React Native仍是flutter?

嗯。。。這個問題十分很差回答啊(捋下魚須)。閒魚做爲flutter領域的先驅者,以及fish_reduxflutter_boost等當紅flutter庫的做者,固然是歡迎廣大的開發者多多使用flutter相關技術棧 逃~:)。咳咳,不過呢,咱們仍是正經得聊一下React Native(下面簡稱RN)和flutter以前的異同:前端

0x00 簡單介紹一下

React Nativereact

React Native是Facebook開源的一款基於react思想、使用JS、可以給移動平臺帶來native般體驗的框架,官網最新的版本是0.5.9。webpack

flutterc++

flutter來自Google,上層使用dart語言構建跨平臺應用,經過平臺相關的embedded層接入到使用c++編寫的engine層,再經過skia庫直接與GPU進行交互。經過對dart代碼的AOT編譯,擁有優異的計算(CPU)、渲染(GPU)性能。官網最新的版本爲1.2。git

0x01 跨平臺性

開發者們使用跨平臺技術棧,首要的目的是爲了可以省事兒,因此跨平臺能力是首先要被衡量的指標。github

Build native mobile apps using JavaScript and Reactweb

這意味着開發者能夠複用龐大的JavaScript生態和優雅的react思想來書寫RN的代碼,給開發提供不少的便利性。編程

從實現原理上來講,RN進行完排版以後會把最終的渲染交給native view,這種方式帶來的是如native般的UI性能,但同時也給給平臺一致性帶來了一些問題。除開渲染層的不一致,在iOS和Android沒有使用同一個JavaScript虛擬機也會帶來一些暗坑。redux

手勢的處理上兩個平臺很差統一,RN官方也沒有提供一個抹平差別的庫,雖然開源社區有react-native-gesture-handlerreact-native

Beautiful native apps in record time

flutter官方的口氣很大,說本身是」空前「的。是否是」空前「,咱們得來評估一下。

編程語言層面,flutter使用dart語言構建應用,這門語言對大多數人來講應該是比較陌生,好在dart的語法並不複雜,與Java等強類型oop語言很是類似,還加入了函數式的特性,使用起來仍是挺方便的。

flutter提供相似React思想的響應性UI編程模型,讓UI開發變得更加fancy。

原理上來講,flutter在各個平臺上使用統一的vm(dart vm),自帶GDI(skia)。skia是一個已經發展多年成熟度至關高的2D圖形庫,也是Android系統和Chrome一直在使用的圖形庫。

flutter從邏輯計算到渲染繪圖,都是本身的,使得它在跨平臺一致性上有良好的表現。dart提供的AOT特性也能夠保證應用在線上有一個好的性能表現。

多平臺支持

RN目前支持iOS和Android兩個平臺,另外有個非官方的ReactNativeX的項目旨在讓RN運行到其餘平臺。

flutter早期支持iOS和Android,desktop的支持目前尚不完善。近期flutter團隊發佈了Hummingbird,旨在讓flutter編寫的應用能夠運行在瀏覽器端。

從多平臺支持的角度看,兩邊差距不大。相比RN,flutter在desktop的支持上有些優點,但目前都是不怎麼可用狀態。

0x02 開發便利性

工具鏈

RN在打包發佈方面有被前端普遍使用的webpack支持,官方本身提供了基於瀏覽器的debug工具,與前端同窗管用的調試方式並沒有二致。

flutter基於iOS和Android已有的打包工具添加了flutter產物打包功能,一樣debug工具也由官方本身提供,除了剛發佈的基於瀏覽器的調試工具外,flutter團隊提供的調試工具能夠直接在Android Studio或者VScode這類IDE上直接使用。

調試便利性

JS的調試方式已經很成熟了,這裏很少作展開。
flutter在debug階段可使用集成於IDE插件中的hot reload功能作到亞秒級的新代碼加載速度,十分適合與設計師坐在一塊兒結(ya)對(li)編(tiao)程(shi) :)。

第三方庫

在RN上你可使用JS的大部分庫,平臺相關的plugin也相對豐富。

flutter在這方面稍顯欠缺,庫的數量上沒法與JS生態相比較。flutter/plugins項目提供了大量的平臺相關插件供開發者使用,倒也是知足了平常開發的需求,另外dart pubs上的公開庫數量也日趨上升。

在混合開發和大型app業務框架上,閒魚技術開源的flutter_boost提供了與native混合開發的可能,而fish_redux使得大型app中的複雜頁面的開發在flutter中變得更加容易。

0x03 將來的發展

開發者選擇一個技術,都是壓了」身家性命「在上面,誰也不想剛入門就發現這門技術即將被淘汰。

RN是個很好的項目,在發佈之初給移動開發帶來了一陣旋風。但不得不說,Airbnb宣佈放棄使用RN技術棧對於整個社區有不小的打擊,而文章中對緣由的闡述也至關有說服力。

flutter在1.0發佈以後趨於成熟,被欽定爲Google Fuchsia系統的應用層框架。從團隊2019 roadmap中能夠看到,flutter當前重點在於完善一些現有功能上的細節與bugfix,另外對於廣受期待的動態化特性,flutter團隊也在開發code push功能。從flutter團隊目前的方向和筆者在閒魚開發中實際使用的flutter的感覺來看,總體上flutter在框架層面目前已經基本上穩定。

從桌面端跨平臺框架發展的歷程來看,Java GUI從最初使用peer(對等設計模式)的AWT,到基於Java圖形繪製接口性能巨慢無比的Swing,再到公認性能最好目前應用最普遍的基於目標平臺繪製接口的SWT,咱們能夠從中窺見一些歷史規律。

peer(對等設計模式),即AWT中的一個控件,對應目標平臺(如Windows)上的一個控件(是否是看起來跟RN有一些類似),最終AWT被放棄是由於peer模式傳輸層級過多形成效率低下,GUI部分爲了保證可移植性只能保留各個平臺公共的接口。

SWT與QT(另外一個被普遍使用的桌面端跨平臺GUI框架),犧牲了一部分可移植性(主要是由於直接調用了目標平臺的圖形繪製接口),帶來了GUI的高性能。flutter也採用了相似技術棧,skia來抹平各個平臺的繪製接口差別,並向上提供統一的圖形接口。

從這個角度來講,無疑flutter可能會是一個更有將來的跨平臺框架。

0x04 寫在最後

固然Facebook官方對於RN正在進行重構,包括把大部分邏輯移動到c++層來減小線程切換的開銷提高性能等。

選擇一個框架須要考慮的實際狀況比框架的優劣比較更加劇要,好比你的項目大小、開發人員構成等,
RN和flutter做爲目前移動平臺上煊赫一時的框架,二者並非孰優孰劣的對立關係。

紙上得來終覺淺,若是你是個對新技術感興趣,抑或是但願在移動平臺上有所突破的開發者,何不嘗試一下Google最新的成果咧?



本文做者:閒魚技術-海豬

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索