1. 程式人生 > >React-Native開發總結+構建-除錯-基礎歸納總結

React-Native開發總結+構建-除錯-基礎歸納總結

更新時間:2017年11月07日16:47:07

    對於前端工程師來說,這幾年是最輝煌的時刻,前端框架層出不窮,而且出現了像RN這種功能的框架,更讓移動開發工程師大跌眼鏡望洋興嘆。新技術的不斷湧現,說明了一個問題,前端在程式設計技術界的地位越來越高,而且前端工程師的崗位越來越有挑戰性,如果不努力學習就趕不上大部隊了。

    雖然RN框架相容Android和iOS平臺,即一套程式碼開發出的native app可以執行在兩個不同的作業系統環境上,但相容性問題是非常多的,尤其在具體功能的實現上需要做相容處理。更多的相容性問題,我會在後期專案上線後整體出來釋出。

一、Android開發環境的配置和搭建

    本人第一次從開始配置環境到專案成功執行,花費了整整3天的時間,因此,對於初學者來說,不要太著急,一步一步來操作,遇到問題解決問題,心態要好。搭建環境的大致步驟,可以參考

官方文件 的相關步驟。

    具體細節問題,整理如下,可做參考:

    需要的基礎環境:NodeJS,GIt,java開發環境,Android studio開發包,genymotion模擬器

react-native run-android 執行專案

react-native log-android 列印日誌

1、關於模擬器

    genymotion軟體是一個手機模擬器容器,這個軟體自帶很多手機,尺寸和Android版本可根據專案需求進行選擇和配置,下載一個屬於自己的模擬器手機會自動嵌入式的安裝在genymotion中。(首次啟動手機,需要開啟開發者模式,設定-關於手機-版本號-點選10次左右-開啟開發者模式彈框,設定-開發者模式-開啟

)安裝步驟參考這裡

    另外一個國產模擬器夜神也可以當做開發除錯使用。

2、關於adb

    adb全稱為Android Debug Bridge,就是起到除錯橋的作用。這是一個工具(軟體),可以管理裝置或手機模擬器的狀態。還可以進行很多手機操作,如安裝軟體、系統升級、執行shell命令等等。adb就是連線Android手機與PC端的橋樑,可以讓使用者在電腦上對手機進行全面的操作。adb的相關操作,以下命令需要配置adb環境變數:

    $ adb devices;//檢視模擬器裝置是否執行

    $ adb kill-server;//關閉服務

    $ adb start-server;//開啟服務

3、關於Gradle

    Gradle是一個基於Apache Ant和Apache Maven概念的專案自動化構建工具,也是一個基於JVM的構建工具。在命令列安裝不上的解決方案:本地手動安裝。

    去官網 下載自己需要的版本,解壓ZIP檔案到:C:\Users\wanshaobo\.gradle\wrapper\dists

    以下步驟可以不用操作
    新建環境變數 GRADLE_HOME,即 C:\Users\wanshaobo\.gradle\wrapper\dists\gradle-2.4;
    修改環境變數 Path,追加 %GRADLE_HOME%\BIN;
    輸入快捷鍵 WIN+ R,輸入 cmd,在彈出的視窗輸入命令列: gradle -v;

二、iOS開發環境的配置和搭建

    請參考官方文件

三、react-native專案除錯

0、改變Android專案和ios專案的入口檔案

修改Android專案的入口檔案為根目錄的index.android.js:

/RNdemo/android/app/src/main/java/com/rndemo/MainApplication.java

修改上面的檔案內容

@Override
    protected String getJSMainModuleName() {
      return "index";
    }

@Override
    protected String getJSMainModuleName() {
      return "index.android";
    }

修改ios專案的入口檔案為根目錄的index.ios.js:

/RNdemo/ios/RNdemo/AppDelegate.m

修改上面的檔案內容

jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];

jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];

1、在不同裝置上開啟‘開發者選單’

Android專案開發:

iMac模擬器:fn + f1 或 command + m

windows模擬器:ctrl + win

真機:搖晃手機,如果搖晃手機沒有效果,可以長按選單按鈕,彈出開發者選單

ios專案開發:

command+r reload專案

command+d 開啟開發者選項

2、‘開發者選單’詳解

Reload 重新載入APP

