淺析React Native 原理

PS:該文章僅供個人學習交流之用,不當之處,還請指出,歡迎拍磚吐槽!

一.React Native 框架分析

RN_整體框架圖.png

層次架構:

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

  • C++層:主要處理Java與JavaScript的通信以及執行JavaScript代碼工作,該層封裝了JavaScriptCore,執行對js的解析。基于JavaScriptCore,Web開發者可以盡情使用ES6的新特性,如class、箭頭操作符等,而且 React Native運行在JavaScriptCore中的,完全不存在瀏覽器兼容的情況。Bridge橋接了java , js 通信的核心接口。JSLoader主要是將來自assets目錄的或本地file加載javascriptCore,再通過JSCExectutor解析js文件。

  • Js層:該層提供了各種供開發者使用的組件以及一些工具庫。
    Component:Js層通js/jsx編寫的Virtual Dom來構建Component或Module,Virtual DOM是DOM在內存中的一種輕量級表達方式,可以通過不同的渲染引擎生成不同平臺下的UI。component的使用在 React 里極為重要, 因為component的存在讓計算 DOM diff 更高效。
    ReactReconciler : 用于管理頂層組件或子組件的掛載、卸載、重繪。

注:JSCore,即JavaScriptCore,JS解析的核心部分,IOS使用的是內置的JavaScriptCore,Androis上使用的是 https://webkit.org 家的jsc.so

Java層核心類及原理,如下所示:

ReactContext

ReactContext繼承于ContextWrapper,是ReactNative應用的上下文,通過getContext()去獲得,通過它可以訪問ReactNative核心類的實現。

ReactInstanceManager

ReactInstanceManager是ReactNative應用總的管理類,創建ReactContext、CatalystInstance等類,解析ReactPackage生成映射表,并且配合ReactRootView管理View的創建與生命周期等功能。

ReactRootView

為啟動入口核心類,負責監聽及分發事件并重新渲染元素,App啟動后,其將作為App的root view。

CatalystInstance

CatalystInstance是ReactNative應用Java層、C++層、JS層通信總管理類,總管Java層、JS層核心Module映射表與回調,三端通信的入口與橋梁。

JavaScriptModule

JavaScriptModule是JS Module,負責JS到Java的映射調用格式聲明,由CatalystInstance統一管理。

NativeModule

NativeModule是ava Module,負責Java到Js的映射調用格式聲明,由CatalystInstance統一管理。

JavascriptModuleRegistry

JS Module映射表,負責將所有JavaScriptModule注冊到CatalystInstance,通過Java動態代理調用到Js。

NativeModuleRegistry

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

CoreModulePackage

定義核心框架模塊,創建NativeModules&JsModules。

啟動過程的解析:

1.ReactInstanceManager創建時會配置應用所需的java模塊與js模塊,通過ReactRootView的startReactApplication啟動APP。

2.在創建ReactInstanceManager同時會創建用于加載JsBundle的JSBundlerLoader,并傳遞給CatalystInstance。

3.CatalystInstance會創建Java模塊注冊表及Javascript模塊注冊表,并遍歷實例化模塊。

4.CatalystInstance通過JSBundlerLoader向Node Server請求Js
Bundle,并傳遞給JSCJavaScriptExectutor,最后傳遞給javascriptCore,再通過ReactBridge通知ReactRootView完成渲染。

Js與Java通信機制

Java與Js之間的調用,是以兩邊存在兩邊存在同一份模塊配置表,最終均是將調用轉化為{moduleID,
methodID,callbackID,args},處理端在模塊配置表里查找注冊的模塊與方法并調用。

1. Java 調用Js

Java通過注冊表調用到CatalystInstance實例,透過ReactBridge的jni,調用到Onload.cpp中的callFunction,最后通過javascriptCore,調用BatchedBridge.js,根據參數{moduleID,methodID}require相應Js模塊執行。流程如下圖:

rn_java調用js.png

1. Js 調用Java

如果消息隊列中有等待Java 處理的邏輯,而且 Java 超過 5ms 都沒有來取走,那么 JavaScript 就會主動調用 Java 的方法,在需要調用調Java模塊方法時,會把參數{moduleID,methodID}等數據存在MessageQueue中,等待Java的事件觸發,把MessageQueue中的{moduleID,methodID}返回給Java,再根據模塊注冊表找到相應模塊處理。流程如下圖:


rn_js調用java.png

參考:
React Native for Android 原理分析與實踐:實現原理

React Native For Android 架構初探

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

React Native知識點

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

推薦閱讀更多精彩內容