Weex 2:淺說Weex工作原理

導(dǎo)語: 以前在開發(fā)Native頁面的同時鞋拟,還處理Hybrid頁面中Web和Native的交互,現(xiàn)在又開始接入Weex這樣的跨平臺開發(fā)方案令花,感覺純粹的Native App離我們越來越遠(感慨一下)抹凳。Weex到怎么工作的鸯匹,本文簡單說一下≡植【想知道如何將Weex接入iOS項目挫望,請看Weex 1:Weex接入iOS項目)】

一、Weex架構(gòu)

Weex架構(gòu)圖.png

從Weex的架構(gòu)圖中可以看出

1狂窑、Weex首先將編寫的Weex源碼媳板,也就是后綴名為.we,由<template>泉哈、<style> 和 <script>等標簽組織好的內(nèi)容蛉幸,通過transformer(轉(zhuǎn)換器,weex-toolkit 提供的工具)轉(zhuǎn)換成JS Bundle丛晦。

2奕纫、然后將JS Bundle部署在服務(wù)器,當接收到終端(Web端烫沙、iOS端或Android端)的JS Bundle請求匹层,將JS Bundle下發(fā)給終端。

3斧吐、在終端(Web端又固、iOS端或Android端)中,由Weex的JS Framework 接收和執(zhí)行JS Bundle代碼煤率,并且執(zhí)行數(shù)據(jù)綁定仰冠、模板編譯等操作,然后輸出JSON 格式的 Virtual DOM蝶糯;JS Framework發(fā)送渲染指令給Native 洋只,提供 callNative 和 callJS 接口,方便 JS Framework 和 Native 的通信。

說明:Weex源碼轉(zhuǎn)換成JS Bundle 识虚、JS Framework 和Native渲染絕對是實現(xiàn)跨平臺技術(shù)的關(guān)鍵(目前我是這么想的)肢扯。

二、Weex源碼轉(zhuǎn)換成JS Bundle

整體工作可以分為三個部分

1担锤、轉(zhuǎn)換 <template> 為 類JSON的樹狀數(shù)據(jù)結(jié)構(gòu), 轉(zhuǎn)換數(shù)據(jù)綁定 為 返回數(shù)據(jù)的函數(shù)原型蔚晨。#####
<foo a="{{x}}" b="1" />   -->   {type: "foo", attr: {a: function () {return this.x}, b: 1}}.
2、轉(zhuǎn)換 <style> 為 類JSON的樹狀數(shù)據(jù)結(jié)構(gòu)肛循。
.classname {name: value;}  -->  { classname :  { name :  value } }.
3铭腕、 把上面兩部分的內(nèi)容和 <script> 中的內(nèi)容結(jié)合成一個JavaScript AMD(AMD:異步模塊規(guī)范) 模塊。#####

下面是一個完整的例子

<template>
  <foo a="{{x}}" b="1" class="bar"></foo>
</template>

<style>
  .bar {width: 200; height: 200}
</style>

<script>
  module.exports = {
    data: function () {
      return {x: 100}
    }
  }
</script>

將轉(zhuǎn)換為:

define('@weex-component/main', function () {
  module.exports = {
    data: function () {
      return {x: 100}
    }
  }
  module.template = {
    type: "foo",
    attr: {
      a: function () {return this.x},
      b: 1,
      classname: ['bar']
    }
  }
  module.style = {
    bar: {width: 200, height: 200}
  }
})
bootstrap('@weex-component/main')

說明1:除此之外,轉(zhuǎn)換器還會做一些額外的事情: 合并Bundle ,添加引導(dǎo)函數(shù)多糠,配置外部數(shù)據(jù)等等累舷。

說明2:案例來自Weex的官方文檔。當前大部分Weex工具最終輸出的JS Bundle格式都經(jīng)過了Webpack的二次處理夹孔,所以你實際使用工具輸出的JS Bundle會和上面的有所區(qū)別被盈。

三、JS Framework

1搭伤、JS Framework 簡述#####

