- 《架構(gòu)師》2018年7月
- InfoQ中文站
- 1847字
- 2019-01-09 14:05:41
Airbnb棄用之后,我們還應(yīng)該用React Native嗎?

近日,Airbnb發(fā)表了一組由5篇博文組成的系列文章,他們?cè)谖恼轮行纪V故褂肦eact Native,并將其從代碼庫(kù)中移除,轉(zhuǎn)而使用Swift/Objective-C/Java/Kotlin。
在過去的幾年中,在談及“是否應(yīng)該使用React Native”這個(gè)話題時(shí),通常都會(huì)有人指出,Airbnb這家世界級(jí)的公司在產(chǎn)品方面做得非常出色,他們?cè)赗eact Native上投入了大量精力,并且正在使用它。然而,現(xiàn)在出現(xiàn)了大反轉(zhuǎn):一家關(guān)心產(chǎn)品質(zhì)量的頂級(jí)公司對(duì)React Native進(jìn)行了大量投入,在經(jīng)過非常仔細(xì)的研究之后,決定棄它而去。對(duì)于任何想使用React Native的人來說,這都是一件非常可怕的事情。
另一方面,Airbnb是React Native開源社區(qū)的重要貢獻(xiàn)者。react-native-maps和Lottie是兩個(gè)非常重要的庫(kù)(都包含在Expo SDK中),最初由Airbnb開發(fā)。Leland Richardson在進(jìn)入谷歌之前,曾經(jīng)是該社區(qū)最著名的人物之一。人們肯定會(huì)記住他們所做出的貢獻(xiàn)。
不過,如果你仔細(xì)閱讀這一系列文章的內(nèi)容,他們大部分時(shí)間都在說React Native相當(dāng)不錯(cuò),但不適合Airbnb。就個(gè)人而言,這并不會(huì)讓我感到十分驚訝。數(shù)以萬計(jì)的開發(fā)者正在考慮使用React Native,我與他們中的很多人進(jìn)行過交談,我發(fā)現(xiàn)考慮使用React Native的團(tuán)隊(duì)大致可以分為三大類,其中兩類團(tuán)隊(duì)很可能會(huì)取得成功并樂在其中,而對(duì)另外一類團(tuán)隊(duì)來說可能是個(gè)噩夢(mèng)。
我應(yīng)該在項(xiàng)目中使用React Native嗎?
這里有一個(gè)快速指南,可以幫助你和你的團(tuán)隊(duì)決定是否應(yīng)該在項(xiàng)目中使用React Native。
1.你使用React Native從頭開始構(gòu)建一個(gè)新應(yīng)用,并希望使用JavaScript開發(fā)所有的東西
如果是這種情況,人們通常都會(huì)很開心,并可以獲得更好的結(jié)果。這個(gè)時(shí)候Expo非常適合你,你可以使用大量?jī)?nèi)置的原生模塊,在不需要使用Xcode或Android Studio的情況下即可完成所有的事情,升級(jí)到新版本幾乎毫不費(fèi)勁,而且可以隨時(shí)輕松推送代碼更新,無需向應(yīng)用商店提交新版本。如果由于某種原因,你需要使用原生代碼開發(fā)一兩個(gè)頁(yè)面,并且已經(jīng)定義好這些頁(yè)面的邊界,那么這么做通常也沒什么問題。如果是我從頭開始創(chuàng)建一個(gè)新應(yīng)用,我會(huì)選擇使用Expo/React Native。
2.你正在使用React Native開發(fā)少量的二級(jí)頁(yè)面
如果你正在考慮使用React Native開發(fā)一些簡(jiǎn)單的二級(jí)頁(yè)面,如設(shè)置、常見問題解答或“關(guān)于”頁(yè)面(可能只需要把它們嵌入到WebView),那么你就走運(yùn)了。從使用體驗(yàn)方面看,這些東西不需要與應(yīng)用程序的其他部分有密切聯(lián)系,但整體觀感卻更像是“原生”的。
3.你有一個(gè)使用Swift/Java/Objective-C/Kotlin開發(fā)的應(yīng)用程序,現(xiàn)在你想要使用React Native開發(fā)其中的一部分
這種“棕色地帶”(brownfield)的例子——你有一個(gè)使用Swift和Java開發(fā)的應(yīng)用程序,你想要在跨多個(gè)視圖或屏幕的地方引入React Native——更難應(yīng)付。對(duì)于Airbnb在這條道路上遇到了很多挫折,我并不感到驚訝。有經(jīng)驗(yàn)的原生開發(fā)者在學(xué)習(xí)第二種完全不同的技術(shù)棧時(shí)也會(huì)感到沮喪。如果你在同一屏幕上同時(shí)使用原生視圖和React Native視圖,在React Native方面,你會(huì)將數(shù)據(jù)保存在JS對(duì)象中,而在原生方面,你會(huì)將數(shù)據(jù)保存在Swift/Java的數(shù)據(jù)結(jié)構(gòu)中,要跟蹤客戶端狀態(tài)就會(huì)變得很困難。因?yàn)镽eact Native目前只有一個(gè)異步橋接,要在這個(gè)層面進(jìn)行集成,可能會(huì)非常復(fù)雜,而且效率低下。現(xiàn)在想象一下其他10個(gè)類似的問題(導(dǎo)航、布局、委托方法、版本控制等)。如果一種技術(shù)的開發(fā)者總是要去處理另一種技術(shù)的最壞情況,那么最終一定會(huì)走上一條不歸路。
4.你的公司里有一個(gè)iOS團(tuán)隊(duì)和一個(gè)Android團(tuán)隊(duì)
即使你是前面兩種情況中的一種,那些自認(rèn)為擁有最強(qiáng)iOS程序員和Android程序員的公司也很難對(duì)React Native感到滿意。iOS程序員對(duì)此尤為不滿,他們一般會(huì)認(rèn)為JS是對(duì)公司代碼庫(kù)的污染,Android程序員的感受則相對(duì)緩和一些。
即使你將React Native用在它所擅長(zhǎng)的領(lǐng)域,但因?yàn)橐恍┓羌夹g(shù)問題,要讓原生開發(fā)和React Native開發(fā)在企業(yè)中大規(guī)模并存仍然很困難。
至于它的價(jià)值,我?guī)缀踬澩珹irbnb博文中列出的所有對(duì)React Native的指責(zé)。我們可以在Expo中發(fā)現(xiàn)很多相同的東西。而且我自己列出的受挫清單比這個(gè)要長(zhǎng)得多。不過,這項(xiàng)技術(shù)在很多方面都表現(xiàn)得非常好,而且會(huì)越來越好。例如,人們普遍認(rèn)為,想要獲得良好的導(dǎo)航觀感就要使用原生導(dǎo)航,但現(xiàn)在來自Expo團(tuán)隊(duì)的Brent已經(jīng)在react-navigation庫(kù)上進(jìn)行了大量工作,它很好用,觀感也很不錯(cuò)。它已經(jīng)成為大多數(shù)React Native應(yīng)用程序?qū)Ш降淖罴堰x擇。
我對(duì)這個(gè)項(xiàng)目表示樂觀,因?yàn)镕acebook的一些最有熱情的人(特別是Hector、Sophie和Ram)正在重構(gòu)React Native,并制定了很多明智的計(jì)劃,解決了一些最重要的問題。
我認(rèn)為React Native正處在一個(gè)很好的位置,其中的一個(gè)原因是微軟在新版本的Office中使用了React Native。
從宏觀角度來看,使用像JavaScript這樣的腳本語言來開發(fā)移動(dòng)應(yīng)用程序幾乎是不可避免的,因?yàn)槭褂肧wift/Objective-C/Java/Kotlin這些語言來開發(fā)UI效率太差。此外,每個(gè)應(yīng)用程序都要開發(fā)兩次(或者如果算上Web就是三次),這根本就是個(gè)大麻煩。無論是React Native、Flutter還是其他羽翼未滿的新產(chǎn)品,它們也都大致如此。就我個(gè)人而言,我對(duì)獲勝者的機(jī)會(huì)猜測(cè)如下:React Native 55%、Flutter 15%,其他我們還看不到的30%。