https://github.com/guoxiaoxing/react-native/tree/master/doc/ReactNative%E6%BA%90%E7%A0%81%E7%AF%87
線程模型
RN應用中存在3個線程:
UI線程:即Android中的主線程,負責繪制UI以及監聽用戶操作。
Native線程:負責執行C++代碼,該線程主要負責Java與C++的通信。
JS線程:負責解釋執行JS。
渲染模型
渲染模型框架:
VirtualDom的diff模型:
具體VirtualDom的算法模型可以參考這篇文章:
Js渲染Native具體范例:
JS端通過調用RCTUIManager的createView的方法,傳遞json格式的數據,通知native端進行UI組件的初始化和渲染。
通信模型
JNI作為C++與Java的橋梁,JSC作為C++與JavaScript的橋梁,而C++最終連接了Java與JavaScript。
Java調Js
原理使用了JSCore從Native執行JS代碼,RN在此基礎上給我們提供了通知發送的執行方式
具體實現:Java通過注冊表調用到CatalystInstance實例,透過ReactBridge的jni,調用到Onload.cpp中的callFunction,最后通過javascriptCore,調用BatchedBridge.js,根據參數{moduleID,methodID}require相應Js模塊執行。流程如下圖:
Js調Java
一般情況下,JS調Java的機制是[JS把對應的methodId和params push到MessageQueue中,等待native調用JS,然后把MessageQueue中的數據發送到C層,再通過jni轉到java層]
但如果JS的MessageQueue中的message超過 5ms 都沒有取走,那么 JavaScript 就會主動調用方法nativeFlushQueueImmediate,通知C層將message取走。流程如下圖:
JS的解析是在Webkit-JavaScriptCore中完成的,JSCExexutor對JavaScriptCore的功能做了進一步的封裝