React-Native 入門(環(huán)境搭建及運(yùn)行)

一金蜀、簡(jiǎn)介

1、React-Native介紹

React Native (簡(jiǎn)稱RN)是Facebook于2015年4月開源的跨平臺(tái)移動(dòng)應(yīng)用開發(fā)框架茶宵,是Facebook早先開源的UI框架 React 在原生移動(dòng)應(yīng)用平臺(tái)的衍生產(chǎn)物页眯,目前支持iOS和安卓?jī)纱笃脚_(tái)。RN使用Javascript語言笛厦,類似于HTML的JSX,以及CSS來開發(fā)移動(dòng)應(yīng)用康栈,因此熟悉Web前端開發(fā)的技術(shù)人員只需很少的學(xué)習(xí)就可以進(jìn)入移動(dòng)應(yīng)用開發(fā)領(lǐng)域递递。

React Native使你能夠在Javascript和React的基礎(chǔ)上獲得完全一致的開發(fā)體驗(yàn)喷橙,構(gòu)建世界一流的原生APP啥么。React Native著力于提高多平臺(tái)開發(fā)的開發(fā)效率 —— 僅需學(xué)習(xí)一次,編寫任何平臺(tái)贰逾。(Learn once, write anywhere)

2悬荣、React Native主要特性

支持原生iOS組件

React Native主張“Learn once, write everywhere”而非其他跨平臺(tái)工具一直宣揚(yáng)的“Write once, run everywhere”。通過React Native疙剑,開發(fā)者可以使用React-Native 提供的組件氯迂,讓應(yīng)用界面在其他平臺(tái)上亦能保持始終如一的外觀、風(fēng)格言缤。

異步執(zhí)行

JavaScript應(yīng)用代碼和原生平臺(tái)之間所有的操作都采用異步執(zhí)行模式嚼蚀,原生模塊使用額外線程,開發(fā)者可以解碼主線程圖像管挟、后臺(tái)保存至磁盤轿曙、無須顧忌UI等諸多因素直接度量文本設(shè)計(jì)布局。

觸摸處理

React Native引入了一個(gè)類似于iOS上Responder Chain響應(yīng)鏈?zhǔn)录幚頇C(jī)制的響應(yīng)體系僻孝,并基于此為開發(fā)者提供了諸如TouchableHighlight等更高級(jí)的組件导帝。

引入 Flexbox 布局模型和樣式

Flexbox布局模型有利于構(gòu)建常見的UI布局,如stacked和nested boxes布局穿铆。React Native還支持常見的Web樣式您单,如fontWeight、font-size等荞雏。樣式表(StyleSheet)抽象提供了一種優(yōu)化機(jī)制來聲明組件所用到的所有樣式和布局虐秦;

具有 Polyfills 功能

Polyfills功能是的開發(fā)者編寫單獨(dú)應(yīng)用的代碼而不用擔(dān)心其他瀏覽器原生是不是支持。React Native專注于改變?cè)噲D(Views)代碼編寫的方式凤优,開發(fā)者能夠使用npm安裝JavaScript Library悦陋,并將這些Library融入React Native,如 XMLHttpRequest别洪、window.requestAnimationFrame等

具有較強(qiáng)的可擴(kuò)展性

設(shè)計(jì)React Native主要是為了使得開發(fā)者使用常規(guī)的原生視圖組件擴(kuò)展和模塊就可以開發(fā)出一個(gè)完整的應(yīng)用叨恨,開發(fā)者能夠復(fù)用已經(jīng)構(gòu)建的任何應(yīng)用或者組件,并且還能夠引入自己喜愛的原生Library挖垛。

3痒钝、為什么要用 React-Native

目前主流的應(yīng)用大體分成如下幾類:Native App, Web App 秉颗、 Hybrid App 與 React-Native App

App.png

Native App

即原生開發(fā)模式,開發(fā)出來的是原生程序,不同平臺(tái)上,Android和iOS的開發(fā)方法不同,開發(fā)出來的是一個(gè)獨(dú)立的APP,能發(fā)布應(yīng)用商店,有如下優(yōu)點(diǎn)和缺點(diǎn)。

優(yōu)點(diǎn):

直接依托于操作系統(tǒng),交互性最強(qiáng),性能最好

功能最為強(qiáng)大,特別是在與系統(tǒng)交互中,幾乎所有功能都能實(shí)現(xiàn)

缺點(diǎn):

開發(fā)成本高送矩,無法跨平臺(tái)

升級(jí)困難

維護(hù)成本高

Web App

