一個資深iOS開發者對於React Native的看法
當我第一次嘗試ReactNative的時候,我覺得這只是網頁開發者涉足原生移動應用領域的歪門邪道。
我認為一個js開發者可以使用javascript來構建iPhone應用確實是一件很酷的事情,但是我很快放棄了自己去使用它的念頭。畢竟我因為愛好而從事ios原生開發多年,並且目前為止已經很熟悉這一套開發專業工具。
我已經創造了一些我引以為傲的iOS應用——一些使用Object-C和Xcode構建的應用,通常人們都是這麼做的。這兩樣工具是蘋果公司提供的、用來開發iOS應用的,所以,我和其他的蘋果開發者都在用。並且當兩年前蘋果公司釋出Swift時,我也毫不猶豫地去嘗試它。
Swift依舊被使用在Xcode中,並且依舊是蘋果公司推薦的開發方式,所以我很快地深入,並且毫不費力地學會了這門語言。我滿足於我的蘋果生態系統圈。React Native看上去只是一個小小的樂子,在我的腦海中,一切原生應用必須被 原生 地開發。對正要開始掌握 原生 開發方式的我來說,學習javascript(我並沒有這方面的經驗)和一種幾乎全新的構建app的方式簡直是荒廢時間。
時間快進到幾個月過後,我可以打保票說,我再也不會使用Objective-C或者Swift來開發iOS應用了。
我們接手了一個新的移動應用開發專案,我大概的看了一下設計和需求。正當我要點開Xcode那漂亮的藍色圖示新建一個新的工程時,我們的互動設計師,Adam走過來說,“我們用React Native來做這個東西吧。”
他解釋說,這個專案合同的一部分明確提及了要給這個應用做一個安卓版本。儘管React Native並不支援安卓,我們知道Facebook正積極地在這方面研究。理論上來說,如果我們用RN構建了這個應用的iOS版本,很多部分能夠直接工作在以後的安卓版本上。
好吧,我並不樂意。我覺得我已經站在了iOS開發能力的頂峰,現在卻要我把這一切全部丟棄。在不可避免的學習曲線面前,我懷疑我是不是能夠及時地釋出一個高質量的產品。但除此之外,我更加質疑RN是否有能力成產一個高質量的產品。現在看來,我甚至沒有覺得這樣的質疑是不公平的。當時RN作為一個Beta版本剛被公佈不久,文件欠缺,開源庫和組建的數量稀少,演示程式碼或者Stack Overflow上的參考幾乎沒有。
我連看都不想看它一眼。但是我這種閉塞的態度只會帶來更多的不良後果。我的第一道坎是學習Flexbox,RN製作UI佈局的方式。從最基礎的介面構建器開始,純粹使用程式碼來佈局UI幾乎擊潰了我的自信。我掙扎著去構建最基礎的視覺效果。
但不僅僅是UI——任何事情都變的不一樣。這對於我是最大的挑戰。
”每當我止步不前或者不理解的時候,我就告訴自己“如果用Objective-C我能夠在五秒鐘之內解決它”。每當我發現了RN中的一個BUG(並且bug的數量非常大),我就會想,“oc中根本不會有這種bug,我為啥一定要和RN鬥智鬥勇呢?”
整整兩個星期,我都在工作中痛苦掙扎。我對自己的感覺從一個傑出的iOS開發者變成了一個從未寫過一行程式碼的人。這很受挫折,直到我花費了整整一個禮拜理清了思路。我後退一步,認識到Adam對RN做了許多研究。作為我的互動知道,我不得不信任他,相信他沒有把我領入一條錯誤的道路。我發誓我要在週一投入工作,埋頭苦幹,假裝Objective-C和Swift從來沒有存在過,並解決這個專案。
學會去喜歡React
幾周之前,我們向App Store提供了第一個React Native應用。對於應用的最終表現結果我真的非常自豪,並且我迫不及待的要開始構建下一個專案了。在僅僅一個月多一點的時間裡,我完全踏上了RN的賊船,是什麼改變了我的想法呢?
React 範例
在React中,所有UI的元件都被放置在render()方法中,並且被state狀態控制。你的render()方法定義了UI在各種狀態是如何展現的。當呼叫setState()的時候,React會找到需要改變的部分並替你修改。想象一個簡單的檢視,擁有一個“Hello World”標籤和按鈕。每點選一下按鈕,標籤會在“Hello World”和“Goodbye World”之間切換。在Objective-C中,我在按鈕的控制程式碼中需要一些難堪的if宣告,就像下面一樣。
if ([label.text isEqual:@”Hello World”]) {
label.text = @”Goodbye World”;
} else {
label.text = @”Hello World”;
}
這樣很有用,但是這種UI程式碼和我第一次建立這個標籤的地方(可能在程式碼中,也可能在介面構建器裡)完全脫節。在React中,我們會在state狀態中定義一個buttonClicked的bool變數,在render()函式中,標籤看起來會是這樣的:
<Text>
{this.state.buttonClicked ? ‘Hello World’ : ‘Goodbye World’}</Text>
並且我們的按鈕控制程式碼也會非常簡單
this.setState({buttonClicked: !this.state.buttonClicked});
所有和視覺化相關的程式碼都在同一地方,並且由狀態控制一切。這使得理解和修復這段程式碼變的非常容易。
Flexbox
這就是我一開始非常痛恨的UI佈局工具,現在變成了RN中我最喜歡的事物之一。我承認一開始非常難以掌握,但一旦你開始使用,它把 為多種不同尺寸螢幕構建UI這件事 變的機器快速和簡單。我曾經對Xcode中的視覺化介面編輯器十分熱衷,相比於Flexbox,它的自動佈局還是國語複雜。Flexbox使用的CSS式樣式使得樣式重用變的和複製貼上一樣簡單。其中最棒的事莫過於允許你在一瞬間將樣式值改變到完美。
Live/Hot Reload
沒錯,想看看按鈕右移5畫素的樣子就和command+s一樣簡單。React Native能夠被設定為在iPhone模擬器中自動重繪當前畫面而不重建Xcode工程。這非常厲害因為你不僅可以透過避免重新編譯兒節省時間,你還能夠調整一個深度巢狀在應用中的介面,調整UI而不用回到最初的介面。
Android
現在依舊沒有釋出,但就快了——這一定會非常神奇。在最初我對於ReactNative猶豫不決是因為我已經習慣於做原生的iOS開發。對此我從沒有過任何的抱怨。但是我也做過原生的安卓開發,這並不讓人開心。React Native在安卓上會變的很瘦歡迎,同時我也在期待它的釋出。這會改變移動應用開發的現狀,透過使用相同的程式碼來部署兩個平臺的應用。
回顧
想念 Xcode
我還是會想念Xcode,或者說是一個IDE編輯器。我已經有了一個很好的RN開發設定,但這並不容易,Sublime Text和一大堆的外掛讓我有了語法高亮。sublime能夠完成同一個檔案中基於變數的自動補全,但始終少了一些Xcode自動補全的穩健性。我還是不得不一直查詢開發者文件做參考。
小缺點,比如鍵入React.PropTypes.f IDE並不會告訴我我到底在找func還是function,這很讓人困惑。我也懷念Xcode的版本控制——允許我一一比較我上一次git提交的版本和現在的版本,甚至還允許我基於行撤銷一些特別的改動。我意識到第三方程式能夠幫助我完成這些,但是對IDE來說最棒的事情就是將這些囊括到一個包中。(譯者使用VSCode可以解決這些問題)
為了執行RN專案,我需要終端執行npm,Chrome用來debug,sublime來編輯程式碼,最終還需要Xcode來執行這個專案並開啟模擬器。在大專案中,這些都是細小的抱怨,但是當我面對RN的時候這依舊是缺點。對於Nuclide(Facebook的新IDE)我抱有很高的期望,希望它能結束所有的這些缺點。
橋接
Facebook還沒有也不會去提供所有iOS轉向React Native的API,所以對於那些缺失的片段他們提供了橋接js的方法。當我第一次深入RN的時候,這方面的文件非常的糟糕。每當我意識到我需要連線某些事物的時候,我差點就對RN放棄了,因為這些事情早就能夠在Objective-C中正常運作。但是當她們更加詳細地解釋了橋接過程,提供優秀的例項之後,這就無所懼怕了。它仍然是一個麻煩,但是我能夠預見到開源社群和nom上會有所有的橋接方案。事實上,大多數的iOSAPI已經存在了。
漏洞,文件,開源社群
大概所有我最初關於RN的抱怨現在都已經消失殆盡,如果我從今天開始學習它的話。漏洞每天都在被修復,新版本每一週都在迭代。文件還需要加把勁,但比以前好多了。Facebook和開源社群對於研發這個框架變的十分嚴謹。人們開始聚集在Github和Stack Overflow上探討它。如果你是一個正在考慮嘗試RN的iOS開發者,你要知道你不是一個人在戰鬥。RN非常棒,你應該帶著開放的態度擁抱他。不要像我一樣吧自己侷限在溫室裡。
走出溫室,世界才剛開始。
相關文章
- 一個Python開發者對鴻蒙的看法Python鴻蒙
- 對於iOS效能優化的一點看法iOS優化
- 使用React Native開發第一個iOS應用React NativeiOS
- iOS React Native 混合開發整合React NativeiOSReact Native
- 你對於留存資料的看法可能該變一變了
- [譯] React Native 對 Flutter:哪一個對創業公司更加友好?React NativeFlutter創業
- 我的第一個React Native AppReact NativeAPP
- 對於Lumen和Laravel的看法Laravel
- 從零開始生成一個ios react-native專案iOSReact
- 關於我對c#的一些看法C#
- 關於Ionic、React Native、Native的那些事React Native
- 改變的代價:一個開發者對《最後生還者:第二部》的看法
- iOS原生專案整合 React Native 一 導航iOSReact Native
- 記一次iOS自動化打包走過的坑-關於React Native-iOS專案iOSReact Native
- 一次掌握 React 與 React Native 兩個框架React Native框架
- react-native呼叫ios native方法-回撥ReactiOS
- 一個iOS開發者的修真之路iOS
- React-Native iOS Module開發ReactiOS
- 誰才是真正的資深開發者?
- 對MVP和MVVM的一點看法MVPMVVM
- 給所有開發者的React Native詳細入門指南(第一階段)React Native
- 對 Guice Interceptor 的一點 自己 的看法GUI
- 一個看法 關於java.lang.OutOfMemoryError: PermGen spaceJavaError
- 關於機器學習的一些看法機器學習
- 一個iOS開發者的Flutter“歷險記”iOSFlutter
- react-native-xunfei-speechrecognizer外掛的使用(iOS)ReactiOS
- React Native區分安卓/iOS平臺React Native安卓iOS
- 建立一個react-native專案(2/4)React
- 開源一個天氣APP Build with React NativeAPPUIReact Native
- React Native 專案(One 【一個】客戶端)React Native客戶端
- 【譯】React Native 常用的 15 個庫React Native
- H5、React Native、Native應用對比分析H5React Native
- 對比React Native、dcloud、LuaView三個框架技術(內部)React NativeCloudView框架
- 關於蘋果銷量的一些看法蘋果
- 關於面試的一些個人看法面試
- 探索 react-native run-ios(android)ReactiOSAndroid
- ? React-Native 官方示例演示 ( ios & android)ReactiOSAndroid
- React Native iOS混合開發實戰教程React NativeiOS