weex初體驗(yàn)

一劫瞳、什么是 weex

Weex 是阿里巴巴開(kāi)源的一套構(gòu)建高性能索绪、可擴(kuò)展的原生應(yīng)用跨平臺(tái)開(kāi)發(fā)方案斤贰。首先總結(jié)一下 weex 的特點(diǎn):

  1. 頁(yè)面的開(kāi)發(fā)目前支持Rax和Vue

    Weex 也不是只支持 Vue 和 Rax佑淀,你也可以把自己喜歡的前端框架集成到 Weex 中耗拓,有一個(gè)文檔擴(kuò)展前端框架描述了如何實(shí)現(xiàn)拇颅,但是這個(gè)過(guò)程仍然非常復(fù)雜和棘手,你需要了解關(guān)于 js-native 之間通信和原生渲染引擎的許多底層細(xì)節(jié)乔询。

  2. 一次編寫(xiě)樟插,三端(Android、iOS竿刁、前端)運(yùn)行

前提是都集成了 weex sdk黄锤,另外視覺(jué)表現(xiàn)做不到完全一樣,有的會(huì)有一些差異食拜,需要做一下適配鸵熟。所以寫(xiě) weex 頁(yè)面的時(shí)候,如果支持三端负甸,便需要在三端都進(jìn)行自測(cè)流强。

  1. UI 的繪制通過(guò) native 的組件痹届,JavaScript 邏輯在 JS 引擎里運(yùn)行,兩者通過(guò) JavaScriptCore 通信

    weex 里使用組件都需要在 native 端注冊(cè)打月,這樣 weex 里才可以使用队腐,運(yùn)行的時(shí)候通過(guò)注冊(cè)時(shí)記錄的 map 進(jìn)行查找。weex sdk 內(nèi)置注冊(cè)了一些基礎(chǔ)的組件奏篙,包括 list柴淘、text、input 等报破。WXJSCoreBridge 封裝了 JavaScriptCore 實(shí)現(xiàn) native 和 js 之間的通信悠就。

  2. 支持 Native 擴(kuò)展

    可以將 native 的 UI 組件封裝成 component,將 native 的邏輯代碼封裝成 module充易。從而在 weex 里可以進(jìn)行使用梗脾。這里的 natiev UI 組件包括 modal、webview盹靴、image 等炸茧,這里的 native 邏輯代碼包括 storage、network 等稿静。

  3. 每個(gè) weex 頁(yè)面會(huì)被打包成一個(gè) js 文件梭冠,weex sdk 將 js 文件渲染成一個(gè) view

    weex 的打包通過(guò) webpack,將每個(gè)頁(yè)面打包成獨(dú)立的一個(gè) js 文件改备,weex sdk 會(huì)將 js 進(jìn)行解析控漠,將 UI 部分繪制成一個(gè) view, 再綁定 view 的事件與 js 代碼綁定。

二悬钳、為什么要使用weex進(jìn)行無(wú)線開(kāi)發(fā)

  1. 效率問(wèn)題

    1)開(kāi)發(fā)的人力成本

    如果不算 web 端盐捷,一個(gè)頁(yè)面本來(lái)需要 Android 和 iOS 2 個(gè)人開(kāi)發(fā);使用 weex 后只需要 1 個(gè)開(kāi)發(fā)頁(yè)面默勾。

    2)開(kāi)發(fā)的編譯速度

    隨著項(xiàng)目漸漸變得龐大碉渡,Android 項(xiàng)目一次編譯需要 2-3 分鐘,機(jī)器不好的還需要 10 分鐘母剥,iOS 可能會(huì)快一點(diǎn)滞诺,也需要 1-2 分鐘。使用 weex 后环疼,界面修改习霹,只需要十幾秒。

    3)測(cè)試效率

    提測(cè)之后炫隶,發(fā)現(xiàn) bug淋叶,修復(fù)完成,測(cè)試總需要重新下載一個(gè)包進(jìn)行安裝等限;使用 weex 后爸吮,跟原生無(wú)關(guān)的 bug,只要測(cè)試重啟 App 就可以進(jìn)行驗(yàn)證望门。

  2. 動(dòng)態(tài)化

    weex 頁(yè)面最后打包完是一個(gè) js 文件形娇,只要能做到動(dòng)態(tài)下發(fā) JavaScript,那便可以實(shí)現(xiàn)動(dòng)態(tài)化筹误,可以熱修復(fù)桐早,甚至可以熱部署,完全替換或者新增頁(yè)面厨剪。

  3. 成熟度

    在 2016 年阿里雙十一中哄酝,Weex 在阿里雙十一會(huì)場(chǎng)中的覆蓋率接近 99%,頁(yè)面數(shù)量接近 2000祷膳,覆蓋了包括主會(huì)場(chǎng)陶衅、分會(huì)場(chǎng)、分分會(huì)場(chǎng)直晨、人群會(huì)場(chǎng)在內(nèi)幾乎所有的阿里雙十一會(huì)場(chǎng)業(yè)務(wù)搀军。阿里雙十一主會(huì)場(chǎng)秒開(kāi)率97%,全部會(huì)場(chǎng)頁(yè)面達(dá)到 93%勇皇。 2016 年 12 月 15 日罩句,阿里巴巴宣布將移動(dòng)開(kāi)源項(xiàng)目 Weex 捐贈(zèng)給 Apache 基金會(huì)開(kāi)始孵化。
    2017 年敛摘,weex 在阿里業(yè)務(wù)里增長(zhǎng)如下圖门烂,來(lái)自 WeexConf 2018。


    avatar