即移動(dòng)端的網(wǎng)站,將頁面部署在服務(wù)器上,然后用戶使用各大瀏覽器訪問,不是獨(dú)立APP,無法安裝和發(fā)布Web網(wǎng)站一般分兩種,MPA(Multi-page Application)和SPA(Single-page Application)蚕甥。而Web App一般泛指后面的SPA形式開發(fā)出的網(wǎng)站(因?yàn)榭梢阅7乱恍〢PP的特性),有如下優(yōu)點(diǎn)和缺點(diǎn)。

優(yōu)點(diǎn):

開發(fā)成本低,可以跨平臺(tái),調(diào)試方便

版本升級(jí)容易

維護(hù)成本低

無需安裝 App栋荸,不占用手機(jī)內(nèi)存(通過瀏覽器即可訪問)

缺點(diǎn):

性能低,用戶體驗(yàn)差

依賴于網(wǎng)絡(luò),頁面訪問速度慢,耗費(fèi)流量

功能受限,大量功能無法實(shí)現(xiàn)(無法調(diào)用原生 API)

臨時(shí)性入口,用戶留存率低

Hybrid App

即混合開發(fā),也就是半原生半Web的開發(fā)模式,有跨平臺(tái)效果,實(shí)質(zhì)最終發(fā)布的仍然是獨(dú)立的原生APP(各種的平臺(tái)有各種的SDK)菇怀,這是一種 Native App 和 Web App 折中的方案,保留了 Native App 和 Web App 的優(yōu)點(diǎn)晌块。

優(yōu)點(diǎn):

開發(fā)成本較低,可以跨平臺(tái),調(diào)試方便

維護(hù)成本低,功能可復(fù)用

更新較為自由(只下載資源不更新 apk )

學(xué)習(xí)成本較低(前端開發(fā)人員不用學(xué)習(xí)底層 api)

功能更加完善,性能和體驗(yàn)要比起web app 好

缺點(diǎn):

相比原生,性能仍然有較大損耗

不適用于交互性較強(qiáng)的app(主要適用于新聞閱讀類與信息展示類的 APP)

React Native APP

Facebook發(fā)起的開源的一套新的APP開發(fā)方案,Facebook在當(dāng)初深入研究Hybrid開發(fā)后,覺得這種模式有先天的缺陷,所以果斷放棄,轉(zhuǎn)而自行研究,后來推出了自己的“React Native”方案,不同于H5,也不同于原生,更像是用JS寫出原生應(yīng)用,有如下優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn):

開發(fā)成本在 Hybrid 和 Native 開發(fā)之間 爱沟,大部分代碼還是可復(fù)用的,

性能體驗(yàn)高于Hybrid匆背,性能相比原生差別不大

技術(shù)日益成熟呼伸,發(fā)展迅猛

缺點(diǎn):

門檻相對(duì) Web App 與 Hybrid App 來說相對(duì)高一點(diǎn)(也需要了解 Native 層)

不同開發(fā)模式的對(duì)比:

開發(fā)模式對(duì)比

4、React-Native 框架簡(jiǎn)單描述

rn框架.png

說明:

React:也就是在不同平臺(tái)上編寫基于React的代碼钝尸,“Learn once, write anywhere”括享。

Virtual DOM:相對(duì)Browser環(huán)境下的DOM(文檔對(duì)象模型)而言,Virtual DOM是DOM在內(nèi)存中的一種輕量級(jí)表達(dá)方式珍促,可以通過不同的渲染引擎生成不同平臺(tái)下的UI铃辖,JS和Native之間通過Bridge通信。

Web/iOs/Android: 不同的平臺(tái)

二猪叙、環(huán)境搭建

因?yàn)?React-Native 的開發(fā)也需要 Android 開發(fā)環(huán)境娇斩,這里不在介紹,只介紹 React-Native 部分沐悦。Android 開發(fā)環(huán)境搭建可以參考其他資料成洗。

1、Android 開發(fā)環(huán)境搭建

Android 開發(fā)環(huán)境搭建

2藏否、Node.js 安裝

官網(wǎng)地址:https://nodejs.org/zh-cn/download/

nodejs.png

開始安裝:

install.png

安裝完成:

image.png

Windows 下通過 cmd 或者 PowerShell 查看 Node.js 版本:

image.png

出現(xiàn)版本號(hào)瓶殃,則說明安裝成功。

當(dāng)安裝完 Node.js 后副签,NPM 也會(huì)一同被安裝遥椿,NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題淆储,常見的使用場(chǎng)景有以下幾種:

允許用戶從NPM服務(wù)器下載別人編寫的第三方包到本地使用冠场。

允許用戶從NPM服務(wù)器下載并安裝別人編寫的命令行程序到本地使用。

