從 React Native 到 Flutter碍沐,移動跨平臺方案的真相

作者: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)用相差無幾戴已。

image

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ā)上面灸眼。

image

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市评汰,隨后出現(xiàn)的幾起案子纷捞,更是在濱河造成了極大的恐慌,老刑警劉巖被去,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件主儡,死亡現(xiàn)場離奇詭異,居然都是意外死亡编振,警方通過查閱死者的電腦和手機(jī)缀辩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踪央,“玉大人臀玄,你說我怎么就攤上這事〕澹” “怎么了健无?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長液斜。 經(jīng)常有香客問我累贤,道長,這世上最難降的妖魔是什么少漆? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任臼膏,我火速辦了婚禮俘闯,結(jié)果婚禮上鲜棠,老公的妹妹穿的比我還像新娘迈嘹。我一直安慰自己仔粥,他們只是感情好蹦骑,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布司光。 她就那樣靜靜地躺著千埃,像睡著了一般鸯旁。 火紅的嫁衣襯著肌膚如雪脆贵。 梳的紋絲不亂的頭發(fā)上医清,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音卖氨,去河邊找鬼会烙。 笑死负懦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柏腻。 我是一名探鬼主播密似,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼葫盼!你這毒婦竟也來了残腌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤贫导,失蹤者是張志新(化名)和其女友劉穎抛猫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孩灯,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡闺金,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了峰档。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片败匹。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖讥巡,靈堂內(nèi)的尸體忽然破棺而出掀亩,到底是詐尸還是另有隱情,我是刑警寧澤欢顷,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布槽棍,位于F島的核電站,受9級特大地震影響抬驴,放射性物質(zhì)發(fā)生泄漏炼七。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一布持、第九天 我趴在偏房一處隱蔽的房頂上張望豌拙。 院中可真熱鬧,春花似錦题暖、人聲如沸按傅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逞敷。三九已至狂秦,卻和暖如春灌侣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背裂问。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工侧啼, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留牛柒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓痊乾,卻偏偏與公主長得像皮壁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哪审,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容