這是我技術公眾號的第一篇文章,也是React Native系列文章的第一篇,對我的文章感興趣的可以加我微信16230091進行關注。
本文表面上講React Native(以下簡稱RN),實際上對于學習任何語言和系統都適用。
對于新技術的學習,分為兩種,一種是語言,類似Swift、Objective-C、Java、ES6,另一種是系統,比如Android、iOS、前端。
1. 語言層面,如果你精通某一門語言,那么是可以很快切換到另一門語言的。這就是語言的相通性。翻開市面上那些21天精通某某語言之類的書籍,你會發現,它們具有很多共通的地方:
- 變量
- 類型
- l 運算符
- l 流程控制語句(if、for、while、swicth)
- l 字符串操作
- l 集合(數組、字典等)
- l 函數(參數、返回值等等)
- l 面向對象編程(類、接口、抽象類、屬性、繼承、多態、、重載、重寫等等)
- l 反射
- l 結構體、枚舉
- l 異常捕獲
- l 多線程編程
- l 函數式編程
無論是Java、Objective-C,還是Swift和ES6,基本都被上面這些點覆蓋,所以經常有老司機說說自己是Android領域做了很多年,然后一兩個月就進入到iOS領域,但這僅僅是語言層面的。
對于從一門語言切換到另一門語言,我這些年來的經驗是,把23個設計模式用這門新語言全都實現一遍,基本你就掌握了這門語言的大部分特性了。
我是9年經驗的C#技術出身,我起初對Java的Interface回調方法也很不理解,是通過親手寫了一個策略模式,牢記于心。我對Objective-C中的delegate語法也曾經一度感到很別扭,也是通過編寫適配器模式后,才想明白的。
2. 系統層面。這個部分就沒那么簡單了。你可以花一個月學會一門語言,但是想把Android或iOS搞明白就需要幾年時間的積累了,每個領域都有自己獨特的文化:
l 比如iOS的Runtime技術,iOS所有的技術體系都圍繞著Runtime而展開。
l 比如Android的四大組件,以及背后的AMS、PMS,進而延伸到AIDL和Binder機制。
l 比如前端的幾十種框架,從JS打包、CSS打包,到SPA、Hybrid等若干思想的演進歷史。
所以每個領域都是需要沉淀幾年,沒發過幾次版,或者熬到半夜修改其中的bug,是難以理解這個領域中的酸甜苦辣到。
但是,當你在Android、iOS、前端這幾個領域都做過一遍之后,你會發現,它們也是有相同的東西的,我們一個個分析。
首先是一些基本的點:
l 基本控件、事件綁定
l 列表
l 網絡請求封裝
l 頁面跳轉
l 本地存儲(數據庫、文件)
l 頁面的生命周期
l 自定義組件
其實做App,只要會做兩種頁面就夠了,列表頁和詳情頁,你會發現,任何App,都是這兩種頁面的循環往復,首頁、產品列表頁、產品詳情頁、訂單填寫頁、支付頁、訂單列表頁、訂單詳情頁。這是一條主線。
這其中,在列表頁,需要知道怎么把數據綁定到ListView上,怎么上拉分頁。在詳情頁,需要知道幾個基本的控件,Button、Label、輸入框、單選框,基本就夠了。然后你還要知道怎么點擊控件觸發一個方法,怎么發起一個網絡請求并處理返回的數據。掌握了這些,一個頁面內的事情就都搞定了。
只有一個頁面不夠啊,所以要學會頁面跳轉,從A頁面跳轉到B頁面,至此,App就“活”了。
l 模塊化拆分
功能開發多了,比如網絡請求,你會封裝出幾個類,專門處理網絡請求,與業務邏輯無關,這時候就需要把這幾個類放到一個單獨的項目中,Android稱之為Library,iOS稱之為靜態庫,你的App保持對這個Library的引用。
再接著,業務多了,比如吃喝玩樂四大模塊,為了能讓項目編譯更快,為了團隊之間相互不干擾,就需要把這些模塊都拆分成Library,各自模塊在日常開發過程中,既能作為獨立的App調試,又能在發版本時融合在一起。Android用到了Maven,iOS用到了CocoaPods來解決這類問題,我們稱之為模塊化拆分,也稱為組件化拆分。
以上種種,在前端根本不是什么難事,各個模塊的腳本可以各自打包下載分發。
l 插件化和熱修復
都是為了解決線上bug的修復,或者快速發版而不通過市場的審核。
l MVP和MVVM
起初Android和iOS都是基于MVC的,隨著App越做越復雜,發現MVC不好用了。我是13年的時候在做電影院選座邏輯的時候就發現MVC搞不定這事了,因為我要寫四五十種單元測試case,來保障每次修改繁雜的選座邏輯,不會影響之前運行良好的功能,但是MVC的Controller層把UI邏輯和數據邏輯混在一起,而導致我沒辦法寫單元測試。因為當時我剛從微軟的WPF/Silverlight技術轉到App技術,所以自然就把WPF的MVVM思想引入了App中。時至今日,五年時間,MVP和MVVM思想已經深入人心,無論是Android還是iOS,抑或是前端的Angular、Vue和React,都是如此。
l 推送、埋點、性能監控、崩潰統計
這些技術點,都是企業App開發所不可或缺的技術,顧名思義,這里不多介紹。
看到這里,你也許會問,怎么還沒講React Native啊?如果我說這篇文章已經接近尾聲了。你會不會打我?
關于如何學習React Native,都在上面的內容中。為了不讓廣大的讀者說我故弄玄虛,我還是結合前面列舉的清單,梳理一下React Native的學習方法。
1. 語言層面,需要把ES6看一遍。但也沒必要全看,很多高級語法短期你是用不到的。掌握我上面列舉的語言類清單的內容就夠了。
所以當你為…或bind(this)這樣到語法搞得三尸神暴躁的時候,那是你緣木求魚了。就比如說bind(this)這樣的語法,也許看RN中按鈕的綁定方法,會理解的更透徹一些。
此外,網上講解ES5的文章很多,會和ES6混在一起,對于初學者是個很大的障礙,我就曾經花了很多冤枉時間在上面。
2. 系統層面
這里主要是對React的快速學習,可以參照我上面列舉的那幾個關鍵點,再發一遍:
l 基本控件、事件綁定
這里比較有趣的就是按鈕,它在React中其實并不存在。
l 列表
l 網絡請求封裝
有必要像封裝Android和iOS網絡框架那樣,封裝出一個React的網絡框架來給開發人員使用。
l 頁面跳轉
React提供的頁面跳轉機制太復雜,有必要把它進行封裝。
l 本地存儲(數據庫、文件)
訪問SQLite和Realm
l 頁面的生命周期
Component的生命周期,尤其是props和state這兩個值的讀寫
l 自定義組件
主要是父子組件之間怎么進行通信。
至此,你就可以開發出一個簡單的RN應用了。但是還沒完,想做一個完整的RN應用,還需要下面的技術:
3. 打包
把RN的js腳本打出bundle包,手動放入App中,然后線上實現增量更新。
4. 集成到App
使用RN的很多場景,是在原有的Android或iOS應用中的某個模塊,使用RN來編寫。這時,如何在現有項目中集成RN,是我們所需要解決的。
集成進來后,App和RN中間的相互跳轉頁面、相互調用方法,是我們需要解決的。
5. Redux
對于復雜的React Native應用,需要使用Redux進行解耦。
寫到這里,React Native的全貌就都展現著讀者面前了。有人會覺得React Native太龐大太復雜,但如果按照我的這個學習方法論,把上面這些點都掃一遍,一個月時間左右,基本就能搞定一款App了。
接下來我會有一系列文章和例子來介紹React Native,這是我這一年來做線下培訓的教案。我面對的都是些什么學員呢?有沒接觸過React Native的前端人員,有轉型為React Native的Android和iOS開發人員,所以我比較清楚怎么把我文章中的這些知識點,灌輸給他們。
最后是一波廣告,我現在每天晚上8點在騰訊課堂做Android和iOS技術直播,涉及以下領域:
l Android和iOS組件化拆分
l App性能優化
l App瘦身
l Android插件化
l Android和iOS熱修復
l iOS內存管理
l iOS Runtime
l 設計模式
l RxJava
l 注解編程
l AOP
l ReactNative
l Swift
l App自動化測試
l 面試算法題
對我的文章和培訓課程感興趣的同學,可以加我微信16230091進行關注。
文章列表