三兄淫、Weex的工作原理

483534391-5722ddf9bbf7d_articlex.jpg
  1. 打包

熟悉 React Native 的人都知道屯远, React Native 的發(fā)布實(shí)際上就是發(fā)布一個(gè) JSBundle,Weex 也是這樣拖叙,但不同的是氓润,Weex 將工程進(jìn)行分包,發(fā)布多個(gè) JSBundle薯鳍。因?yàn)?Weex 是單頁(yè)獨(dú)立開(kāi)發(fā)的咖气,每個(gè)頁(yè)面都將通過(guò) Weex 打包器將 vue/we 頁(yè)面打包成一個(gè)單獨(dú)的 JSBundle,這樣的好處在于減少單個(gè) bundle 包的大小挖滤,使其變的足夠小巧輕量崩溪,提高增量更新的效率。

# 僅打包
$ npm run build
 打包+構(gòu)建
$ weex build ios
# 打包+構(gòu)建+安裝執(zhí)行
$ weex run ios

以上三種均會(huì)觸發(fā) Weex 對(duì)工程進(jìn)行打包斩松。
在我們執(zhí)行了以上打包命令后伶唯,所有的工程文件將被單獨(dú)打成一個(gè)獨(dú)立的 JSBundle,如下:

1494908-9e44c2ec85dfbf56.png

打包后的 JSBundle 有兩種格式

# 由.vue文件打包出來(lái)的包格式(簡(jiǎn)寫(xiě))惧盹,使用 vue 2.0 語(yǔ)法編寫(xiě)
// { "framework": "Vue"} 
/******/ (function(modules) { 
       .......
/******/ })

# 由.we文件打包出來(lái)的包格式(簡(jiǎn)寫(xiě))乳幸,使用 weex 語(yǔ)法編寫(xiě)
// { "framework": "Weex" }
/******/ (function(modules) { 
        .......
/******/ })

不同的頭部是要告訴使用什么語(yǔ)法解析此JSBundle瞪讼。

至此,我們準(zhǔn)備「熱更新的包」就已經(jīng)準(zhǔn)備完畢了粹断,接下就是發(fā)包執(zhí)行了符欠。

  1. 發(fā)包

打包后的 JSBundle 一般發(fā)布到發(fā)包服務(wù)器上,客戶端從服務(wù)器更新包后即可在下次啟動(dòng)執(zhí)行新的版本瓶埋,而無(wú)需重新下載 app希柿,因?yàn)檫\(yùn)行依賴的 WeexSDK 已經(jīng)存在于客戶端了,除非新包依賴于新的 SDK养筒,這也是熱更新的基本原理曾撤。

【W(wǎng)eexSDK】包括

 >【JS Framework】JSBundle 的執(zhí)行環(huán)境
 
 >【JS-Native Bridge】中間件或者叫通訊橋梁,也叫【W(wǎng)eex Runtime】
 
 >【Native Render Engine】解析 js 端發(fā)出的指令做原生控件布局渲染
  1. 執(zhí)行

    Weex 的 iOS 和 Android 客戶端的【JSFramework】中都會(huì)運(yùn)行一個(gè) JavaScript 引擎晕粪,來(lái)執(zhí)行 JS bundle挤悉,同時(shí)向各端的渲染層發(fā)送規(guī)范化的指令,調(diào)度客戶端的渲染和其它各種能力兵多。iOS 下選擇了 JavaScriptCore 內(nèi)核尖啡,而在 Android 下選擇了 UC 提供的 v8 內(nèi)核(RN兩端都是JavaScriptCore 內(nèi)核)。

    JSBundle 被 push 到客戶端后就會(huì)在 JSFramework 中執(zhí)行剩膘,最終輸出三端可讀性的 VNode 節(jié)點(diǎn)衅斩,數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)化如下:

{
tag: 'div',
data: {
 staticStyle: { justifyContent: 'center' }
},
children: [{
 tag: 'text',
 data: {
   staticClass: 'txt'
 },
 context: {
   $options: {
     style: {
       freestyle: {
         textAlign: 'center',
         fontSize: 200
       }
     }
   }
 },
 children: [{
   tag: '',
   text: '文字'
 }]
}]
} 

有了統(tǒng)一的 VNode 節(jié)點(diǎn),各端即可根據(jù)自己的方法解析渲染原生UI了怠褐,之前的所有操作都是一致的畏梆,包括文件格式、打包編譯過(guò)程奈懒、模板指令奠涌、組件的生命周期、數(shù)據(jù)綁定等磷杏。

然而由于目標(biāo)執(zhí)行環(huán)境不同(瀏覽器和 Weex 容器)溜畅,在渲染真實(shí)原生 UI 的時(shí)候調(diào)用的接口也不同。

1494908-1a151022056cbade.png

此過(guò)程發(fā)生在【W(wǎng)eex SDK】的【W(wǎng)eex Runtime】中极祸。

最后【W(wǎng)eex Runtime】發(fā)起渲染指令callNative({...})有RenderEngine完成渲染

總結(jié)一下

  • Weex 文件分包打包成單個(gè) JSBundle 文件
  • 發(fā)布到發(fā)包服務(wù)器上慈格,通過(guò)熱更新 push 到用戶的客戶端,交由【W(wǎng)eex SDK】執(zhí)行解析
  • SDK 中的【JS Framework】執(zhí)行 Bundle 腳本生成 Virtual DOM
  • Virtual DOM 經(jīng)由各端執(zhí)行環(huán)境【W(wǎng)eex Runtime】解析翻譯成執(zhí)行指令
  • 【Native RenderEngine】接收到指令后執(zhí)行渲染操作遥金,作出渲染出完整的界面

四浴捆、基本開(kāi)發(fā)

預(yù)備知識(shí)點(diǎn)

入門(mén) Weex 前需要了解以下知識(shí),這樣能幫助你更快的掌握

Node:《Node.js 教程》

Vue:《Vue.js官方教程》

ES6:《ECMAScript 6 入門(mén)》

再者就是 ios 和 android 開(kāi)發(fā)語(yǔ)法的入門(mén)和編輯器的使用

安裝開(kāi)發(fā)環(huán)境

1.安裝Node

https://nodejs.org/en/download/

查看node版本

node -v

查看npm版本

npm -v

2.安裝weex-toolkit

npm install weex-toolkit -g

查看weex版本

weex -v

3.創(chuàng)建項(xiàng)目

weex create (項(xiàng)目名稱)

4.進(jìn)入項(xiàng)目稿械,安裝依賴选泻,預(yù)覽

cd 項(xiàng)目路徑
npm install
npm start

5.編譯和運(yùn)行

weex platform add ios
weex platform add android
weex run ios
weex run android
weex run web

6.調(diào)試

weex debug

參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子页眯,更是在濱河造成了極大的恐慌梯捕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窝撵,死亡現(xiàn)場(chǎng)離奇詭異科阎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)忿族,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝌矛,“玉大人道批,你說(shuō)我怎么就攤上這事∪肴觯” “怎么了隆豹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)茅逮。 經(jīng)常有香客問(wèn)我璃赡,道長(zhǎng),這世上最難降的妖魔是什么献雅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任碉考,我火速辦了婚禮,結(jié)果婚禮上挺身,老公的妹妹穿的比我還像新娘侯谁。我一直安慰自己,他們只是感情好章钾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布墙贱。 她就那樣靜靜地躺著,像睡著了一般贱傀。 火紅的嫁衣襯著肌膚如雪惨撇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天府寒,我揣著相機(jī)與錄音魁衙,去河邊找鬼。 笑死椰棘,一個(gè)胖子當(dāng)著我的面吹牛纺棺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邪狞,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼祷蝌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了帆卓?” 一聲冷哼從身側(cè)響起巨朦,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤米丘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后糊啡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拄查,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年棚蓄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堕扶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梭依,死狀恐怖稍算,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情役拴,我是刑警寧澤糊探,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站河闰,受9級(jí)特大地震影響科平,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姜性,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一瞪慧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧部念,春花似錦汞贸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至射赛,卻和暖如春多柑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背楣责。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工竣灌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秆麸。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓初嘹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親沮趣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屯烦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345