React Native開發(fā)流程

RN開發(fā)流程

  • 目標(biāo): 3月1日—4月14日,熟悉整套開發(fā)流程,并輸出文檔教程。

RN環(huán)境搭建

RN環(huán)境搭建請參考以下鏈接:
http://vipwiki.xunlei.cn/pages/viewpage.action?pageId=4522005

RN界面及功能開發(fā)

RN環(huán)境搭建完成以后

  1. 創(chuàng)建項目:react-native init Helloworld(創(chuàng)建的過程可能比較慢,因為要下載一個比較大的node_modules依賴包,耐心等待一下就好)
  2. cd Helloworld(將終端切換到項目所在目錄下)
  3. 運行項目:
    ios: react-native run-ios(或者手動打開Helloworld.xcproject文)
    android:react-native run-android
  4. 將工程在模擬器上運行起來

Helloworld項目目錄結(jié)構(gòu)如下:

rnhelloworlddir.png
  • 各文件作用如下:
  1. 'tests' 存放測試代碼,可使用Jtest來寫測試,這快暫時沒有去研究。
  2. android Android工程文件
  3. index.android.js Android項目js入口文件
  4. index.ios.js ios項目js入口文件
  5. node_modules node.js的依賴包
  6. package.json RN項目配置文件,版本號,項目名,依賴關(guān)系等
  7. yarn.lock Yarn 通過一個 yarn.lock (從內(nèi)容上看是一個類似于ios的pod.lock)描述node_modules中所有依賴庫版本的文件。
  • 整體架構(gòu)
image

RN需要一個JS的運行環(huán)境, 在IOS上直接使用內(nèi)置的javascriptcore, 在Android 則使用webkit.org官方開源的jsc.so。 此外還集成了其他開源組件,如fresco圖片組件,okhttp網(wǎng)絡(luò)組件等。

  • 使用js來定制UI界面

打開index.ios.js文件,這里頭包含我們helloworld項目的UI元素及布局邏輯。
前面import導(dǎo)入對應(yīng)的依賴包,接下來是一個繼承自Component的Hellowrold類,可以理解為ios的viewcontroller類,每一個class如果需要在界面上顯示內(nèi)容,則必須實現(xiàn)render方法,并在該方法內(nèi)用js代碼實現(xiàn)所有界面元素。
舉個例子:
打開index.ios.js 文件:

import React, { Component } from 'react';  
/*
ES6模塊主要有兩個功能:export和import

export用于對外輸出本模塊(一個文件可以理解為一個模塊)變量的接口

import用于在一個模塊中加載另一個含有export接口的模塊。
*/
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';

export default class Helloworld extends Component {
  render() {
    //所有界面元素都通過render()函數(shù)返回
    return (
      <View style={styles.container}> 
      //定義一個view容器,屬性支持通過變量獲取,{}表示取變量的值
        <Text style={styles.welcome}>
          Welcome to React Native!
        </Text>
        <Text style={styles.instructions}>
          To get started, edit index.ios.js
        </Text>
        <Text style={styles.instructions}>
          Press Cmd+R to reload,{'\n'}
          Cmd+D or shake for dev menu
        </Text>
      </View>
    );
  }
}

//屬性設(shè)置支持CSS class的方式
const styles = StyleSheet.create({
   // StyleSheet 類路徑:node_modules/react-native/Libraries/StyleSheet/StyleSheet.js 
  /*
 create函數(shù)源碼
 create<S: Styles>(obj: S): StyleSheet<S> {
    const result: StyleSheet<S> = {};
    for (var key in obj) {
      StyleSheetValidation.validateStyle(key, obj);
      result[key] = ReactNativePropRegistry.register(obj[key]);
    }
    return result;
  },
*/
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});

AppRegistry.registerComponent('Helloworld', () => Helloworld);

開發(fā)工具