允許用戶將自己編寫的包或命令行程序上傳到NPM服務(wù)器供別人使用本砰。

npm.png

3碴裙、安裝 react-native-cli

命令行輸入如下命令安裝 react-native-cli

npm install -g react-native-cli

安裝完成后,通過 react-native-cli -v 查看版本,確定是否安裝成功

rn.png

三舔株、初始化項(xiàng)目

1莺琳、初始化項(xiàng)目

到指定目錄下,通過命令行初始化一個(gè)項(xiàng)目:

react-nativeinit NewProject

隨后開始初始化項(xiàng)目载慈,下載資源:

image.png

當(dāng)項(xiàng)目初始化完成后惭等,將在我們指定的文件夾下生成一個(gè)新的 React-Native 項(xiàng)目,項(xiàng)目名稱為: NewProject办铡,進(jìn)入項(xiàng)目辞做,項(xiàng)目的目錄結(jié)構(gòu)如下:

image.png

說明:

android: Android 工程源代碼,可以通過 Android Studio 打開寡具。

ios: ios 項(xiàng)目工程源代碼秤茅,可以通過 xcode 打開。

node_modules: react-native 工程用到的模塊晒杈。

App.js 是 react-native 工程的主源碼文件嫂伞,入口文件孔厉,相當(dāng)于 html 中的 index.html拯钻。

package.json: 主工程描述文件。

這些是我們接觸最多比較重要的一些文件或文件夾撰豺。

2粪般、運(yùn)行項(xiàng)目

初始化項(xiàng)目之后,就可以運(yùn)行項(xiàng)目了污桦。在項(xiàng)目運(yùn)行之前亩歹,確保配置了 Android 開發(fā)環(huán)境,并且命令行可以運(yùn)行 adb 命令凡橱,adb 在 Android SDK 的 platform-tools 文件夾下小作,需要手動(dòng)添加至環(huán)境變量。

image.png

USB 連接手機(jī)(手機(jī)需要開啟開發(fā)者選項(xiàng)和 USB 調(diào)試 )稼钩,命令行輸入顾稀,adb devices:

image.png

當(dāng)看到有 device 時(shí),說明手機(jī)連接成功坝撑,adb 可用静秆。

接下來到項(xiàng)目根目錄下,通過輸入如下命令來運(yùn)行項(xiàng)目:

react-nativerun-android

image.png

輸入命令后巡李,項(xiàng)目開始初始化運(yùn)行抚笔,運(yùn)行過程中會(huì)打開一個(gè) node 服務(wù)窗口,如下所示:

image.png

有這個(gè) node 窗口可以看到侨拦,電腦是通過 8081 這個(gè)端口來調(diào)試 react-native 應(yīng)用的殊橙。

這個(gè)過程可能會(huì)很慢,因?yàn)?react-native 需要 gradle 這個(gè)文件,下載會(huì)很慢膨蛮,我們可以手動(dòng)下載這個(gè)文件螃概,版本需要和命令行中出現(xiàn)的那個(gè)版本一致,然后把這個(gè) gradle 的 壓縮文件放到 c:\user\user.gradle\wrapper\dists\gradle-3.5.1-all\42vjebfdws9pjts3l4bouoq0p 下鸽疾,名稱可能不一致吊洼,和自己的對(duì)應(yīng)上就可以。

這里?可以下載到所有版本的 gradle制肮,如果不能下載冒窍,可以到網(wǎng)上找其他的資源。

下載完成后豺鼻,放到指定目錄下:

image.png

然后重新輸入命令 react-native run-android 來初始化運(yùn)行項(xiàng)目综液,程序首先會(huì)解壓 gradle 壓縮文件,第一次初始化可能需要一點(diǎn)時(shí)間:

image.png

初始化完成后儒飒,項(xiàng)目運(yùn)行成功谬莹,可以在手機(jī)上看到如下界面:

rn.png

至此,react-native 環(huán)境搭建完成桩了,初始化項(xiàng)目成功附帽。

四、常見錯(cuò)誤

1井誉、沒有配置 Android 開發(fā)環(huán)境

當(dāng)?shù)谝淮屋斎?react-native run-android 運(yùn)行是蕉扮,出現(xiàn)如下錯(cuò)誤:

image.png

表明程序沒有找到 sdk 路徑,首先確定是否配置了 Andorid 開發(fā)環(huán)境颗圣,然后檢查 項(xiàng)目中 Android 文件夾下是否有 local.properties 這個(gè)文件喳钟,如果有,確定 sdk 路徑正確在岂,如果沒有新建這個(gè)文件奔则,里面定義 sdk 的路徑為如下形式(改成自己的):

dk.dir =/Users/USERNAME/Library/Android/sdk

