1、
react-native run-android出現(xiàn)
FAILURE: Build failed with an exception.
細(xì)看是這樣
- What went wrong:
Execution failed for task ':app:installDebug'.
com.android.builder.testing.api.DeviceException: No connected devices!
重點(diǎn)是這句話:No connected devices!
這種問(wèn)題是因?yàn)闆](méi)有設(shè)備運(yùn)行或者模擬器沒(méi)開(kāi),導(dǎo)致沒(méi)有鏈接上網(wǎng)絡(luò),真機(jī)也要記得開(kāi)啟調(diào)試模式。
/***************************以下新手建議讀*********************************/
Q:RN和React.js是一個(gè)東西嗎?
A:RN和React.js共用一些抽象層,但具體有很多差異,且目標(biāo)平臺(tái)不同:RN目前只能開(kāi)發(fā)iOS/Android App,而React.js用于開(kāi)發(fā)web頁(yè)面。
Q:RN有哪些已經(jīng)上架的案例?
A:官方有一個(gè)showcase頁(yè)面。我們也收集了一些國(guó)內(nèi)的案例。如果你有作品想要推廣,歡迎給我私信。
Q:RN可以在windows下開(kāi)發(fā)嗎?
A:對(duì)于iOS開(kāi)發(fā),可以通過(guò)虛擬機(jī)或黑蘋(píng)果等方式,但很麻煩也不推薦。做iOS開(kāi)發(fā),遲早你都需要一臺(tái)Mac電腦。
對(duì)于Android開(kāi)發(fā),理論上沒(méi)問(wèn)題。但由于FB的員工基本都用mac,沒(méi)有怎么管過(guò)windows兼容性,所以目前的版本可能在windows上會(huì)遇到一些問(wèn)題。
具體搭建方法請(qǐng)參考官方文檔以及@天地之靈 總結(jié)的完整的windows環(huán)境搭建指南
Q:RN所支持的最低iOS和Android版本?
A:Android >= 4.1 (API 16)
iOS >= 7.0
Q:RN和cordova/phonegap是一個(gè)東西嗎?
A:不一樣。RN不是一個(gè)webview(但包含了webview組件),不能直接復(fù)用web頁(yè)面代碼。RN的性能接近原生,超過(guò)cordova/phonegap。
Q:可以使用現(xiàn)有的js庫(kù)嗎?
A:由于RN理論上更接近nodejs的運(yùn)行環(huán)境,所以對(duì)nodejs的庫(kù)兼容更好一些。瀏覽器端的js庫(kù),涉及到DOM、BOM、CSS等功能的模塊無(wú)法使用,因?yàn)镽N的環(huán)境中沒(méi)有這些東西。
Q:可以使用現(xiàn)有的objc/swift/java庫(kù)嗎?
A:可以,但需要參照這篇文檔和這篇文檔進(jìn)行修改。
Q:可以熱更新嗎?蘋(píng)果允許嗎?
A:官方?jīng)]有提供熱更新方案,但本站推出了完整的熱更新方案,差異更新只需極小流量。蘋(píng)果目前的政策明確允許基于javascriptCore的熱更新。
環(huán)境搭建與編譯問(wèn)題
Q:創(chuàng)建新項(xiàng)目,react-native init AwesomeProject命令長(zhǎng)時(shí)間無(wú)響應(yīng),或報(bào)錯(cuò)shasum check failed
A:由于眾所周知的網(wǎng)絡(luò)原因,react-native命令行從npm官方源拖代碼時(shí)會(huì)遇上麻煩。請(qǐng)將npm倉(cāng)庫(kù)源替換為國(guó)內(nèi)鏡像:
npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global
另,執(zhí)行init時(shí)切記不要在前面加上sudo(否則新項(xiàng)目的目錄所有者會(huì)變?yōu)閞oot而不是當(dāng)前用戶(hù),導(dǎo)致一系列權(quán)限問(wèn)題,請(qǐng)使用chown修復(fù))。
Q:運(yùn)行react-native run-android時(shí)報(bào)錯(cuò),報(bào)錯(cuò)信息中含有Could not find tools.jar等字樣
A:請(qǐng)?jiān)谙到y(tǒng)變量中添加classpath,指向jdk中的tools.jar。
Q:運(yùn)行react-native run-android時(shí)報(bào)錯(cuò),報(bào)錯(cuò)信息中含有SDK location...ANDROID_HOME等字樣
A:請(qǐng)對(duì)照官方文檔,配置ANDROID_HOME環(huán)境變量。
Q:運(yùn)行react-native run-android時(shí)報(bào)錯(cuò),報(bào)錯(cuò)信息中含有bintray.com、gradle.org等網(wǎng)址
A:請(qǐng)(強(qiáng)力)科學(xué)上網(wǎng),反復(fù)再反復(fù)地重試。
Q:運(yùn)行react-native run-android時(shí)報(bào)錯(cuò),報(bào)錯(cuò)信息中含有not found:git、android-23、Build Tools revision x.x.x、appcompat-v7等字樣
A:請(qǐng)對(duì)照官方文檔以及@天地之靈 總結(jié)的完整的windows環(huán)境搭建指南仔細(xì)檢查漏裝的依賴(lài)項(xiàng)!(沒(méi)錯(cuò),再說(shuō)一遍,要裝全文檔里提到的東西,,以及選擇對(duì)應(yīng)的版本號(hào)!)。
Q:運(yùn)行react-native run-android時(shí)報(bào)錯(cuò),報(bào)錯(cuò)信息中含有No connected devices!字樣
A:既然是沒(méi)有connected devices,那你就connect一個(gè)device咯!(usb連上真機(jī),或啟動(dòng)一個(gè)模擬器)。
Q:運(yùn)行react-native run-android時(shí)報(bào)錯(cuò),報(bào)錯(cuò)信息中含有Unable to upload some APKs!字樣
A:參照下圖降級(jí)gradle版本
0_1459218230837_QQ圖片20160329102338.png
Q:真機(jī)上運(yùn)行時(shí)白屏!
A:請(qǐng)找到并打開(kāi)懸浮窗權(quán)限。比如miui系統(tǒng)在這里打開(kāi)懸浮窗權(quán)限。
Q:如何升級(jí)RN版本?
A:請(qǐng)用編輯器打開(kāi)項(xiàng)目目錄中的package.json,找到類(lèi)似下面的一行配置
"react-native": "0.13.0",
將其改為要升級(jí)的版本號(hào),如“0.15.0-rc”(當(dāng)然要先確定這個(gè)版本已經(jīng)發(fā)布到npm上了,如果配置中有^或~之類(lèi)的符號(hào),可以參考這篇文章來(lái)了解其含義。)。
然后在當(dāng)前目錄的命令行中執(zhí)行npm i
如果提示權(quán)限錯(cuò)誤則在前面加上sudo(windows下不需要).
npm i執(zhí)行完畢且成功不報(bào)錯(cuò)之后,在項(xiàng)目目錄中運(yùn)行(注意這一步會(huì)覆蓋原生代碼,請(qǐng)事先備份原生代碼,事后做比對(duì))
react-native upgrade
對(duì)于0.14以下版本升級(jí)0.14的情況,還需要額外手動(dòng)處理一下。
Q:報(bào)錯(cuò):SyntaxError: Use of const in strict mode
A:請(qǐng)檢查node版本(4.0以上)。
Q:Windows下報(bào)錯(cuò):ERROR Watcher took too long to load
Try running watchman version from your terminal
A:請(qǐng)參照此文底部的說(shuō)法修改。
Q:報(bào)錯(cuò):Invariant Violation:Application XXXX has not been registered.
A:請(qǐng)確保index.*.js中的
AppRegistry.registerComponent('項(xiàng)目名',() => ...);
與appDelegate.m中的
RCTRootView*rootView = [[RCTRootViewalloc]initWithBundleURL:jsCodeLocation
moduleName:@"項(xiàng)目名" launchOptions:launchOptions];
或是MainActivity.java中的
@Override
protected String getMainComponentName() {
return "項(xiàng)目名";
}
都保持一致。
Q:應(yīng)該使用什么IDE開(kāi)發(fā)?
A:@tdzl2003: 有幾個(gè)選擇:
WebStorm,需要付費(fèi)購(gòu)買(mǎi)(學(xué)生黨可憑edu郵箱在此申請(qǐng)免費(fèi)授權(quán)),最新版對(duì)JSX、flowtype等語(yǔ)法支持均非常優(yōu)秀。
Sublime,雖然會(huì)不斷提示你是否要購(gòu)買(mǎi),然而根據(jù)用戶(hù)協(xié)議可以無(wú)限期試用。插件系統(tǒng)非常強(qiáng)大,因此如果愿意折騰的話,是個(gè)非常不錯(cuò)的選擇。
VS Code,微軟出的開(kāi)源跨平臺(tái)編輯器,適用于編寫(xiě)web代碼,也可以用于編寫(xiě)ReactNative項(xiàng)目。據(jù)說(shuō)最近剛剛加入了對(duì)JSX的支持(也可能是插件?),整體上相當(dāng)不錯(cuò)。
nuclide(網(wǎng)頁(yè)國(guó)內(nèi)無(wú)法打開(kāi)),facebook發(fā)布的基于atom的IDE,據(jù)說(shuō)非常不流暢。
另外雖然主要的業(yè)務(wù)邏輯是使用js開(kāi)發(fā),但仍然要依賴(lài)于原生的編譯/調(diào)試環(huán)境,所以你還需要同時(shí)運(yùn)行Xcode(iOS)或Android Studio(android)等。
開(kāi)發(fā)與調(diào)試問(wèn)題
Q:如何開(kāi)啟調(diào)試功能?
A:點(diǎn)擊iOS模擬器頂部的Hardware菜單,選擇Shake Gesture(對(duì)應(yīng)真機(jī)搖一搖),會(huì)自動(dòng)彈出如下圖的菜單。
0_1450967966242_826615-967fd84e771b47f2.png
安卓模擬器則是點(diǎn)擊菜單鍵(對(duì)于不同的模擬器,其對(duì)應(yīng)鍵位不同,實(shí)在不知道的,可以在命令行中運(yùn)行adb shell input keyevent 82來(lái)觸發(fā)),真機(jī)上沒(méi)有菜單鍵的,搖一搖即可。
選擇Debug in Chrome即會(huì)啟動(dòng)Chrome作為運(yùn)行和調(diào)試環(huán)境(注意此時(shí)JS引擎為Chrome的V8,與iOS真機(jī)的javascriptCore引擎存在一些差異)。選擇Inspect Element即可以像調(diào)試網(wǎng)頁(yè)元素一樣查看布局元素的樣式,但比較簡(jiǎn)陋。React Devtools插件可裝可不裝,它只用來(lái)查看布局,不影響調(diào)試,且在目前的版本(>0.13)中還無(wú)法正常加載。
調(diào)試的相關(guān)文檔點(diǎn)此。
Q:調(diào)試模式下報(bào)錯(cuò):Runtime is not ready. Make sure...或是socket closed.
A:有時(shí)Chrome進(jìn)程會(huì)失去響應(yīng),可以嘗試手動(dòng)將Chrome的React Native Debugger標(biāo)簽切換到前臺(tái)再Reload模擬器頁(yè)面。
Q:iOS模擬器突然變成了慢動(dòng)作?
A:iOS模擬器有個(gè)slow animation的選項(xiàng),其快捷鍵是commant + T,調(diào)試過(guò)程中容易誤碰到。再按一次關(guān)閉這個(gè)選項(xiàng)即可。
Q:使用ListView時(shí)報(bào)錯(cuò):Sticky header index 0 was outside the range {...}
A:看起來(lái)是個(gè)數(shù)組越界錯(cuò)誤,但多數(shù)情況下是由于ListView的子組件渲染錯(cuò)誤(如套數(shù)據(jù)時(shí)沒(méi)有檢查undefined等)引起,而非ListView本身的問(wèn)題。
Q:ListView的數(shù)據(jù)到底應(yīng)該怎么配?
A:參考下圖
0_1450968223329_826615-0b079d98f74d7d07.png
Q:使用Image時(shí)報(bào)錯(cuò):You are trying to render the global Image variable as a React element. You probably forgot to require Image.
A:由于React的Image組件和全局的Image對(duì)象重名,所以使用Image組件時(shí)一定要記得在文件開(kāi)頭正確引入React的Image組件。
Q:在使用Navigator的同時(shí)使用ListView或ScrollView,后兩者的頭部會(huì)多出一些空間。
A:將automaticallyAdjustContentInsets屬性設(shè)為{false}.
Q:有一些示例代碼中有奇怪的問(wèn)號(hào),比如function foo(x:?string),代表什么意思?
A:這是通過(guò)一個(gè)名為flow的外部工具為javascript加上強(qiáng)類(lèi)型檢查的功能,不影響編譯和運(yùn)行。直接無(wú)視就好。
Q:報(bào)錯(cuò):Adjacent JSX elements must be wrapped in an enclosing tag.
A:render方法中必須只能包含一個(gè)根元素。
Q:報(bào)錯(cuò):Invariant Violation: onlyChild must be passed a children with exactly one child
A:一般是Touchable開(kāi)頭的幾個(gè)組件,如果沒(méi)有子元素或者指定多個(gè)并列子元素都會(huì)報(bào)錯(cuò)。
Q:報(bào)錯(cuò):Invariant Violation: Element type is invalid
A:如果是引入新組件時(shí)報(bào)的錯(cuò),據(jù)@tdzl2003 解釋:
從ReactNative 0.16起,babel升級(jí)到了6.x版本。
在babel6中,require和export default不能直接配對(duì)使用。
所以,你要么把
var Hello = require('./components/Hello');
改為
import Hello from './components'
要么把
export default React.createClass({
改為
module.exports = React.createClass({
二者選其一,配對(duì)使用。
Q:如何獲取服務(wù)器端數(shù)據(jù)/可以使用Ajax嗎?
A:可以用ajax,以及大部分現(xiàn)有的ajax庫(kù),而且不受瀏覽器跨域限制。官方推薦用更簡(jiǎn)單的fetch api來(lái)替代傳統(tǒng)的ajax.但目前還無(wú)法在Chrome中直接觀測(cè)請(qǐng)求的詳情。
Q:如何讀寫(xiě)文件?如何調(diào)用攝像頭?如何調(diào)用麥克風(fēng)?等等
A:對(duì)于官方?jīng)]有提供的組件或API,請(qǐng)自行在js.coach或github中搜索第三方實(shí)現(xiàn)。如果搜不到相關(guān)結(jié)果,你只能考慮自己用原生代碼實(shí)現(xiàn)后整合進(jìn)來(lái)。