淺析React Native 原理

PS:該文章僅供個(gè)人學(xué)習(xí)交流之用,不當(dāng)之處竿刁,還請(qǐng)指出猜扮,歡迎拍磚吐槽煮盼!

一.React Native 框架分析

RN_整體框架圖.png

層次架構(gòu):

  • Java層:該層主要提供了Android的UI渲染器UIManager(將JavaScript映射成Android Widget)以及一些其他的功能組件(例如:Fresco悠就、Okhttp)等梗脾,在java層均封裝為Module,java層核心jar包是react-native.jar盹靴,封裝了眾多上層的interface炸茧,如Module,Registry稿静,bridge等梭冠。

  • C++層:主要處理Java與JavaScript的通信以及執(zhí)行JavaScript代碼工作,該層封裝了JavaScriptCore改备,執(zhí)行對(duì)js的解析控漠。基于JavaScriptCore绍妨,Web開(kāi)發(fā)者可以盡情使用ES6的新特性,如class柬脸、箭頭操作符等他去,而且 React Native運(yùn)行在JavaScriptCore中的,完全不存在瀏覽器兼容的情況倒堕。Bridge橋接了java 灾测, js 通信的核心接口。JSLoader主要是將來(lái)自assets目錄的或本地file加載javascriptCore垦巴,再通過(guò)JSCExectutor解析js文件媳搪。

  • Js層:該層提供了各種供開(kāi)發(fā)者使用的組件以及一些工具庫(kù)。
    Component:Js層通js/jsx編寫(xiě)的Virtual Dom來(lái)構(gòu)建Component或Module骤宣,Virtual DOM是DOM在內(nèi)存中的一種輕量級(jí)表達(dá)方式秦爆,可以通過(guò)不同的渲染引擎生成不同平臺(tái)下的UI。component的使用在 React 里極為重要, 因?yàn)閏omponent的存在讓計(jì)算 DOM diff 更高效憔披。
    ReactReconciler : 用于管理頂層組件或子組件的掛載等限、卸載爸吮、重繪。

注:JSCore望门,即JavaScriptCore形娇,JS解析的核心部分,IOS使用的是內(nèi)置的JavaScriptCore筹误,Androis上使用的是 https://webkit.org 家的jsc.so桐早。

Java層核心類(lèi)及原理,如下所示:

ReactContext

ReactContext繼承于ContextWrapper厨剪,是ReactNative應(yīng)用的上下文哄酝,通過(guò)getContext()去獲得,通過(guò)它可以訪問(wèn)ReactNative核心類(lèi)的實(shí)現(xiàn)丽惶。

ReactInstanceManager

ReactInstanceManager是ReactNative應(yīng)用總的管理類(lèi)炫七,創(chuàng)建ReactContext、CatalystInstance等類(lèi)钾唬,解析ReactPackage生成映射表万哪,并且配合ReactRootView管理View的創(chuàng)建與生命周期等功能。

ReactRootView

為啟動(dòng)入口核心類(lèi)抡秆,負(fù)責(zé)監(jiān)聽(tīng)及分發(fā)事件并重新渲染元素奕巍,App啟動(dòng)后,其將作為App的root view儒士。

CatalystInstance

CatalystInstance是ReactNative應(yīng)用Java層的止、C++層、JS層通信總管理類(lèi)着撩,總管Java層诅福、JS層核心Module映射表與回調(diào),三端通信的入口與橋梁拖叙。

JavaScriptModule

JavaScriptModule是JS Module氓润,負(fù)責(zé)JS到Java的映射調(diào)用格式聲明,由CatalystInstance統(tǒng)一管理薯鳍。

NativeModule

NativeModule是ava Module咖气,負(fù)責(zé)Java到Js的映射調(diào)用格式聲明,由CatalystInstance統(tǒng)一管理挖滤。

JavascriptModuleRegistry

JS Module映射表,負(fù)責(zé)將所有JavaScriptModule注冊(cè)到CatalystInstance崩溪,通過(guò)Java動(dòng)態(tài)代理調(diào)用到Js。

NativeModuleRegistry

是Java Module映射表,即暴露給Js的API集合斩松。

CoreModulePackage

定義核心框架模塊伶唯,創(chuàng)建NativeModules&JsModules。

啟動(dòng)過(guò)程的解析:

1.ReactInstanceManager創(chuàng)建時(shí)會(huì)配置應(yīng)用所需的java模塊與js模塊惧盹,通過(guò)ReactRootView的startReactApplication啟動(dòng)APP抵怎。

2.在創(chuàng)建ReactInstanceManager同時(shí)會(huì)創(chuàng)建用于加載JsBundle的JSBundlerLoader奋救,并傳遞給CatalystInstance。

3.CatalystInstance會(huì)創(chuàng)建Java模塊注冊(cè)表及Javascript模塊注冊(cè)表反惕,并遍歷實(shí)例化模塊尝艘。

4.CatalystInstance通過(guò)JSBundlerLoader向Node Server請(qǐng)求Js
Bundle,并傳遞給JSCJavaScriptExectutor姿染,最后傳遞給javascriptCore背亥,再通過(guò)ReactBridge通知ReactRootView完成渲染。

Js與Java通信機(jī)制

Java與Js之間的調(diào)用悬赏,是以?xún)蛇叴嬖趦蛇叴嬖谕环菽K配置表狡汉,最終均是將調(diào)用轉(zhuǎn)化為{moduleID,
methodID,callbackID闽颇,args}盾戴,處理端在模塊配置表里查找注冊(cè)的模塊與方法并調(diào)用。

1. Java 調(diào)用Js

Java通過(guò)注冊(cè)表調(diào)用到CatalystInstance實(shí)例兵多,透過(guò)ReactBridge的jni尖啡,調(diào)用到Onload.cpp中的callFunction,最后通過(guò)javascriptCore剩膘,調(diào)用BatchedBridge.js衅斩,根據(jù)參數(shù){moduleID,methodID}require相應(yīng)Js模塊執(zhí)行。流程如下圖:

rn_java調(diào)用js.png

1. Js 調(diào)用Java

如果消息隊(duì)列中有等待Java 處理的邏輯怠褐,而且 Java 超過(guò) 5ms 都沒(méi)有來(lái)取走畏梆,那么 JavaScript 就會(huì)主動(dòng)調(diào)用 Java 的方法,在需要調(diào)用調(diào)Java模塊方法時(shí),會(huì)把參數(shù){moduleID,methodID}等數(shù)據(jù)存在MessageQueue中奈懒,等待Java的事件觸發(fā)奠涌,把MessageQueue中的{moduleID,methodID}返回給Java,再根據(jù)模塊注冊(cè)表找到相應(yīng)模塊處理磷杏。流程如下圖:


rn_js調(diào)用java.png

參考:
React Native for Android 原理分析與實(shí)踐:實(shí)現(xiàn)原理

React Native For Android 架構(gòu)初探

React Native Android 源碼框架淺析(主流程及 Java 與 JS 雙邊通信)

React Native知識(shí)點(diǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末溜畅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茴丰,更是在濱河造成了極大的恐慌达皿,老刑警劉巖天吓,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贿肩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡龄寞,警方通過(guò)查閱死者的電腦和手機(jī)汰规,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)物邑,“玉大人溜哮,你說(shuō)我怎么就攤上這事滔金。” “怎么了茂嗓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵餐茵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我述吸,道長(zhǎng)忿族,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任蝌矛,我火速辦了婚禮道批,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘入撒。我一直安慰自己隆豹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布茅逮。 她就那樣靜靜地躺著璃赡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氮唯。 梳的紋絲不亂的頭發(fā)上鉴吹,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音惩琉,去河邊找鬼豆励。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瞒渠,可吹牛的內(nèi)容都是我干的良蒸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼伍玖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嫩痰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起窍箍,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤串纺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后椰棘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纺棺,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年邪狞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祷蝌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帆卓,死狀恐怖巨朦,靈堂內(nèi)的尸體忽然破棺而出米丘,到底是詐尸還是另有隱情,我是刑警寧澤糊啡,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布拄查,位于F島的核電站,受9級(jí)特大地震影響棚蓄,放射性物質(zhì)發(fā)生泄漏靶累。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一癣疟、第九天 我趴在偏房一處隱蔽的房頂上張望挣柬。 院中可真熱鬧,春花似錦睛挚、人聲如沸邪蛔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)侧到。三九已至,卻和暖如春淤击,著一層夾襖步出監(jiān)牢的瞬間匠抗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工污抬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汞贸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓印机,卻偏偏與公主長(zhǎng)得像矢腻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子射赛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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