React Native實踐一: 如何優(yōu)雅的在已有項目中接入React Native

背景介紹

React Native(后續(xù)簡稱'RN')是最近一段時間非逞⑸ィ火的前端跨移動端技術, 目前在Github上watch 2500+, star36000+. 國外使用這項技術的包括Facebook公司本身的Facebook和Facebook Groups, 國內使用這項技術的APP包括騰訊系的手機QQ, QQ空間, QQ音樂, 還有阿里的天貓. 阿里系在此基礎上開源了自己的weex, star也有5k+.
目前已經在項目中使用了近半年的RN, 表現還算穩(wěn)定. 趟了不少坑, 吃了很多虧. 將自己走過的路記錄下來, 希望對大家有所幫助.

正題

按照RN官網推薦的方式安裝好node, watchman等環(huán)境后, 可以在react-native init AwesomeProject之后跑通RN的demo. 但是這樣得到的工程是純新的, 然而絕大部分情況下, 我們都是在已有的工程里加入RN, 因此, 需要在已有項目中接入RN.
PS:翻不了墻的同學可以查看此網站. 配置環(huán)境等因為墻的存在會帶來一些麻煩, 這方面的文章網上很多, 就不贅述.

官方推薦的接入方式

官方推薦使用CocoaPods. 半年前曾經試過這種方式, 帶來的問題是無法及時更新RN版本. 不過此時官網的RN版本是0.31, 而文檔中pod已經可以安裝0.26.0版本. 或許不失為一種優(yōu)雅方法, 值得一試.

我推薦的接入方式

趟過的坑

剛開始在項目中引入RN的時候, 參考的是vczero的一篇文章. 將node_modules整個拷到項目目錄下. 但是帶來的問題是無法管理node_modules. node_modules文件夾中有數萬個文件, 當時年少不懂事, 一口氣將node_modules文件夾上傳SVN, 卻經歷了無數次失敗. 原因是文件數太多. 當然將這些文件分批上傳是一種方法, 然而感覺十分費體力, 且萬一后面要更新RN版本, 難道又要經歷一次這種痛苦?
于是不打算將node_modules上傳, 而是變成本地管理(即人手拷貝一份). 在經歷了幾天蜜月期后, 我們發(fā)現RN本身的限制(其實就是bug), 要修改RN源碼. 無法使用版本管理的壞處此時體現了, 我們需要在線下維護一份修改的代碼. 中間經歷了兩次升級RN版本, 于是一個一個對照源碼進行修改. 往事不堪回首.

那么到底怎么做?

node_modules中包含兩個部分代碼, JS代碼和原生代碼(OC和Java). 實際上, 只有原生代碼需要加入原生項目中編譯, 而JS代碼只用于打包bundle. 這樣意味著, 我們可以將node_modules分成兩個部分, 原生代碼可以隨原生項目的SVN/Git進行版本控制, 而JS部分可以通過npm的package.json進行版本控制. 這樣, 原生開發(fā)同學不需要下載node_modules, 也可以對RN的源碼進行修改, 而RN開發(fā)同學也可以享受版本控制的好處.
下面介紹Mac-iOS下的具體步驟:

步驟1

獲取你所需要的RN版本(node_modules).
如在命令行輸入react-native init AwesomeProject, 得到最新版的RN. 獲取AwesomeProject中的package.json和node_modules. 將二者置于與原生項目文件夾平級的地方. 即與iOS和Android文件夾平級之處, 方便雙平臺使用.

步驟2

拷貝node_modules/react-native文件夾至原生項目中, iOS項目保留Libraries文件夾和React文件夾(安卓項目保留ReactAndroid文件夾). 其余所有刪除.

步驟3

iOS項目, 創(chuàng)建Group,放置RN工程項目:
/node_modules/react-native/React/React.xcodeproj
/node_modules/react-native/Libraries/Text/RCTText.xcodeproj
.
.
.
/node_modules/react-native/Libraries/WebSocket/RCT WebSocket.xcodeproj
你需要用到哪些就加哪些. 全部加上也無妨.

步驟4

