作者:Jim Liu
鏈接:https://www.zhihu.com/question/47053259/answer/132975841
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
cordova當(dāng)中主要有3者協(xié)同工作,一個native runtime,一個js bridge,一個web view。js bridge為web view封裝了一堆native api供調(diào)用。當(dāng)你只想跑一個普普通通的網(wǎng)頁的時候,web view提供的那些瀏覽器js api就夠用了,你調(diào)用它們,就只和web view打交道。而如果你要調(diào)用cordova給你封裝的那一堆擴展的api,這些調(diào)用就最終落實到native runtime上面來實現(xiàn)。react native中主要也有3者協(xié)同工作,一個native runtime,一個js bridge,一個js runtime。這個js runtime不是web view,你可以理解為它就是個類似于nodejs這類的東西吧,所以它自然也不會有瀏覽器里那些window/document這類的api。當(dāng)你在js runtime里調(diào)用native api,比如生產(chǎn)了一個Button,js bridge會把這件事告訴native runtime,native runtime就生成了一個native的Button。由于兩個runtime之間無法直接交換數(shù)據(jù),所以js bridge一般會用id mapping方式來實現(xiàn)對象式的試圖操作(當(dāng)然react native是不是這么做的我不太清楚)。比如,native runtime那邊給native Button分配一個id,js bridge就給js runtime這邊分配一個具有相同id的“傀儡”Button,這兩者就通過這個id關(guān)聯(lián)起來了。你調(diào)用button.show()的時候,js bridge事實上是傳遞一個,打個比方,{ id: 10, method: 'show', arguments: [] }的消息給native runtime,后者照做就行。 這樣做的結(jié)果是,你在js runtime里做的任何接口調(diào)用,都通過js bridge,落實到native runtime上來實現(xiàn)。說簡單點cordova對瀏覽器做了一大堆擴展api,你的程序是一個網(wǎng)頁。react native是在native app里引入了一個腳本語言,只是,這個腳本語言剛好是js,它也可以是lua也可以是別的,你寫的程序是js在“遙控”一個native app。
React Native 是 native 界面。
React Native 是 native 界面。
React Native 是 native 界面。