在初始化階段被原生 JavaScript 引擎運行只怎。它提供被每個JS Bundle調(diào)用的 define() 和 bootstrap() 函數(shù)。一旦JS Bundle從服務(wù)器下載后怜俐,這些函數(shù)就會執(zhí)行. define() 函數(shù)以注冊模塊; bootstrap()會編譯主要的模塊為Virtual DOM尝盼,并發(fā)送渲染指令給Native 。就這樣佑菩,同樣的一份JSON 數(shù)據(jù)盾沫,在不同平臺的渲染引擎中能夠渲染成不同版本的 UI,這是 Weex 可以實現(xiàn)動態(tài)化的原因殿漠。

2赴精、在Weex實例運行期間,Native和JS之間的相互調(diào)用的循環(huán)往復(fù)的調(diào)用會從Weex實例初始化持續(xù)到銷毀#####
  • callNative 是一個由native代碼實現(xiàn)的函數(shù), 它被JS代碼調(diào)用并向native發(fā)送指令,例如 rendering, networking, authorizing和其他客戶端側(cè)的 toast 等API绞幌。
JS調(diào)用Native.png
  • callJS 是一個由JS實現(xiàn)的函數(shù), 它用于Native向JS發(fā)送指令. 目前這些指令由用戶交互和Native的回調(diào)函數(shù)組成蕾哟。
Native調(diào)用JS.png

四、Native渲染

1莲蜘、Native 渲染引擎提供客戶端組件(Component)和模塊(Module)#####
  • 組件(Component):在屏幕內(nèi)可見谭确,有特定行為,能被配置不同的屬性和樣式票渠,能響應(yīng)用戶交互逐哈,常見的組件有: <div>、<text>问顷、 <image>昂秃。

  • 模塊(Module): 是一組能被JS Framework調(diào)用的API. 其中的一些能以異步的方式調(diào)用JS Framework, 例如: 發(fā)送HTTP請求禀梳。

2、Weex 的渲染流程#####

Weex 的渲染流程如下圖:

Weex渲染流程.png

從Weex 渲染流程圖中肠骆,可以看到渲染分為:

輸入:虛擬DOM

  • 構(gòu)造樹結(jié)構(gòu). 分析虛擬DOM JSON數(shù)據(jù)以構(gòu)造渲染樹(RT).

  • 添加樣式. 為渲染樹的各個節(jié)點添加樣式.

  • 創(chuàng)建視圖. 為渲染樹各個節(jié)點創(chuàng)建Native視圖.

  • 綁定事件. 為Native視圖綁定事件.

  • CSS布局. 使用 css-layout 來計算各個視圖的布局.

  • 更新視窗(Frame). 采用上一步的計算結(jié)果來更新視窗中各個視圖的最終布局位置.

輸出:Native UI 頁面

End

本文參考:Weex 工作原理
更細致的內(nèi)容深入在使用Weex之后再繼續(xù)深入理解(畢竟第一次用)算途。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚀腿,隨后出現(xiàn)的幾起案子嘴瓤,更是在濱河造成了極大的恐慌,老刑警劉巖莉钙,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纱注,死亡現(xiàn)場離奇詭異,居然都是意外死亡胆胰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門刻获,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜀涨,“玉大人,你說我怎么就攤上這事蝎毡『窳” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵沐兵,是天一觀的道長别垮。 經(jīng)常有香客問我,道長扎谎,這世上最難降的妖魔是什么碳想? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮毁靶,結(jié)果婚禮上胧奔,老公的妹妹穿的比我還像新娘。我一直安慰自己预吆,他們只是感情好龙填,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拐叉,像睡著了一般岩遗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凤瘦,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天宿礁,我揣著相機與錄音,去河邊找鬼蔬芥。 笑死窘拯,一個胖子當著我的面吹牛红且,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涤姊,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼暇番,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了思喊?” 一聲冷哼從身側(cè)響起壁酬,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恨课,沒想到半個月后舆乔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡剂公,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年希俩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纲辽。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡颜武,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拖吼,到底是詐尸還是另有隱情鳞上,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布吊档,位于F島的核電站篙议,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怠硼。R本人自食惡果不足惜鬼贱,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望香璃。 院中可真熱鬧吩愧,春花似錦、人聲如沸增显。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽同云。三九已至糖权,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炸站,已是汗流浹背星澳。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旱易,地道東北人禁偎。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓腿堤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親如暖。 傳聞我的和親對象是個殘疾皇子笆檀,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容