Sublime, WebStorm
開發(fā)工具推薦使用Subline,使用文檔參考:http://vipwiki.xunlei.cn/pages/viewpage.action?pageId=4522038

開發(fā)語言,語法

JS,JSX
JS是React native開發(fā)的主要語言,同時為了簡化JS語法,RN中JS支持xml標(biāo)簽,也就是JSX語法。

第三方庫

React
React庫是實現(xiàn)JS與本地代碼相互調(diào)用的橋梁。

RN運行原理

RN 會把應(yīng)用的JS代碼(包括依賴的framework)編譯成一個js文件(一般命名為index.android.bundle), RN的整體框架目標(biāo)就是為了解釋運行這個js 腳本文件,如果是js 擴展的API, 則直接通過bridge調(diào)用native方法; 如果是UI界面, 則映射到virtual DOM這個虛擬的JS數(shù)據(jù)結(jié)構(gòu)中,通過bridge 傳遞到native , 然后根據(jù)數(shù)據(jù)屬性設(shè)置各個對應(yīng)的真實native的View。 bridge是一種JS 和 Java代碼通信的機制, 用bridge函數(shù)傳入對方module 和 method即可得到異步回調(diào)的結(jié)果。

對于JS開發(fā)者來說, 畫UI只需要畫到virtual DOM 中,不需要特別關(guān)心具體的平臺, 還是原來的單線程開發(fā),還是原來HTML 組裝UI(JSX),還是原來的CSS樣式模型(部分兼容 )。RN的界面處理除了實現(xiàn)View 增刪改查的接口之外,還自定義一套樣式表達CSSLayout,這套CSSLayout也是跨平臺實現(xiàn)。 RN 擁有畫UI的跨平臺能力,主要是加入Virtual DOM編程模型,該方法一方面可以照顧到JS開發(fā)者在html DOM的部分傳承, 讓JS 開發(fā)者可以用類似DOM編程模型就可以開發(fā)原生APP , 另一方面則可以讓Virtual DOM適配實現(xiàn)到各個平臺,實現(xiàn)跨平臺的能力,并且為未來增加更多的想象空間, 比如react-cavas, react-openGL。而實際上react-native也是從react-js演變而來。

對于 Android 開發(fā)者來說, RN是一個普通的安卓程序加上一堆事件響應(yīng), 事件來源主要是JS的命令。主要有二個線程,UI main thread, JS thread。 UI thread創(chuàng)建一個APP的事件循環(huán)后,就掛在looper等待事件 , 事件驅(qū)動各自的對象執(zhí)行命令。 JS thread 運行的腳本相當(dāng)于底層數(shù)據(jù)采集器, 不斷上傳數(shù)據(jù),轉(zhuǎn)化成UI 事件, 通過bridge轉(zhuǎn)發(fā)到UI thread, 從而改變真實的View。 后面再深一層發(fā)現(xiàn), UI main thread 跟 JS thread更像是CS 模型,JS thread更像服務(wù)端, UI main thread是客戶端, UI main thread 不斷詢問JS thread并且請求數(shù)據(jù),如果數(shù)據(jù)有變,則更新UI界面。

ios導(dǎo)出RN本地bundle

集成到應(yīng)用中,將js代碼和資源打包到應(yīng)用內(nèi)(熱修復(fù)方式可能導(dǎo)致ios審核被拒)

cd 到rn項目目錄下
react-native bundle --entry-file ./index.ios.js --platform ios --bundle-output ./main.bundle --assets-dest ./myassets --dev false --verbose 

輸出文件:
main.bundle
main.bundle.meta
myassets

  1. 將main.bundle,myasserts添加到項目中,必須保留文件目錄(Create folder references)。
  2. 參考官方文檔,修改AppDelegate.m文件,使用OPTION 2處的代碼
jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
  1. 一切OK 運行模擬器看效果吧

Android將RN運行腳本發(fā)布到服務(wù)器

可實現(xiàn)熱修復(fù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,003評論 2 374

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