React Native - 環(huán)境搭建(踩坑指南)

官方文檔:
https://reactnative.cn/docs/getting-started/


使用環(huán)境:
Windows & Android


縮略詞:
RN(React Native)、AS(Android Studio)

1. 初始化項目

1.1 需要的環(huán)境

  • Node
    Node 是 JS 的運行環(huán)境,這里注意需要下載的 Node 版本需要8.3以上洋措。
  • Python 2
    Python 2的運行環(huán)境舀射,這里注意需要下載的python版本為 python 2.x ,不能是 python 3.x。
  • JDK
    Java的運行環(huán)境,這里注意需要下載的JDK版本為1.8,只能是1.8建椰。

1.2 需要的配置

由于國內把很多東西都墻掉了,國內的良心公司提供了不少代理岛马,為我們的開發(fā)帶來方便棉姐。下面的一些配置信息,由官網提供啦逆。

  • npm 配置

npm 是 Node.js 的包管理工具伞矩,負責下載 js 代碼的依賴包,由于被墻夏志,我們需要配置下面的代理乃坤。

npm config set registry https://registry.npm.taobao.org --global

npm config set disturl https://npm.taobao.org/dist --global
  • yarn 配置(可選)

yarn 是用來替代 npm 功能的工具,可以加速 npm 的下載沟蔑。

npm install -g yarn react-native-cli

安裝完成后湿诊,依然需要未 yarn 設置代理。

yarn config set registry https://registry.npm.taobao.org --global

yarn config set disturl https://npm.taobao.org/dist --global

2. 開始第一個項目

注意:在開始之前溉贿,請確定 1.1 和 1.2 的配置已經完成枫吧。

第一步

找到一個你認為合適的位置浦旱,執(zhí)行如下命令宇色,創(chuàng)建一個名為 Self 的 RN 項目:

react-native init Self

執(zhí)行完成后,打開文件夾颁湖,可以看到如下內容:


正確的目錄樣式

第二步

連接我們的手機宣蠕,打開開發(fā)者模式-允許usb調試,然后在項目文件夾下執(zhí)行下面命令:

react-native run-android

執(zhí)行完成后甥捺,會開始下載一些 Android 項目需要的依賴包抢蚀,然后在手機上運行 App,效果如下:

App正確運行

注意:這里手機和電腦需要處于同一網段下镰禾,如果不在同一網段皿曲,可以左右劇烈搖晃手機唱逢,在彈窗中選擇 Dev Settings - Debug server host & port for device 選項中輸入 IP 和端口。

第三步

修改 App.js 文件屋休,然后重啟 App 坞古,看是否能正常顯示修改后的內容。

3. 集成 RN 項目到Android(Gradle項目)

3.1 準備工作

所謂準備工作劫樟,就是我們的 RN 項目痪枫。在集成進入 Android 中之前,我們需要確保我們的 RN 項目中存在 node_modules 這個文件夾叠艳。這個文件夾中存在 JavaScript 依賴的所有模塊奶陈,一般情況下,從 GitHub 上 clone 的項目不會有這個文件夾的附较。

如果沒有這個文件夾吃粒,我們需要在項目目錄下,執(zhí)行下面的命令:

npm install

如果使用的 yarn ,還可以直接執(zhí)行:

yarn

生成的 node_modules 中有很多的文件夾叶眉,如果只有一個.開頭的文件夾掖看,說明是錯誤的。

然后疏旨,需要將 RN 服務器打開,在項目路徑下執(zhí)行下面命令:

react-native start

成功后會彈出一個新的窗口扎酷,用來打印 RN 服務器日志檐涝。

3.2 添加依賴

** 第一步 **

App項目build.gradle 文件中添加如下代碼:

allprojects {
    repositories {
        maven {
            // All of React Native (JS, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
        ...
    }
    ...
}

url "$rootDir/../node_modules/react-native/android" 這段代碼實際上對應的是 node_modules/react-native/android 這個文件夾的真正地址,而 $rootDir 指的是項目根目錄法挨,如果你的 RN 項目和 App 不在同一目錄下谁榜,那么這里應該是實際地址。Windows 下面的 '\' 符號需要換成 '\\' 符號凡纳。

第二步

App項目build.gradle 文件中添加如下代碼:

dependencies {
    compile 'com.android.support:appcompat-v7:23.0.1'
    ...
    compile "com.facebook.react:react-native:+" // From node_modules
}

要指定特定的 React Native 版本窃植,可以用具體的版本號替換 “+”,當然前提是你從 npm 里下載的是這個版本荐糜。

第三步

在==AndroidManifest.xml==下加上兩個權限:

<uses-permission android:name="android.permission.INTERNET" />

3.3 編碼及測試

由于主要測試集成結果巷怜,所以采用的簡單的Demo,提供免費的下載鏈接:

CSDN(系統(tǒng)強制要的1分):RN項目集成測試

百度云盤(密碼 mh4x):RN項目集成測試

在運行 Demo 前暴氏,請知曉如下幾點:

  1. Demo 項目需要執(zhí)行 npm install
  2. Demo 項目下開啟 RN 服務器(具體方法參考3.1)
  3. 使用 AS 編譯Demo_app
  4. 需要修改 Demo_app 項目下的 build.gradle (具體修改方法參考3.2)
  5. 運行 App 延塑。如果是在真機上測試,手機和電腦需要在同一網段答渔。

運行 App 時关带,分別輸入 DemoDemo2,會分別顯示 App.jsAPP.js 下面的內容沼撕,且修改兩個文件后宋雏,刷新界面芜飘,可以正常顯示。此時驗證集成完畢磨总。

4. 錯誤記錄

4.1 Failed to resolve : com.facebook.react:react-native:xxx

這個問題發(fā)生在為 Android 項目添加了關于 React Native 的依賴時燃箭,出現問題的原因是因為無法下載相應的依賴,需要在 Android 項目的 build.gradle (不是 app 中的 build.gradle)文件中添加如下代碼:

allprojects {
    repositories {
        ...
        maven {
            // All of React Native (JS, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
    }
    ...
}

特別注意:url "$rootDir/../node_modules/react-native/android" 這段代碼實際上對應的是node_modules/react-native/android 這個文件夾的真正地址舍败,而 $rootDir 指的是項目根目錄招狸,如果你的 RN 項目和 App 不在同一目錄下,那么這里應該是實際地址邻薯。比如 Windows 下的路徑:

maven{
            url "F:\\Self\\node_modules\\react-native\\android"
        }

4.2 Received malformed response from registry for undefined. The registry may be down.

這個問題發(fā)生在初始化項目時(react-native init xxx)裙戏,原因是沒有配置代理,依次執(zhí)行下面的代碼可正常初始化

npm config set registry https://registry.npm.taobao.org 

npm config set disturl https://npm.taobao.org/dist

react-native init xxx

4.3 Manifest merger failed : uses-sdk:minSdkVersion 14 cannot be smaller than version 16 declared in library [com.facebook.react:react-native:0.55.4]

這個問題發(fā)生在將 RN 項目集成到其他項目中時(修改完 build.gradle 之后)厕诡,出現這個問題的原因累榜,是因為我們的 RN 要求的最低 SDK 版本是 16 ,而我們項目中實際的最低版本小于16灵嫌。解決辦法壹罚,就是修改 app 的最低 SDK 版本。

4.4 Unexpected end of JSON input while parsing near '..."_hasShrinkwrap":fals'

這個問題發(fā)生在使用 github 上面其它人的項目后寿羞,在生成 node_modules 文件夾時(執(zhí)行 npm install 或者 npm update 命令時報錯)猖凛。百度候找到的解決方案大部分都是下面這個方法:

npm cache clean --force

上面的這個方法清除了 npm 的緩存,但是實際驗證還是會有問題绪穆。后面找到了網上其它的說法辨泳,指出可能是 npm 和 node 的版本不合適導致的,參考:Unexpected end of JSON input while parsing near錯誤解決方式(網上的方法)

后面依次執(zhí)行了下面的命令玖院,最終成功生成了該文件夾:

npm -g i npm@4

npm cache clean --force

npm install

image

重點來了

上面的這個過程很麻煩菠红,并且降低了 npm 的版本后會不會導致其它環(huán)節(jié)出問題,誰也不知道难菌。這屬于不確定因素试溯。所以這里還提供一個簡單的辦法:

安裝 yarn:
npm install -g yarn react-native-cli


配置代理:
npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global

yarn 是 Facebook 提供的用來替換 npm 的工具,執(zhí)行如下命令后就可以替代 npm install :

Yarn 工具安裝

4.5 java.lang.UnsatisfiedLinkError: could find DSO to load:libreactnativejni.so

同類問題包括:

java.lang.UnsatisfiedLinkError: dlopen failed: "xxx/libgnustl_shared.so" is 32-bit instead of 64-bit

產生這個問題的原因郊酒,是因為 RN 中同時存在 arm64-v8aarmeabi-v7a 的 so 文件遇绞,在打包時,只會將 arm64-v8a 的 so 打入 app 猎塞,導致找不到 armeabi-v7a 對應的 so 文件试读。具體的原因和分析可以看:【ReactNative】關于32位和64位SO庫混合引入Crash解決方案

解決方法杠纵,在 app 的 build.gradle 中加入下面配置:

defaultConfig {
        ...
        ndk{
            abiFilters "armeabi-v7a","x86"
        }
        packagingOptions {
            exclude "lib/arm64-v8a/libimagepipeline.so"
        }
    }

4.6 Program type already present: android.support.v4.app.ActionBarDrawerToggle$DelegateProvider

同類問題包括:

Program type already present: xxx

這個問題出現在編譯 App 包時荠耽,是由于RN 中依賴的包和其它依賴包有重復,需要 exclude 其中的一個包:

implementation("com.facebook.react:react-native:0.55.4"){ // From node_modules
    exclude module: 'android.support.v4'
}

4.7 Failed to resolve: com.facebook.react:react-native:0.55.5

同類問題包括:

Failed to resolve: com.facebook.react:react-native:xxx

這個問題出現在 Build 階段比藻,是由于無法下載 RN 的依賴導致铝量,具體的原因是由于手動將 com.facebook.react:react-native:+ 修改成了其它版本倘屹。

我們查看官方文檔可以發(fā)現,添加 RN 的依賴時慢叨,我們可以看到一段注釋: // From node_modules 纽匙。這段注釋告訴我們,我們依賴進入項目的 RN 版本是有 node_modules 決定的拍谐。也就是 RN 項目下的 package.json 內部定義的烛缔。

所以,我們解決這個問題的辦法有三個:

  1. 直接使用 com.facebook.react:react-native:+
  2. 根據 package.json 內部定義轩拨,修改依賴的版本
  3. 修改 package.json 內部定義

上面的三個方案践瓷,有兩點需要注意:

  1. 直接使用 com.facebook.react:react-native:+ 時,依然可能出現導入的 react-native 包的版本與 package.json 中的定義不一樣亡蓉,這時候晕翠,我們先在 App 中去掉這個依賴,然后 clear 工程砍濒,在 RN 目錄下淋肾,刪除 node_modules 文件夾,再通過命令重新生成爸邢,之后再在 App 中加入依賴樊卓。
  2. 修改 package.json 內部定義后,也需要重新生成 node_modules 文件夾

4.8 com.facebook.react.bridge.JSExecutionException: TypeError: undefined is not a function (evaluating '(bridgeConfig.remoteModuleConfig||[]).forEach')

這個問題可能會出現在 App 訪問 RN 的 Activity 時出現杠河,目前具體原因還不清楚简识,只能基本確定和我們的依賴有關。

解決方案(僅供參考):

這個問題會伴隨著一個 url 鏈接感猛,我們首先通過瀏覽器訪問這個 url ,首先確定我們的 RN 服務器是正常的七扰,其正常界面入下圖所示:

正確訪問時的樣子

如果沒出現上圖界面

說明我們的 RN 代碼有問題,先檢查 RN 服務器是否打開陪白,如果不行就刪除 node_models 重建颈走。

如果出現上圖界面

說明 App 的依賴存在問題,參考 4.7 的三個辦法中的第一個辦法以及對應的注意點進行操作咱士。

5. Demo 地址

CSDN(強制要的1分):RN項目集成測試

百度云盤(免費密碼 mh4x):RN項目集成測試

6. 鳴謝

RN 中文社區(qū)

Unexpected end of JSON input while parsing near錯誤解決方式(網上的方法)

【React Native】在原生項目中集成之坑點總結

【ReactNative】關于32位和64位SO庫混合引入Crash解決方案

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末立由,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子序厉,更是在濱河造成了極大的恐慌锐膜,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弛房,死亡現場離奇詭異道盏,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門荷逞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媒咳,“玉大人,你說我怎么就攤上這事种远∩瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵坠敷,是天一觀的道長妙同。 經常有香客問我,道長膝迎,這世上最難降的妖魔是什么渐溶? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮弄抬,結果婚禮上茎辐,老公的妹妹穿的比我還像新娘。我一直安慰自己掂恕,他們只是感情好拖陆,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著懊亡,像睡著了一般依啰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上店枣,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天速警,我揣著相機與錄音,去河邊找鬼鸯两。 笑死闷旧,一個胖子當著我的面吹牛,可吹牛的內容都是我干的钧唐。 我是一名探鬼主播忙灼,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钝侠!你這毒婦竟也來了该园?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤帅韧,失蹤者是張志新(化名)和其女友劉穎里初,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體忽舟,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡双妨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年淮阐,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斥难。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖帘饶,靈堂內的尸體忽然破棺而出哑诊,到底是詐尸還是另有隱情,我是刑警寧澤及刻,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布镀裤,位于F島的核電站,受9級特大地震影響缴饭,放射性物質發(fā)生泄漏暑劝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一颗搂、第九天 我趴在偏房一處隱蔽的房頂上張望担猛。 院中可真熱鬧,春花似錦丢氢、人聲如沸傅联。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒸走。三九已至,卻和暖如春貌嫡,著一層夾襖步出監(jiān)牢的瞬間比驻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工岛抄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留别惦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓夫椭,卻偏偏與公主長得像步咪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子益楼,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355