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