前言
從2017年初開始到現在,使用React-Native做專案已經一年了。我們做的是一款IM軟體,嵌入在一個手機遊戲平臺的工程內部。之所以要採用react-native(後文簡稱RN)框架重構它,是因為現在遊戲大廳上的所有遊戲都是熱更新的,為了也能讓這個IM軟體實現實時更新,減少IPA升級的次數,RN當然是不錯的選擇。
經過一個同事將近一年的預研以後,2017年我們全面開啟專案重構。奔著熱更新和Write once, run everywhere,從此走上RN填坑之旅。
從ES6,css-layout,redux開始
我一直在從事iOS開發,用OC語言,接觸到ES6還是挺新鮮的。語言風格和C系語言完全不是一個風格。參考阮一峰老師的教程es6.ruanyifeng.com/#docs/intro
RN採用標籤式的介面佈局,叫css-layout,和CSS基本一樣。雖然是第一次使用這種方式佈局介面,用熟之後覺得還是很方便的,程式碼量少,很直接。
聊天部分我們使用了redux架構,是JavaScript的一個狀態機。參考www.redux.org.cn/index.html
RN的優勢
-
除錯方便
ipa安裝好之後,就不需要頻繁編譯了,只需要reload一下,把js程式碼從雲伺服器下載下來就可以呈現改變程式碼後的效果。而且RN支援hotReload,在除錯介面的時候非常方便,修改程式碼之後儲存,介面就自動跟著變化,這一點在除錯的時候實在很爽,不過有時候有點慢,需要reload。chrome線上除錯也挺不錯,可以打斷點,看日誌。雖然沒有xcode或者Android Studio那麼渾然一體,但是作為指令碼語言的除錯工具,也是很厲害了。 -
css-layout佈局
這對於前端程式設計師來說,降低了不少學習成本,也大大減少了程式碼量。但是對於iOS或者安卓開發者來說,剛開始接觸的時候,得接受一些思想上的轉變。 -
跨平臺
大多數程式碼,只需要寫一套,安卓和iOS就都可以執行了,遊戲邏輯和資料。介面上一部分有一些平臺區分,畢竟是從react包裝上來的。剛開始學iOS的時候,就想象著,要是有一種跨平臺的開發形式就很6了,沒想到過了幾年就有了。跨平臺理論上是可以減少開發成本的,減少開發人員數量,但是實際效果並不然,後面說。 -
熱更新
這可能也是大多數公司選擇使用RN的主要原因。頻繁的app升級會讓使用者很煩,而且蘋果的稽核真是很麻煩。現在很多大型app都使用了RN,畢竟繁多的業務迭代,每次都通過APP稽核,也算是噩夢啊。 -
有個好爹
有著Facebook的支撐,相信會發展的很好。
RN的不完善
容我吐槽一下,不完善的地方實在太多了,和原生開發體驗來比,堪稱天壤之別。RN現在的最新版本是0.46,我們工程中用的是0.42,畢竟還沒上1.0呢。
去掉主觀情感,下面列舉一下部分不完善的點:
-
開發體驗一般。
雖然js語法很靈活,但畢竟是指令碼語言,除錯起來還是不方便,不好查錯。我們用的表現較好的vscode編輯器,就這都感覺各種跳轉很不方便,動不動就得全域性搜尋,可能是xcode用習慣了吧。指令碼語言的編寫也會慢慢習慣吧。 -
文件很粗略
官網上的文件,就只是簡單介紹用法和各個控制元件的屬性,對細節的描述很少。當你遇到難解決的問題或者踩到坑了,上面基本找不到答案。 -
兩個平臺還沒有完全統一
很多控制元件都是iOS專屬,或者安卓專屬。還有同一些控制元件,在不同平臺上表現差異很大。 -
控制元件不完善
這個其實挺多的,最基本的ListView,功能缺失,坑很多。Text不支援富文字,動畫,手勢,ScrollView等等等等。不能一一列舉。作為聊天軟體,富文字功能必須實現啊,用於emoji表情和文字的混合顯示。被迫自己搞了一套實現方案,現在還有點小bug。具體實現方案參考blog.csdn.net/gang5440439… -
升級RN版本需要大動干戈
近期我們做了一次RN版本升級,從原來的0.42升到最近的0.50。真的挺麻煩。新版把PropTyps從React中移了出來,那麼之前的引用方式就得變,所有的檔案挨個查。之前使用的第三方庫,有和PropTyps相關的,都得一一更新。之前很多介面佈局的時候,在image上放置了一些其他控制元件,升級後會報錯,然後一一調整。 -
要做出優質app需要花費大量人力和時間去打磨
跨平臺,其實並沒有減少開發成本,原來我們安卓和iOS各三個人,每次迭代都是有序進行。然而換了RN之後,6個人全上,做的累的啊,迭代慢,bug多。
總結
FaceBook也是想為開發者帶去一套跨平臺、動態更新的 Javascript 框架,口號是:Learn once, write anywhere:Build mobile apps with React。我覺得這是一個偉大的夢想。
2015年剛釋出的時候,充滿了期待和爭議。發展到現在,RN也是逐漸在完善。前一段時間蘋果發警告郵件的事情引起了大家的恐慌,不過以我看,RN還是安全的。從蘋果的稽核政策來看,允許執行於JavascriptCore的動態載入程式碼,並且沒有去使用人家的私有方法。而且,現在使用RN的大公司挺多,儘管蘋果高傲,但是要禁止RN的話,還是得掂量一下這些大企業的意見吧。
RN目前確實還不夠成熟穩定,所以,想入坑的開發人員和決策者在入坑前得多權衡。雖然作為技術開發者應該具備對新技術的敏銳嗅覺和快速學習能力,但是對於專案的技術更新,還得要根據實際情況,要慎重。使用者體驗,開發成本,是兩個最重要的權衡指標。
畢竟,不管是react-native,JSPatch,還是其他人更新技術,從戶用體驗和開發體驗來說,都是開倒車的。
RN適合什麼人或公司
- 迫切需要熱更新功能
- 願意投入人力和財力給RN
其他普通的應用,沒那麼迫切需要熱更新的,就好好使用原生開發,畢竟原生的成熟度和穩定性要比RN好很多。
原文地址: https://blog.csdn.net/gang544043963/article/details/77507940 ,轉載請註明原創
歡迎和我一起學習和交流技術開發