Debug JS Remotely 開啟在Chrome瀏覽器的遠端除錯,下面詳細講解

Enable Live Reload

Enable Hot Reloading 開啟熱載入,程式碼編輯器程式碼變動,儲存後APP會直接產生變化

Toggle Inspector 開啟監聽器

Show Perf Monitor

Start/Stop Sampling Profiler

Dev Settings 開發設定

3、在真機上執行和除錯

真機上安裝請使用Android Studio或Xcode

Apk安裝到真機,如果版本不對,或者不能連上電腦實時除錯,需要搖一搖,開啟'開發者選項'對話方塊,

選擇Dev Settings-Debugging-Debug server & port for device-10.102.11.232:8081,

埠號8081需要看啟動的服務,設定成自己電腦的IP,就可以連上電腦線上除錯專案;

4、像開發web專案一樣檢視DOM元素和CSS樣式

$react-devtools

打開了React Developer Tools工具面板,然後開啟'開發者選項'對話方塊,Toggle Inspector-inspect,

然後點選元素,相應的dom結構和css樣式會在React Developer Tools工具面板中顯示;

5、檢視點選區域大小

開啟'開發者選項',Toggle Inspector-TouchAbles,選中一個可點選元素,然後關閉

Toggle Inspector,所有可點選元素邊框高亮顯示;

6、Chrome瀏覽器斷點除錯

開啟'開發者選項'對話方塊,選擇Debug JS Remotely,然後再Chrome瀏覽器中開啟‘開發者工具’-

在三個點中選擇Show console drawer,此時‘開發者工具’上面顯示程式碼,下面顯示日誌;在Sources面板的左側

目錄中選擇debuggerWorker.js,開啟相應的檔案,在語句上新增斷點,即可進行相應高階除錯;

7、真機和模擬器抓包除錯

抓包配置如下:

iMac:Charles

Windows:jsFiddle

配置:需要設定真機或模擬器WiFi的IP代理與電腦相同,埠號與抓包工具的監聽埠相同

8、第三方包

常規搜尋第三方包(外掛)的方法,去npm官網搜尋,www.npmjs.com;

同時,rn社群資源有公共維護的js.coach第三方元件庫,可以檢視這裡

react-timer-mixin 定時器

react-native-linear-gradient 漸變色

react-native-svgsvg 容器

react-navigation 路由-導航

react-redux

redux

react-native-svg

react-native-art js繪相簿

react-native-storage

react-native-image-zoom-viewer 圖集元件-圖片翻頁、縮放、下載

9、Android Studio的使用

開發RN專案的首選編輯器是webstorm,但Android Studio工具方便管理專案;

為一個RN專案啟動服務,常規是在terminal終端輸入react-native run -android,但也可以用Studio啟動:

在Studio中加入外掛RN Console,Android Studio-Preferences-Plugins-Browse Repositories,搜尋並安裝

這個外掛,這個外掛有兩個功能模組Welcome和React Packager,在React Packager可以run開啟服務;

10、Android打包

如果沒有注入簽名,執行./gradlew assembleRelease會生成app-release-unsigned.apk

注入簽名成功,執行./gradlew assembleRelease會生成app-release.apk

第一步,生成簽名金鑰檔案app-release-key.keystore

命令列進入指定目錄下,比如桌面,執行命令

$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

自定義輸入金鑰庫密碼和對應金鑰密碼,即可在桌面生成金鑰檔案app-release-key.keystore

第二步,將金鑰檔案放入工程中,並做相關配置

將金鑰檔案放入/Users/wanshaobo/project/app/android/keystores/miapp-release-key.keystore

在/Users/wanshaobo/project/app/android/app/build.gradle檔案中做如下配置,注意signingConfigs在buildTypes前面

android{

signingConfigs {
        release {
            storeFile file('../keystores/app-release-key.keystore')
            storePassword '123456'
            keyAlias 'app-key-alias'
            keyPassword '123456'
        }
    }

buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }

}

四、React native的官方API,用法import { *** } from 'react-native'

BackHandler

監聽安卓物理返回鍵,不重寫監聽事件,則返回上一個頁面,返回false執行預設行為

用法一,BackHandler.exitApp()從首頁退出APP;

用法二,