Build Rules中添加靜態(tài)庫文件.
如libRCTText.a等. libRCT開頭的都加上.

步驟5

Build Settings添加循環(huán)依賴
在Targets-Build Settings-Header Search Paths中加入$(PROJECT_DIR)/項目名/ReactNative/react-native/React 這里要加入的是react-native/React文件夾的路徑, 我的react-native文件夾位于項目名/ReactNative下,因此是這樣寫.

步驟6

設置Other Linker Flags
Targets-Build Settings-Other Linker Flags中加入-ObjC

步驟7

刪除原生項目中步驟2拷貝過來的react-native文件夾中所有JS文件. 這步本可以和步驟2合為1步,單獨列出的原因是: 如果沒有刪除其中的JS文件, 其中的JS代碼@providesModuleprovide了很多Module, 會與你在步驟1中的node_modules中的代碼沖突.

步驟8

刪除啟動node服務腳本.
打開步驟3中引入的RN工程項目:React.xcodeproj-Targets-Build Phases-Run Script. 刪除啟動node服務腳本的那個腳本. 即內容是if nc -w 5 -z localhost 8081 ; then if ! curl -s "http://localhost:8081/status" | grep -q "packager-status:running" ; then echo "Port 8081 already in use, packager is either not running or not running correctly" exit 2 fi else open "$SRCROOT/../packager/launchPackager.command" || echo "Can't start packager automatically" fi的腳本

步驟9

隨原生項目上傳react-native文件夾, 此時react-native文件夾中只有原生代碼, 可以進行版本控制;
修改package.json, 修改你需要的內容(如修改dependencies, 將某些組件固定在某個版本), 之后用package.json控制更新node_modules.
package.json也上傳SVN, 大家共用這個管理node_modules.

步驟10

打開命令行, 進入與項目平級的目錄(即node_modules所在目錄), 輸入npm start. 啟動node服務.
打開XCode/Android Studio, 進入RN開發(fā).

小細節(jié)

iOS真機調試, 需要將localHost改為本機的ip, 同時手機要與電腦處于同一wifi下.
如果要真機chrome debug, 要修改RCTWebSocketExecutor.msetup函數的URLString的localHost.
Android真機調試就是adb reverse tcp:8081 tcp:8081.
Android環(huán)境搭建一些坑可以參考我這篇文章.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末逐抑,一起剝皮案震驚了整個濱河市媚创,隨后出現的幾起案子,更是在濱河造成了極大的恐慌苍柏,老刑警劉巖腾啥,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異隆嗅,居然都是意外死亡,警方通過查閱死者的電腦和手機侯繁,發(fā)現死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門胖喳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贮竟,你說我怎么就攤上這事丽焊。” “怎么了咕别?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵技健,是天一觀的道長。 經常有香客問我顷级,道長凫乖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任弓颈,我火速辦了婚禮,結果婚禮上删掀,老公的妹妹穿的比我還像新娘翔冀。我一直安慰自己,他們只是感情好披泪,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布纤子。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪控硼。 梳的紋絲不亂的頭發(fā)上泽论,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音卡乾,去河邊找鬼翼悴。 笑死,一個胖子當著我的面吹牛幔妨,可吹牛的內容都是我干的鹦赎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼误堡,長吁一口氣:“原來是場噩夢啊……” “哼古话!你這毒婦竟也來了?” 一聲冷哼從身側響起锁施,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤陪踩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悉抵,有當地人在樹林里發(fā)現了一具尸體肩狂,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年基跑,在試婚紗的時候發(fā)現自己被綠了婚温。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡媳否,死狀恐怖栅螟,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情篱竭,我是刑警寧澤力图,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站掺逼,受9級特大地震影響吃媒,放射性物質發(fā)生泄漏。R本人自食惡果不足惜吕喘,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一赘那、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氯质,春花似錦募舟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琢锋。三九已至,卻和暖如春呢灶,著一層夾襖步出監(jiān)牢的瞬間吴超,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工鸯乃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鲸阻,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓飒责,卻偏偏與公主長得像赘娄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宏蛉,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容