作者:Jim Liu
鏈接:https://www.zhihu.com/question/47053259/answer/132975841
來(lái)源:知乎
著作權(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)頁(yè)的時(shí)候,web view提供的那些瀏覽器js api就夠用了著洼,你調(diào)用它們樟遣,就只和web view打交道。而如果你要調(diào)用cordova給你封裝的那一堆擴(kuò)展的api身笤,這些調(diào)用就最終落實(shí)到native runtime上面來(lái)實(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之間無(wú)法直接交換數(shù)據(jù),所以js bridge一般會(huì)用id mapping方式來(lái)實(shí)現(xiàn)對(duì)象式的試圖操作(當(dāng)然react native是不是這么做的我不太清楚)川梅。比如疯兼,native runtime那邊給native Button分配一個(gè)id,js bridge就給js runtime這邊分配一個(gè)具有相同id的“傀儡”Button贫途,這兩者就通過(guò)這個(gè)id關(guān)聯(lián)起來(lái)了吧彪。你調(diào)用button.show()的時(shí)候,js bridge事實(shí)上是傳遞一個(gè)丢早,打個(gè)比方姨裸,{ id: 10, method: 'show', arguments: [] }的消息給native runtime,后者照做就行怨酝。 這樣做的結(jié)果是傀缩,你在js runtime里做的任何接口調(diào)用,都通過(guò)js bridge农猬,落實(shí)到native runtime上來(lái)實(shí)現(xiàn)赡艰。說(shuō)簡(jiǎn)單點(diǎn)cordova對(duì)瀏覽器做了一大堆擴(kuò)展api,你的程序是一個(gè)網(wǎng)頁(yè)斤葱。react native是在native app里引入了一個(gè)腳本語(yǔ)言慷垮,只是揖闸,這個(gè)腳本語(yǔ)言剛好是js,它也可以是lua也可以是別的料身,你寫(xiě)的程序是js在“遙控”一個(gè)native app汤纸。
React Native 是 native 界面。
React Native 是 native 界面惯驼。
React Native 是 native 界面蹲嚣。