線程模型
RN應用中存在3個線程:
UI線程:即Android中的主線程,負責繪制UI以及監(jiān)聽用戶操作。
Native線程:負責執(zhí)行C++代碼,該線程主要負責Java與C++的通信。
JS線程:負責解釋執(zhí)行JS。
渲染模型
渲染模型框架:

VirtualDom的diff模型:
具體VirtualDom的算法模型可以參考這篇文章:
深度剖析:如何實現(xiàn)一個 Virtual DOM 算法
Js渲染Native具體范例:
JS端通過調(diào)用RCTUIManager的createView的方法,傳遞json格式的數(shù)據(jù),通知native端進行UI組件的初始化和渲染。

通信模型
JNI作為C++與Java的橋梁,JSC作為C++與JavaScript的橋梁,而C++最終連接了Java與JavaScript。
Java調(diào)Js
原理使用了JSCore從Native執(zhí)行JS代碼,RN在此基礎上給我們提供了通知發(fā)送的執(zhí)行方式
具體實現(xiàn):Java通過注冊表調(diào)用到CatalystInstance實例,透過ReactBridge的jni,調(diào)用到Onload.cpp中的callFunction,最后通過javascriptCore,調(diào)用BatchedBridge.js,根據(jù)參數(shù){moduleID,methodID}require相應Js模塊執(zhí)行。流程如下圖:

Js調(diào)Java
一般情況下,JS調(diào)Java的機制是[JS把對應的methodId和params push到MessageQueue中,等待native調(diào)用JS,然后把MessageQueue中的數(shù)據(jù)發(fā)送到C層,再通過jni轉(zhuǎn)到java層]
但如果JS的MessageQueue中的message超過 5ms 都沒有取走,那么 JavaScript 就會主動調(diào)用方法nativeFlushQueueImmediate,通知C層將message取走。流程如下圖:

JS的解析是在Webkit-JavaScriptCore中完成的,JSCExexutor對JavaScriptCore的功能做了進一步的封裝