關于電商應用中將React Native集成到現有項目中

<h5>項目背景</h5>
本身
現有的選型框架

  1. 國產阿里傳說中的weex.
    https://github.com/alibaba/weex
    Start很多,覺得很牛逼,但是ISSUE上面問題也比較多。后面向阿里的同學確認,問他們用的多么。給出的答案是,不敢用,只有天貓與淘寶兩個部門使用。自己領會。文檔,也覺得不是特別的全。經測試,還是需要在兼容性方面做改進。
Paste_Image.png
  1. FB的React Native .、
    http://facebook.github.io/react-native/
    Paste_Image.png

    個人感覺 ,文檔那是相當的全啊。基本上是按照流程來,就應該是沒有問題了。

整個結構思路
RN 這套框架讓 JS開發者可以大部分使用JS代碼就可以構建一個跨平臺APP。 Facebook官方說法是learn once, run everywhere, 即在Android 、 IOS、 Browser各個平臺,程序畫UI和寫邏輯的方式都大致相同。因為JS 可以動態加載,從而理論上可以做到write once, run everywhere, 當然要做額外的適配處理。如圖:

Paste_Image.png

RN需要一個JS的運行環境, 在IOS上直接使用內置的javascriptcore, 在Android 則使用webkit.org官方開源的jsc.so。 此外還集成了其他開源組件,如fresco圖片組件,okhttp網絡組件等。 RN 會把應用的JS代碼(包括依賴的framework)編譯成一個js文件(一般命名為index.android.bundle), , RN的整體框架目標就是為了解釋運行這個js 腳本文件,如果是js 擴展的API, 則直接通過bridge調用native方法; 如果是UI界面, 則映射到virtual DOM這個虛擬的JS[數據結構](http://lib.csdn.net/base/datastructure)中,通過bridge 傳遞到native , 然后根據數據屬性設置各個對應的真實native的View。 bridge是一種JS 和 [Java](http://lib.csdn.net/base/javase)代碼通信的機制, 用bridge函數傳入對方module 和 method即可得到異步回調的結果。

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

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

集成過程(在現有的應用中加入React 實現熱更新代碼)

React Native is great when you are starting a new mobile app from scratch. However, it also works well for adding a single view or user flow to existing native applications. With a few steps, you can add new React Native based features, screens, views, etc.

The keys to integrating React Native components into your Android application are to:
1)安裝React ,明確你需要使用它的什么組件。
2)使用react-native 在你現有的安卓項目的主目錄下面,創建node_modules/文件
3)開始用js創建你要的頁面。
4)配置現有的項目,集成React 的相關依賴包。
5)使用Reactive 的文件
6)編譯相關的項目文件 。
7)添加自定義的控件
8)Debug的介紹。
9)應用打包
10)使用CodePush熱更新

完整集成過程:
http://facebook.github.io/react-native/releases/next/docs/integration-with-existing-apps.html#creating-a-release-build-in-android-studio

注意事項
1)項目配置完后,有可能在模擬機上面,跑著的是正常的。但是呢,有的機器就跑不起來,請配置好相關的so文件 。

Paste_Image.png

2)項目是正常的啟動起來了,結果呢,npm start 服務一關,測試機上面自動的crash,正式版可是沒有npm服務啊,需要將相關的bundle文件打包到手機項目工程中,這樣啟動的話,就會依賴于apk中的assets文件 。生成bundle命令》
react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output [your-project-path]/app/src/main/assets/index.android.bundle --assets-dest [your-app-project-path]/app/src/main/res
執行完成后,再進行debug這時,將從assets上面加載相關文件了。不需要使用npm start.

3)Code Push的使用(記得版本號要與你的應用的version name是一樣的哦),將生成的bundle 文件推到code push 平臺
code-push release demo-android-dev ./bundles/index.android.bundle 1.5.1 --deploymentName Production --description "1.5.1" --mandatory true

code-push release demo-android-dev ./bundles/index.android.bundle 1.4.9 --description "ok 1.4.10+1" --mandatory true

  1. js文件的更新代碼如下:

'use strict';

import React from 'react';
import codePush from 'react-native-code-push';
import {
AppRegistry,
StyleSheet,
Text,
View,
TouchableOpacity
} from 'react-native';
let codePushOptions = { checkFrequency: codePush.CheckFrequency.MANUAL };

class HelloWorld extends React.Component {
onButtonPress() {
codePush.sync({
updateDialog: true,
installMode: codePush.InstallMode.IMMEDIATE
});
}
componentDidMount(){
//codePush.sync();
}
render() {
return (
<View style={styles.container}>
<Text style={styles.hello}>Code Push--test push 1.4.9++</Text>
<View>
<TouchableOpacity onPress={this.onButtonPress}>
<Text>Check for updates</Text>
</TouchableOpacity>
</View>
</View>
)
}
}
var styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
},
hello: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
});
//HelloWorld = codePush(HelloWorld);
HelloWorld = codePush(codePushOptions)(HelloWorld);
AppRegistry.registerComponent('HelloWorld', () => HelloWorld);

code-push 的一些使用
https://github.com/crazycodeboy/RNStudyNotes/tree/master/React%20Native%E5%BA%94%E7%94%A8%E9%83%A8%E7%BD%B2%E3%80%81%E7%83%AD%E6%9B%B4%E6%96%B0-CodePush%E6%9C%80%E6%96%B0%E9%9B%86%E6%88%90%E6%80%BB%E7%BB%93

一些思考

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

推薦閱讀更多精彩內容