作者:LeanCloud 鄭鵬
2018 年 12 月狸捅,Google 發(fā)布了 Flutter 1.0 正式版,似乎再次點燃了人們對移動跨平臺開發(fā)的熱情累提。上一次出現(xiàn)類似的情況尘喝,是在 15 年年初,F(xiàn)acebook 發(fā)布 React Native 的時候斋陪。四年不到的時間里朽褪,有兩家大公司相繼推出了自己的移動跨平臺方案(當(dāng)然還有 16 年的時候,微軟收購了 Xamarin无虚,不過沒有前兩個那么引人注目罷了)缔赠,同時這些方案也受到了市場的追逐。這些現(xiàn)象友题,似乎預(yù)示著嗤堰,跨平臺開發(fā)才是移動開發(fā)的未來,或者說度宦,跨平臺開發(fā)才是一種更好的開發(fā)方式梁棠。
既然它是熱點置森,那肯定有可以討論的地方。不過符糊,在說 React Native 和 Flutter 之前凫海,我覺得要先談一談「跨平臺開發(fā)」。
移動跨平臺方案
那什么是「跨平臺開發(fā)」呢男娄?
通常意義上來說行贪,如果你想在 iOS 以及 Android 系統(tǒng)里,提供有相同內(nèi)容的 App模闲,那么使用 Apple 提供的構(gòu)建工具建瘫,開發(fā)一個 App,然后上架到 AppStore尸折,同時使用 Google 提供的構(gòu)建工具啰脚,開發(fā)一個 App,然后上架到 Google Play实夹。這兩個 App 的實現(xiàn)橄浓,除了使用的工具不同之外,大部分業(yè)務(wù)邏輯是相同的亮航。你可以發(fā)現(xiàn)荸实,在這個過程中,產(chǎn)生了「重復(fù)」缴淋。
在重構(gòu)時准给,如果項目里有大量的重復(fù)代碼,或者重復(fù)邏輯重抖,我們一般會將這些代碼或邏輯以函數(shù)露氮,模塊或庫的形式做封裝,這個過程最大化的消除了重復(fù)的代碼钟沛,最終達(dá)到簡化項目的代碼這一目的沦辙。
所以在我看來,「跨平臺開發(fā)」也是基于這個思想而產(chǎn)生的讹剔,人們想要一套減少甚至不用寫重復(fù)邏輯的解決方案油讯,然后市場給予了人們期望的方案⊙忧罚跨平臺方案的最大特點陌兑,可以用 Sun 當(dāng)年在推廣 Java 時,所使用的一句口號:”Write once, run anywhere” 作為總結(jié)由捎。這一句話兔综,也被如今的 React Native 以及 Flutter 引用或繼承。
React Native
React Native 是由 Facebook 所主導(dǎo)的跨平臺方案,得益于 Javascript 以及 ReactJS 的流行软驰,React Native 在推出時涧窒,便受到了大量的追捧。除了跨平臺的特性锭亏,React Native 最大的特點就是纠吴,可以使用 Javascript 來構(gòu)建移動應(yīng)用,并且最終應(yīng)用的表現(xiàn)形式慧瘤,可以做到和使用原生開發(fā)套件開發(fā)的應(yīng)用相差無幾戴已。
React Native 能做到這些的核心原理就是 JavaScriptCore,一個 JavaScript 虛擬機(jī)锅减。通過 JavaScriptCore糖儡,Javascript 能和其它語言互相轉(zhuǎn)義,同時 JavaScriptCore 能運行在 iOS怔匣,Android 以及其它平臺上握联,這些可能性放在一起,就成為了 React Native 的基底每瞒。有了這個基底之后金闽,F(xiàn)acebook 便在這個基礎(chǔ)之上,封裝了各平臺的應(yīng)用層接口独泞,定義了 Javascript 和封裝后的接口之間的通信協(xié)議,最終苔埋,實現(xiàn)了使用 JavaScript 在不同平臺開發(fā)具有原生體驗的應(yīng)用懦砂。
從實現(xiàn)原理以及架構(gòu)上來看,React Native 似乎是一個不錯的跨平臺方案组橄,只要封裝好各平臺的 API荞膘,那么我們有理由去相信,人們能夠使用 React Native 開發(fā)出品質(zhì)優(yōu)秀的應(yīng)用玉工。但是事實上羽资,理想和現(xiàn)實,還是有差距的遵班。在 18 年屠升,AirBnB 以及 Udacity 相繼發(fā)表了博文,聲明全面放棄 React Native狭郑,轉(zhuǎn)向原生應(yīng)用的開發(fā)腹暖。他們在文章中,提到的最多的就是翰萨,React Native 是一個不成熟的方案脏答,雖然它有許許多多的優(yōu)點,但是這些并不足以去彌補它的缺點帶來的損失。AirBnB 以及 Udacity 可能是因為各種預(yù)期的理由而放棄了 React Native殖告,不過在我看到 Discord 團(tuán)隊發(fā)表的 Why Discord is Sticking with React Native 博文后阿蝶,算是徹底打消了我在生產(chǎn)環(huán)境使用 React Native 的念頭。整篇文章看下來黄绩,讓 Discord 團(tuán)隊仍然繼續(xù)使用 React Native 的最大原因羡洁,似乎就是項目已經(jīng)使用了它,騎虎難下了宝与。
JavaScriptCore 的局限性焚廊,F(xiàn)acebook 在項目管理上的不成熟,以及不斷出現(xiàn)的放棄聲明习劫,最終讓人們發(fā)現(xiàn)咆瘟,React Native 是一個有趣的方案,但并不是一個成熟穩(wěn)定的方案诽里。
Flutter
就在 React Native 的人氣不斷下跌的時候袒餐,Google 在一個恰到好處的時機(jī),推出了一套跨平臺方案:Flutter谤狡,將人們的目光再次聚集到跨平臺開發(fā)上面灸眼。
Flutter 使用 Dart 這門較為冷門的語言來做開發(fā),底基引擎主要由 Skia 和 Dart runtime 構(gòu)成墓懂。Flutter 通過 Skia 和各平臺的底層圖形庫對接焰宣,同時提供豐富的基于 Skia 的控件,來實現(xiàn)跨平臺的開發(fā)捕仔。React Native 采用的方式是封裝各個平臺的應(yīng)用層接口匕积,而 Flutter 則直接打造了一套跨平臺的應(yīng)用層的開發(fā)套件。對這兩種不同的方式榜跌,我們可以有一個直覺上的判斷闪唆,F(xiàn)lutter 在性能上是要優(yōu)于 React Native 的。因為 Flutter 的這種實現(xiàn)方式钓葫,其實早已被大量并廣泛的使用了悄蕾,最明顯的例子就是游戲引擎。
種種對比和跡象表明础浮,似乎 Flutter 是一個比 React Native 更好的跨平臺方案帆调。目前 Flutter 仍舊處于一個上升的勢頭,也有如阿里巴巴這種大廠給 Flutter 背書豆同,頗具野心的底基框架讓開發(fā)者有理由相信贷帮,只要投入足夠的人力,F(xiàn)lutter 可以做到和原生開發(fā)一樣好诱告。
然而撵枢,F(xiàn)lutter 的缺點民晒,也是源于它自行打造了框架,在很多平臺特性上锄禽,諸如密碼管理潜必,選擇光標(biāo)等,F(xiàn)lutter 目前并不能支持沃但,未來能否支持也要打上大大的問號磁滚,平臺的特性可能和原生組件深度綁定,且目前沒有其它接口宵晚,所以 Flutter 在現(xiàn)在這種狀態(tài)下垂攘,只能是放棄這些特性的支持。需要提一點的是淤刃,React Native 在這方面沒有太大的問題晒他。
盡管有一些問題,不過 Flutter 表現(xiàn)出的潛力逸贾,還是讓人們覺得陨仅,這是一個值得一試的方案,只要 Google 給予足夠的支持铝侵。所以 Google 會嗎灼伤?
結(jié)語
那么,我該選擇哪種方案呢咪鲜?答案:It depends on you.
事實上就是狐赡,沒有一個完美的方案,任何方案都有利弊和取舍疟丙。想使用 Javascript 開發(fā)應(yīng)用颖侄,那么就使用 React Native;想構(gòu)建高性能的跨平臺應(yīng)用隆敢,F(xiàn)lutter 是個不錯的選擇发皿;想最大化平臺特性崔慧,那自然是原生的開發(fā)方式拂蝎。
除了跨平臺方案之間的比較之外,跨平臺方案也在和原生開發(fā)方式競爭惶室,而且這種競爭往往是不平等的温自,跨平臺方案在新特性的支持上,始終要慢于原生開發(fā)方式皇钞,所以在市場占有率方面悼泌,原生開發(fā)方式就有天然的先發(fā)優(yōu)勢,這種差距很難被抹平夹界。最終馆里,你可能會發(fā)現(xiàn),也許原生開發(fā)方式才是最合適的,因為除了「重復(fù)」外鸠踪,原生開發(fā)方式相比跨平臺方案丙者,沒有其它缺點了。
附記:之前我在 2019 年 3 月的 RTC Dev Meetup 北京站交流過上面的想法营密,感興趣的讀者可以查看演講視頻和 slide械媒。
題圖:Chris Sabor