BackHandler.addEventListener('hardwareBackPress',this.onBackAndroid);

BackHandler.removeEventListener('hardwareBackPress',this.onBackAndroid);

onBackAndroid = ()=>{ ... return true}//return true阻止預設行為

注意:hardwareBackPress事件監聽與解除安裝的位置,監聽一般在componentWillMount中,但解除安裝不一定在componentWillUnMount中,因為頁面跳轉不一定走componentWillUnMount,比如this.props.navigation.navigate('A')是向頁面棧的入棧操作,上一個頁面不會銷燬

<Modal />元件的物理返回鍵重寫為onRequestClose

Platform

用法Platform.OS === 'android' || 'ios'

DeviceEventEmitter

通知-廣播,頁面回退重新整理機制

使用:import {DeviceEventEmitter} from 'react-native'

DeviceEventEmitter.addListener('refreshHomePage',(data)=>{this.refreshHomePage(data)});

DeviceEventEmitter.remove('refreshHomePage');

DeviceEventEmitter.emit('refreshHomePage',data)

需求,B頁面goBack到A頁面,A頁面重新整理;

第一個方案,

this.props.navigation.navigate('B',{callback:()=>{this.refreshA()}});

this.props.navigation.state.params.callback();

this.props.navigation.goBack();

第二個方案,廣播

StatusBar

狀態列元件

主頁設定一次,整個專案的狀態列都一致

設定頂部導航元件樣式:height:72,paddingTop:16

<StatusBar backgroundColor={'transparent'} hidden={false} translucent={true} />

console.log(StatusBar.currentHeight);//Android平臺狀態列高度,常量

隱藏和顯示狀態列:

true ? null :<StatusBar hidden={true}/>

五、報錯彙總

錯誤一:

>Could not resolve all dependencies for configuration ':app:_debugApk'.

> Configuration with name 'default' not found.

原因:專案加入第三方包,然後npm uninstall,解除安裝包之後,需要手動刪除Android專案中的配置

分別刪除三個地方檔案中的配置:

/RNdemo/android/settings.gradle

/RNdemo/android/app/build.gradle

/RNdemo/android/app/src/main/java/com/rndemo04/MainApplication.java

警告二:

使用FlatList元件時,如果屬性值沒有傳遞key值,會報警告,

解決方案:

<FlatList

keyExtractor={this._keyExtractor}

/>

_keyExtractor = (item, index) => index;

六、iconfont使用

在阿里巴巴向量圖示庫中選擇專案需要的icon,新增到購物車,新建一個專案名稱,將選取的icon放到這個專案中,

然後下載匯出iconfont.ttf檔案;

Android專案,將ttf檔案放到,/project/my_App/android/app/src/main/assets/fonts/iconfont.ttf

iOS專案,將ttf檔案放到,/project/my_App/ios/my_App/iconfont.ttf

使用方法:

<Text style={{fontFamily: 'iconfont', color: '#cbcbcb', fontSize: D(20)}}>&#xe601;</Text>

&#xe601;為Unicode編碼

七、不同平臺使用不同的內容、元件、樣式

方案一,顯示不同內容:

const element = Platform.select({
  ios: '這是ios裝置顯示的內容',
  android: '這是Android裝置顯示的內容',
});

const element = Platform.select({
  ios:<Text>456</Text>,
  android: <Text>123</Text>,
});

class page extends Component{

render(){

<View style={Styles.container}>{element}</View>

}

}

方案二,根據元件不同字尾名,使用不同元件,react-native會自動檢測檔案是否具有.ios或.android的副檔名:

Element.ios.js

Element.android.js

import Element from './Element';

方案三,引入不同依賴:

var Element = Platform.select({
  ios: () => require('ComponentIOS'),
  android: () => require('ComponentAndroid'),
})();
<Element />;

方案四,渲染樣式:

let Styles = StyleSheet.create({

container:{

flex:1,

...Platform.select({

ios:{backgroundColor:'red'},

android:{backgroundColor:'blue'},

})

}

});

let Styles = StyleSheet.create({

container:{

flex:1,

backgroundColor:  (Platform.OS === 'ios') ? 'red' : 'blue',

}

});

方案五,根據路徑不同,引入不同元件:

common/components/android/Element.js

common/components/ios/Element.js





未完,待續...