2、第一次運(yùn)行出行紅屏蔽午,error code:500

error.png

可能是版本的原因易茬,可以通過如下命令安裝指定版本并更新:

npminstall–savereact-native@0.44.0react-native upgrade

然后修改 項(xiàng)目根目錄下的 package.json 為如下:

{"name":"NewProjet","version":"0.0.1","private":true,"scripts": {"start":"node node_modules/react-native/local-cli/cli.js start","test":"jest"},"dependencies": {"babel-preset-react-native":"^4.0.0","react":"16.4.1","react-native":"^0.55.4"},"devDependencies": {"babel-jest":"23.4.2","jest":"23.4.2","react-test-renderer":"16.4.1"},"jest": {"preset":"react-native"}}

接著刪除項(xiàng)目根目錄下的 node_modules 文件夾,刪除之后祠丝,通過 npm install 重新下載一下依賴包:

npm install

image.png

3疾呻、沒有啟動(dòng)服務(wù)

當(dāng)出現(xiàn)如下界面是,表明沒有啟動(dòng) react-native 服務(wù)

image.png

首先確定自己的手機(jī)通過 usb 連接上電腦写半,并且 8081 端口可用岸蜗,adb 可用,可以通過如下命令手動(dòng)啟動(dòng)服務(wù)叠蝇,運(yùn)行項(xiàng)目:

react-nativestartadb? reverse tcp:8081tcp:8081react-nativerun-android:

4璃岳、React Native unable to load script from assets index.android.bundle on windows

當(dāng)運(yùn)行項(xiàng)目,手機(jī)紅屏報(bào)錯(cuò),錯(cuò)誤信息如下:

Unable to load script from assets index.android.bundle on windows

出現(xiàn)這個(gè)錯(cuò)誤铃慷,首先還是確定自己的手機(jī)連接上了電腦单芜,如果是無線調(diào)試的話,需要設(shè)置 ip 和 端口犁柜,步驟如下:

搖晃手機(jī)洲鸠,顯示菜單 =》 點(diǎn)擊Dev Settings =》 點(diǎn)擊Debug server host & port for device =》 設(shè)置IP和端口(ex:192.168.0.20:8081)

如果是通過 USB 調(diào)試的話,可能是因?yàn)闆]有找到assets下文件馋缅,需要手動(dòng)創(chuàng)建并設(shè)置:

1扒腕、首先手動(dòng)在\android\app\src\main下建立一個(gè)assets文件夾

2、然后cmd 進(jìn)入項(xiàng)目的根目錄下執(zhí)行:

react-nativebundle --platform Android --devfalse--entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

或者

react-nativebundle --platform android --devfalse--entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

這里到底是 index.android.js 還是 index.js 需要看自己項(xiàng)目根目錄下的那個(gè)文件是什么萤悴,對(duì)應(yīng)上就行了瘾腰。

如果遇到其他問題,就需要自己查閱資料解決了覆履。

參考:

https://reactnative.cn/

https://my.oschina.net/fileoptions/blog/897969

https://stackoverflow.com/questions/44446523/unable-to-load-script-from-assets-index-android-bundle-on-windows

http://www.reibang.com/writer#/notebooks/28242347/notes/31851576/preview

https://blog.csdn.net/wingichoy/article/details/51791076

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹋盆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子硝全,更是在濱河造成了極大的恐慌栖雾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柳沙,死亡現(xiàn)場(chǎng)離奇詭異岩灭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赂鲤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柱恤,“玉大人数初,你說我怎么就攤上這事」K常” “怎么了泡孩?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寺谤。 經(jīng)常有香客問我仑鸥,道長,這世上最難降的妖魔是什么变屁? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任眼俊,我火速辦了婚禮,結(jié)果婚禮上粟关,老公的妹妹穿的比我還像新娘疮胖。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布澎灸。 她就那樣靜靜地躺著院塞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪性昭。 梳的紋絲不亂的頭發(fā)上拦止,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音糜颠,去河邊找鬼创泄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛括蝠,可吹牛的內(nèi)容都是我干的鞠抑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忌警,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼搁拙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起法绵,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤箕速,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后朋譬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盐茎,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年徙赢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了字柠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狡赐,死狀恐怖窑业,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枕屉,我是刑警寧澤常柄,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站搀擂,受9級(jí)特大地震影響西潘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哨颂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一喷市、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咆蒿,春花似錦东抹、人聲如沸蚂子。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽食茎。三九已至,卻和暖如春馏谨,著一層夾襖步出監(jiān)牢的瞬間别渔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工惧互, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哎媚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓喊儡,卻偏偏與公主長得像拨与,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子艾猜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容