iOS 開(kāi)發(fā)者的 Weex 偽最佳實(shí)踐指北

引子

這篇文章是筆者近期關(guān)于Weex在iOS端的一些研究和實(shí)踐心得悯蝉,和大家一起分享分享泉粉,也算是對(duì)學(xué)習(xí)成果的總結(jié)嗡靡。文章里面提到的做法也許不是最佳實(shí)踐,也許里面的方法稱不算是一份標(biāo)準(zhǔn)的指南手冊(cè)歉井,所以標(biāo)題就只好叫“偽最佳實(shí)踐指北”了哩至。有更好的方法歡迎大家一起留言討論蜜自,一起學(xué)習(xí)重荠。

由于筆者不太了解Android戈鲁,所以以下的文章不會(huì)涉及到Android。

一. React Native 和 Weex

自從Weex出生的那一天起诈乒,就無(wú)法擺脫和React Native相互比較的命運(yùn)怕磨。React Native宣稱“Learn once, write anywhere”癌压,而Weex宣稱“Write Once, Run Everywhere”荆陆。Weex從出生那天起被啼,就被給予了一統(tǒng)三端的厚望浓体。React Native可以支持iOS、Android娄猫,而Weex可以支持iOS媳溺、Android碍讯、HTML5捉兴。

在Native端倍啥,兩者的最大的區(qū)別可能就是在對(duì)JSBundle是否分包。React Native官方只允許將React Native基礎(chǔ)JS庫(kù)和業(yè)務(wù)JS一起打成一個(gè)JS bundle始藕,沒(méi)有提供分包的功能鳄虱,所以如果想節(jié)約流量就必須制作分包打包工具凭峡。而Weex默認(rèn)打的JS bundle只包含業(yè)務(wù)JS代碼摧冀,體積小很多索昂,基礎(chǔ)JS庫(kù)包含在Weex SDK中椒惨,這一點(diǎn)Weex與Facebook的React Native和微軟的Cordova相比,Weex更加輕量领斥,體積小巧月洛。

在JS端,Weex又被人稱為Vue Native细层,所以 React Native 和 Weex 的區(qū)別就在 React 和 Vue 兩者上了疫赎。

筆者沒(méi)有寫(xiě)過(guò)React Native虚缎,所以也沒(méi)法客觀的去比較兩者实牡。不過(guò)知乎上有一個(gè)關(guān)于Weex 和 React Native很好的對(duì)比文章《weex&React Native對(duì)比》轴合,推薦大家閱讀受葛。

前兩天@Allen 許帥也在Glow 技術(shù)團(tuán)隊(duì)博客上面發(fā)布了一篇《React Native 在 Glow 的實(shí)踐》這篇文章里面也談了很多關(guān)于React Native實(shí)踐相關(guān)的點(diǎn)总滩,也強(qiáng)烈推薦大家去閱讀闰渔。

二. 入門(mén)基礎(chǔ)

關(guān)于小白想入門(mén)Weex冈涧,當(dāng)然最基礎(chǔ)的還是要通讀文檔,文檔是官方最好的學(xué)習(xí)資料营曼。官方的基礎(chǔ)文檔有兩份:

教程文檔
手冊(cè)文檔

在文檔手冊(cè)里面包含了Weex所有目前有的組件蒂阱,模塊蒜危,每個(gè)組件和模塊的用法和屬性。遇到問(wèn)題可以先過(guò)來(lái)翻翻。很有可能有些組件和模塊沒(méi)有那些屬性响委。

1. Weex全家桶和腳手架

看完官方文檔以后赘风,就可以開(kāi)始上手構(gòu)建工程項(xiàng)目了纵刘。

我司在知乎上面寫(xiě)了4篇關(guān)于《Weex入坑指南的》假哎。這四篇文章還是很值得看的舵抹。

Weex也和前端項(xiàng)目一樣惧蛹,擁有它自己的腳手架全家桶。weex-toolkit + weexpack + playground + code snippets + weex-devtool迅腔。

weex-toolkit是用來(lái)初始化項(xiàng)目沧烈,編譯掺出,運(yùn)行汤锨,debug所有工具百框。

weexpack是用來(lái)打包JSBundle的柬泽,實(shí)際也是對(duì)Webpack的封裝。

playground是一個(gè)上架的App露该,這個(gè)可以用來(lái)通過(guò)掃碼實(shí)時(shí)在手機(jī)上顯示出實(shí)際的頁(yè)面解幼。

code snippets這個(gè)是一個(gè)在線的playground撵摆。

我相信大家應(yīng)該都有Native的App特铝,如果真的App都沒(méi)有鲫剿,那就用weexpack命令初始化一個(gè)新的項(xiàng)目牵素。如果已經(jīng)有App項(xiàng)目了澄者,那么weex命令就只是用來(lái)運(yùn)行和調(diào)試的。

已經(jīng)有iOS項(xiàng)目的粱挡,可以通過(guò)cocospod直接安裝Weex的SDK赠幕,初始化SDK以后,Native就可以使用Weex了询筏。加載的JS的地址改成自己公司服務(wù)器的IP榕堰。


#define CURRENT_IP @"your computer device ip"
// ...

// 修改端口號(hào)到你的端口號(hào)
#define DEMO_URL(path) [NSString stringWithFormat:@"http://%@:8080/%s", DEMO_HOST, #path]

// 修改 JS 文件路徑
#define HOME_URL [NSString stringWithFormat:@"http://%@:8080/app.weex.js", DEMO_HOST]


這樣整個(gè)項(xiàng)目就可以跑起來(lái)了。

這里還有一點(diǎn)需要說(shuō)明的是嫌套,項(xiàng)目雖然跑起來(lái)了,但是每次運(yùn)行都需要啟動(dòng)npm踱讨,打開(kāi)Weex的前端環(huán)境魏蔗。這里有兩個(gè)做法。

第一種做法是直接Hook Xcode的run命令痹筛,在Xcode配置里面加入啟動(dòng)npm的腳本莺治。比如下面這樣:

第二種做法就是每次運(yùn)行之前廓鞠,自己手動(dòng)npm run dev。我個(gè)人還是喜歡這種方式谣旁,因?yàn)樵赬code運(yùn)行完成之前床佳,一定可以在命令行上面打完這些命令。

再說(shuō)說(shuō)如何Debug榄审,這塊使用的是weex-devtool砌们。

這個(gè)工具和前端在Chrome里面調(diào)試的體驗(yàn)基本相同。

具體使用方法看這兩篇文章即可瘟判,這里不再贅述:

《Weex 入坑指南:Debug 調(diào)試是一門(mén)手藝活》
《Weex調(diào)試神器——Weex Devtools使用手冊(cè)》

2. Weex Market插件

在日常開(kāi)發(fā)中怨绣,我們可以全部自己開(kāi)發(fā)完所有的Weex界面,當(dāng)然還可以用一些已有的優(yōu)秀的輪子拷获。Weex的所有優(yōu)秀的輪子都在Weex Market里面。

在這個(gè)Market里面有很多已經(jīng)寫(xiě)好的輪子减细,直接拿來(lái)用匆瓜,可以節(jié)約很多時(shí)間。

比如這里很火的weex-chart未蝌。weex-chart圖表插件是通過(guò)g2-mobile依賴gcanvas插件實(shí)現(xiàn)的

如果你想使用Weex Market的Plugin插件驮吱,你可以使用weex plugin 命令:


$ weex plugin add plugin_name

你只需要輸入插件的名稱就可以從遠(yuǎn)程添加插件到你本地的項(xiàng)目,比如添加 weex-chart萧吠,我們可以輸入命令:


$ weex plugin add weex-chart

我們可以使用plugin remove移除插件左冬,比如移除安裝好的 weex-cahrt:


$ weex plugin remove weex-chart


這個(gè)插件庫(kù)里面我用過(guò)weex-router,還不錯(cuò)纸型,用它來(lái)做weex的路由管理拇砰。推薦使用。

3. iOS打包和發(fā)布

weex官方提供了weexpack命令狰腌。我覺(jué)得這個(gè)命令是提供給不懂iOS的前端的人用的除破。如果是Native來(lái)打包,依舊使用的Xcode的Archive打包琼腔。

完全不懂iOS的前端開(kāi)發(fā)者可以使用weexpack build ios 打包瑰枫,中間會(huì)要求輸入證書(shū),開(kāi)發(fā)者賬號(hào)等信息丹莲。都輸入正確以后就可以打出ipa文件了光坝。全程傻瓜操作。如果不清楚的可以查看官方手冊(cè):
weexpack 官方手冊(cè) 《 如何用weexpack創(chuàng)建weex項(xiàng)目并構(gòu)建app 》

如果是iOS開(kāi)發(fā)者甥材,原來(lái)怎么打包現(xiàn)在還是怎么打包盯另。只不多JS這塊要單獨(dú)進(jìn)行打包。建議是把Weex這塊單獨(dú)用一個(gè)git分支進(jìn)行管理擂达,專門(mén)針對(duì)這個(gè)分支進(jìn)行weexpack或者Webpack進(jìn)行打包土铺。webpack的具體配置由每個(gè)公司自己配置胶滋。

這里額外說(shuō)一點(diǎn),這一點(diǎn)也是前端大神告訴我的悲敷。webpack打完包以后是可以通過(guò)webpack官方網(wǎng)站查看這個(gè)包里面究竟打入了哪些文件和依賴究恤。雖然我打包都是一股腦的都打完,但是資深前端開(kāi)發(fā)也許還會(huì)再去檢查一下是否有多的文件被打進(jìn)去了后德。極限壓縮包的體積部宿,1KB的文件也不多放進(jìn)去。

再談?wù)劙l(fā)布的問(wèn)題瓢湃。由于有了Weex以后理张,每次發(fā)布都會(huì)把上個(gè)版本累計(jì)到這個(gè)版本的hotPatch都累計(jì)修復(fù)掉,并在新版里面直接內(nèi)置最新的JSBundle文件绵患。內(nèi)置JS的目的也是為了首屏加載秒開(kāi)雾叭。

4. 熱更新

關(guān)于熱更新的作用大家都明白,不然用Weex的意義就少了好多落蝙。不過(guò)這里還有一點(diǎn)需要說(shuō)明的是——熱更新的策略织狐。

在日常開(kāi)發(fā)過(guò)程中,我們?cè)跒g覽器上面連著手機(jī)調(diào)試筏勒,也并不是實(shí)時(shí)刷新的移迫。(不過(guò)通過(guò)在手機(jī)上掃描二維碼,并且手機(jī)和電腦在同一個(gè)局域網(wǎng)之內(nèi)管行,可以做到實(shí)時(shí)更新)

所以在實(shí)際生產(chǎn)環(huán)境中厨埋,熱更新的策略應(yīng)該是這樣:有新的HotPatch就下發(fā)到客戶端,然后客戶端在下次啟動(dòng)的時(shí)候捐顷,先比對(duì)版本信息荡陷,如果是新版本,就去加載這個(gè)最新的HotPatch套菜,然后渲染在屏幕上亲善。

曾經(jīng)我幻想著能實(shí)時(shí)在線更新,就是線上一發(fā)布逗柴,所有用戶在聯(lián)網(wǎng)的情況下蛹头,下發(fā)HotPatch完畢以后直接加載,聯(lián)網(wǎng)的用戶可以實(shí)現(xiàn)秒級(jí)別的熱更新戏溺。這種雖然可以做到渣蜗,但是意義不大。做法是專門(mén)維護(hù)一套Websocket旷祸,直連服務(wù)器耕拷,下發(fā)完畢以后可以通過(guò)調(diào)用Native的通知,Native客戶端自己刷新頁(yè)面即可托享。(目前應(yīng)該沒(méi)有多少公司是這樣做的吧骚烧?)

5. JSBundle版本管理與部署

關(guān)于JSBundle的版本管理這塊是應(yīng)該交給前端來(lái)管理浸赫。前端可能會(huì)用版本號(hào)來(lái)管理各個(gè)包的版本。部署也會(huì)牽扯到每個(gè)公司前端部署的流程赃绊。他們會(huì)更加了解既峡。部署一般也會(huì)放到CDN上加速。

6. 踩坑和避坑

如果說(shuō)Weex一點(diǎn)坑都沒(méi)有碧查,那是不可能的运敢。

比如說(shuō)在某些界面連續(xù)Push的時(shí)候,頁(yè)面邊緣會(huì)有一些線條從屏幕上掃過(guò)忠售。還有捕捉JS錯(cuò)誤或者異常的時(shí)候传惠,Weex并不能可靠的捕捉到異常,這點(diǎn)需要靠Native來(lái)做稻扬,Native捕捉到異常以后再傳遞事件給JS Runtime去處理卦方。

計(jì)算頁(yè)面寬高尺寸這點(diǎn)是最需要注意的。Weex進(jìn)行界面適配的時(shí)候是用750為標(biāo)準(zhǔn)的泰佳,所以需要根據(jù)750去換算愿汰。還有一點(diǎn)是Weex里面有四舍五入的操作,是會(huì)丟失一點(diǎn)精度的乐纸。具體這塊請(qǐng)看《Weex 事件傳遞的那些事兒》這篇文章里面的源碼分析。

Weex JS 引擎也不支持 HTML DOM APIs 和 HTML5 JS APIs摇予,這包括 document, setTimeout 等汽绢。

Weex關(guān)于Web標(biāo)準(zhǔn)的實(shí)現(xiàn)現(xiàn)在還沒(méi)有達(dá)到100%,所以用Vue來(lái)寫(xiě)Weex的話侧戴,有些是不支持的宁昭。

比如說(shuō)一些CSS樣式,最令人想不到的就是不支持
酗宋,還不支持<form>积仗,<table>,<tr>蜕猫,<td>寂曹,不支持CSS percentage 單位,不支持類似 em回右,rem隆圆,pt 這樣的 CSS 標(biāo)準(zhǔn)中的其他長(zhǎng)度單位。不支持 hsl(), hsla(), currentColor, 8個(gè)字符的十六進(jìn)制顏色翔烁。

Weex對(duì)W3C上的FlexBox的規(guī)范也沒(méi)有支持完全渺氧,暫不支持inline,也不支持Z軸上面的變化蹬屹,不過(guò)移動(dòng)端在Z軸上的需求真的沒(méi)有侣背。Weex的Layout是用的Yoga之前的某個(gè)版本白华,解決問(wèn)題的方式也比較直接,后期升級(jí)到最新版的Yoga贩耐,便可以支持更多的Flex的標(biāo)準(zhǔn)了弧腥。

具體還有不支持的就要多翻翻文檔,比如這里的《Weex 目前不支持的Web 標(biāo)準(zhǔn)有哪些》憔杨。這些最好先看看鸟赫,心里有個(gè)數(shù),以免開(kāi)發(fā)時(shí)候遇到一些莫名的bug消别,殊不知最終是因?yàn)椴恢С謱?dǎo)致的抛蚤。

然后還有一些是組件暫時(shí)還不支持同步方法。這里是Vue 2.0還不支持寻狂,官方預(yù)計(jì)是在 0.12 版本支持岁经。

額外提醒一點(diǎn),由于蘋(píng)果前段時(shí)間對(duì)JSPatch的封殺蛇券,所以導(dǎo)致Weex官方對(duì)自定義模塊給出了一個(gè)警告:

Weex 所有暴露給 JS 的內(nèi)置 module 或 component API 都是安全和可控的缀壤, 它們不會(huì)去訪問(wèn)系統(tǒng)的私有 API ,也不會(huì)去做任何 runtime 上的 hack 更不會(huì)去改變應(yīng)用原有的功能定位纠亚。

如果需要擴(kuò)展自定義的 module 或者 component 塘慕,一定注意不要將 OC 的 runtime 暴露給 JS , 不要將一些諸如 dlopen()蒂胞, dlsym()图呢, respondsToSelector:,performSelector:骗随,method_exchangeImplementations() 的動(dòng)態(tài)和不可控的方法暴露給JS蛤织, 也不要將系統(tǒng)的私有API暴露給JS

上述警告特別強(qiáng)調(diào)了不要用dlopen(), dlsym()鸿染, respondsToSelector:指蚜,performSelector:,method_exchangeImplementations()這幾個(gè)函數(shù)涨椒。這也是為什么同樣是用Weex有些人沒(méi)有通過(guò)審核摊鸡,有些人卻能通過(guò)審核的原因。

聽(tīng)說(shuō)安卓上有Refresh Control的一些bug丢烘,安卓在Weex上的表現(xiàn)我沒(méi)有怎么了解過(guò)柱宦,不過(guò)這塊如果出現(xiàn)在iOS上,我覺(jué)得可以直接用Native來(lái)替換掉這塊播瞳,有bug的地方都用原生來(lái)做掸刊。

總之Weex還是多多少少有一些問(wèn)題,但是目前使用來(lái)看赢乓,不影響使用忧侧,只要懂得靈活變通石窑,遇到實(shí)在過(guò)不去的坎,或者是真的一時(shí)hold不住的bug蚓炬,那么多考慮用原生來(lái)替代松逊。

三. 更多高級(jí)的玩法

接下來(lái)說(shuō)一下稍微高級(jí)的玩法。以下這些即使沒(méi)有做肯夏,也不影響Weex正常上線经宏。

1.頁(yè)面降級(jí)

Weex默認(rèn)是支持頁(yè)面降級(jí)的。比如出現(xiàn)了錯(cuò)誤驯击,就會(huì)降級(jí)到H5烁兰。這里建議最好做一個(gè)線上的開(kāi)關(guān)。我司在處理頁(yè)面降級(jí)的問(wèn)題上采取了兩種級(jí)別的開(kāi)關(guān):

  1. App級(jí)的開(kāi)關(guān)徊都。這個(gè)開(kāi)關(guān)是管理用戶App是否使用Weex SDK的沪斟,這塊是可以在線配置的。
  2. 頁(yè)面級(jí)的開(kāi)關(guān)暇矫。這個(gè)開(kāi)關(guān)是管理某個(gè)頁(yè)面是否開(kāi)啟Weex的主之。如果不開(kāi)啟就降級(jí)成H5頁(yè)面。

除了降級(jí)以后李根,還對(duì)應(yīng)采取了灰度的策略槽奕,這樣保證線上bug降低到最低。

比如在用戶量低峰期的時(shí)候開(kāi)啟開(kāi)關(guān)進(jìn)行灰度房轿。還有一級(jí)灰度就通過(guò)線上實(shí)時(shí)錯(cuò)誤監(jiān)控平臺(tái)來(lái)控制史翘,如果因?yàn)橥话l(fā)事件導(dǎo)致Crash率陡升,那么就立即關(guān)閉Weex的開(kāi)關(guān)冀续,立即進(jìn)行降級(jí)處理。

2. 性能監(jiān)控和埋點(diǎn)

在Weex給的官方Demo里面有一個(gè)M的小圓點(diǎn)浮框必峰,點(diǎn)開(kāi)會(huì)看到如下的界面:

在這里我們點(diǎn)開(kāi)性能的按鈕:

在這里我們可以看到監(jiān)控了CPU洪唐,幀率,內(nèi)存吼蚁,電量凭需,流量等數(shù)據(jù),這些數(shù)據(jù)也是我們?cè)贜ative APM中監(jiān)控的常見(jiàn)數(shù)據(jù)肝匆。當(dāng)然粒蜈,這個(gè)M圓點(diǎn)并不沒(méi)有開(kāi)源。所以這塊需要各個(gè)公司自己做一套自己的監(jiān)控系統(tǒng)旗国。這塊可能每個(gè)公司的前端已經(jīng)做好了枯怖,所以Weex需要接入到前端的性能監(jiān)控里。

如果我們?cè)冱c(diǎn)開(kāi)工具的界面能曾,就會(huì)看到如下的選項(xiàng):

這里就有埋點(diǎn)監(jiān)控度硝。在初期可能Weex埋點(diǎn)還是由Native進(jìn)行埋點(diǎn)肿轨,因?yàn)楦骷叶加凶约业腘ative完整的埋點(diǎn)系統(tǒng)了。后期埋點(diǎn)這塊也可以交給前端在前端埋點(diǎn)蕊程。

3. 增量更新和全量更新

暫時(shí)筆者還沒(méi)有實(shí)踐過(guò)Weex的增量更新椒袍,所以這里就不提增量更新了。全量更新就比較簡(jiǎn)單藻茂,下發(fā)整個(gè)JSBundle驹暑,App在下次啟動(dòng)的時(shí)候再加載即可。Weex的包比RN的包小很多辨赐,一般就100-200K左右优俘。阿里的一次Weex分享里面提到他們gzip壓縮以后能達(dá)到60-80K。

4. 首屏加載時(shí)間極致優(yōu)化

上圖是阿里在Weex Conf大會(huì)上提出的一個(gè)挑戰(zhàn)肖油,網(wǎng)絡(luò)請(qǐng)求加上首屏渲染的時(shí)間加起來(lái)小于1秒兼吓。

這里面涉及到3方面的因素,網(wǎng)絡(luò)下載耗時(shí)森枪,JS和Native通信耗時(shí)视搏,還有渲染耗時(shí)。

網(wǎng)絡(luò)下載耗時(shí)可以通過(guò)支持HTTP / 2县袱,配置Spdy協(xié)議浑娜,域名收斂,支持http-cache式散,極致壓縮JSBundle的大小筋遭,JSBundle預(yù)加載。

JSBundle預(yù)加載的時(shí)候可以在App啟動(dòng)時(shí)候預(yù)先下載JS暴拄。遠(yuǎn)程服務(wù)器推包的時(shí)候通過(guò)長(zhǎng)連通道Push漓滔,這里可以是全量 / 增量,被動(dòng) / 強(qiáng)制更新相互結(jié)合乖篷。

阿里關(guān)于JS和Native通信耗時(shí)响驴,渲染耗時(shí)的相關(guān)優(yōu)化見(jiàn)上圖。這兩方面筆者也沒(méi)有相關(guān)的實(shí)踐撕蔼。

5. Vue全家桶

雖然Weex有屬于它自己的全家桶豁鲤,但是在支持了Vue 2.0以后,它的全家桶完全可以換成Vue的全家桶鲸沮。Vue琳骡,Vue-Router,Vuex讼溺,原來(lái)還有Vue-resource楣号,不過(guò)尤大后來(lái)去掉了這個(gè)Vue-resource,更加推薦axios了。所以全家桶里面就是Vue竖席,Vue-Router耘纱,Vuex,axios毕荐。

如果全部都換成了Vue以后束析,那么前端首屏渲染的速度就需要Vue來(lái)解決了。為了提高首屏渲染速度憎亚,wns緩存+直出 是必不可少的员寇。在Vue 1. x 時(shí)代,沒(méi)有 server-side-render 方案第美,直出需要專門(mén)給寫(xiě)一份首屏非Vue語(yǔ)法的模板蝶锋。Vue2.0 server-side-render(簡(jiǎn)稱Vue SSR)的推出,成功地讓前后端渲染模板代碼同構(gòu)什往。

如果只用了Vue-Router以后扳缕,當(dāng)打包構(gòu)建應(yīng)用時(shí),JSBundle 包會(huì)變得非常大别威,影響頁(yè)面加載躯舔。如果我們能把不同路由對(duì)應(yīng)的組件分割成不同的代碼塊,然后當(dāng)路由被訪問(wèn)的時(shí)候才加載對(duì)應(yīng)組件省古,這樣就更加高效了粥庄。
結(jié)合 Vue 的 異步組件 和 Webpack 的 code splitting feature, 輕松實(shí)現(xiàn)路由組件的懶加載。減少JSBundle的體積豺妓。

還有一點(diǎn)需要注意的是惜互,Vue-Router 提供了三種運(yùn)行模式:
hash : 使用 URL hash 值來(lái)作路由。默認(rèn)模式琳拭。
history : 依賴 HTML5 History API 和服務(wù)器配置训堆。
abstract: 支持所有 JavaScript 運(yùn)行環(huán)境,如 Node.js 服務(wù)器端白嘁。

不過(guò)Weex 環(huán)境中只支持使用 abstract 模式蔫慧!

就在7天前,Vue 發(fā)布了v2.3.0版本权薯,官方支持了SSR。所以在支持了SSR以后睡扬,可以大幅提升SEO盟蚣,也可以做到首屏秒開(kāi)。所以為了性能卖怜,SSR必做屎开!

四. 頂級(jí)玩法

最后的最后,還有一些“前瞻性”的玩法马靠。

1. 強(qiáng)大的JSService

JS service 和 Weex 實(shí)例在 JS runtime 中并行運(yùn)行奄抽。Weex 實(shí)例的生命周期可調(diào)用 JS Service 生命周期蔼两。目前提供創(chuàng)建、刷新逞度、銷毀生命周期额划。

這塊我在官方的Demo里面也沒(méi)有找到相關(guān)的例子。在官方的文檔里面有相關(guān)的例子档泽。在官方手冊(cè)里面有這樣一句話:

重要提醒: JS Service 非常強(qiáng)大但也很危險(xiǎn)俊戳,請(qǐng)小心使用!

可見(jiàn)馆匿,這塊非常強(qiáng)大抑胎,也許可以做很多“神奇的”事情。

2. Weex可能有更大的“野心”

在官方手冊(cè)《拓展JS framework》這一章節(jié)里面渐北,提到了可以橫向拓展JS framework阿逃。這個(gè)功能可能一般公司都不會(huì)去擴(kuò)展。

Weex 希望能夠尊重盡可能多的開(kāi)發(fā)者的使用習(xí)慣赃蛛,所以除了 Weex 官方支持的 Vue 2.0 之外恃锉,開(kāi)發(fā)者還可以定制并橫向擴(kuò)展自己的或自己喜歡的 JS Framework。

定制完自己的JS Framework以后焊虏,就可能出現(xiàn)下面的代碼:


import * as Vue from '...'  
import * as React from '...'  
import * as Angular from '...'  
export default { Vue, React, Angular };


這樣還可以橫向擴(kuò)展支持Vue淡喜,React,Angular诵闭。

如果在 JS Bundle 在文件開(kāi)頭帶有如下格式的注釋:


// { "framework": "Vue" }
...

這樣 Weex JS 引擎就會(huì)識(shí)別出這個(gè) JS bundle 需要用 Vue 框架來(lái)解析炼团。并分發(fā)給 Vue 框架處理。

所以疏尿,Weex 支持同時(shí)多種框架在一個(gè)移動(dòng)應(yīng)用中共存并各自解析基于不同框架的 JS bundle瘟芝。

可以支持多種框架并存這點(diǎn)非常強(qiáng)大,當(dāng)然還沒(méi)有完褥琐,one more thing……

如果正常使用API锌俱,看官方文檔,不開(kāi)源碼敌呈,是不會(huì)發(fā)現(xiàn)Rax的身影的贸宏。官方文檔絲毫沒(méi)有提及到它。

Rax是什么呢磕洪?

《淘寶雙促中的 Rax》這篇文章里面介紹了Rax:

Rax 是一個(gè)基于 React 方式的跨容器的 JS 框架吭练。

Rax 經(jīng)過(guò) gzip 以后的大小 8k,與 Angular析显、React鲫咽、Vue 相比更加輕量。相比React的43.7kb,小了太多分尸。

Rax 在設(shè)計(jì)上抽象出 Driver 的概念锦聊,用來(lái)支持在不同容器中渲染,比如目前所支持的:Web, Weex, Node.js 都是基于 Driver 的概念箩绍,未來(lái)即使出現(xiàn)更多的容器(如 VR 孔庭,AR等),Rax 也可以從容應(yīng)對(duì)伶选。Rax 在設(shè)計(jì)上盡量抹平各個(gè)端的差異性史飞,這也使得開(kāi)發(fā)者在差異性和兼容性方面再也不需要投入太多精力了。

如果說(shuō)RN和Weex這些技術(shù)是用來(lái)跨端的技術(shù)仰税,那Rax是用來(lái)跨容器的:Browser构资、Weex、Node.js等陨簇。

那么Weex里面加了Rax能干些什么事情呢吐绵?值得期待!

GitHub Repo:Halfrost-Field

Follow: halfrost · GitHub

Source: https://halfrost.com/weex_best_practice_guidelines/


Weex 源碼解析系列文章:

Weex 是如何在 iOS 客戶端上跑起來(lái)的
由 FlexBox 算法強(qiáng)力驅(qū)動(dòng)的 Weex 布局引擎
Weex 事件傳遞的那些事兒
Weex 中別具匠心的 JS Framework
iOS 開(kāi)發(fā)者的 Weex 偽最佳實(shí)踐指北


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末河绽,一起剝皮案震驚了整個(gè)濱河市己单,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耙饰,老刑警劉巖纹笼,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異苟跪,居然都是意外死亡廷痘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)件已,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)笋额,“玉大人,你說(shuō)我怎么就攤上這事篷扩⌒中桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵鉴未,是天一觀的道長(zhǎng)枢冤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)铜秆,這世上最難降的妖魔是什么淹真? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮羽峰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己梅屉,他們只是感情好值纱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著坯汤,像睡著了一般虐唠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惰聂,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天疆偿,我揣著相機(jī)與錄音,去河邊找鬼搓幌。 笑死杆故,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溉愁。 我是一名探鬼主播处铛,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拐揭!你這毒婦竟也來(lái)了撤蟆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤堂污,失蹤者是張志新(化名)和其女友劉穎家肯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體盟猖,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讨衣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扒披。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片值依。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碟案,靈堂內(nèi)的尸體忽然破棺而出愿险,到底是詐尸還是另有隱情,我是刑警寧澤价说,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布辆亏,位于F島的核電站,受9級(jí)特大地震影響鳖目,放射性物質(zhì)發(fā)生泄漏扮叨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一领迈、第九天 我趴在偏房一處隱蔽的房頂上張望彻磁。 院中可真熱鬧碍沐,春花似錦、人聲如沸衷蜓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)磁浇。三九已至斋陪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間置吓,已是汗流浹背无虚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衍锚,地道東北人友题。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像构拳,于是被迫代替她去往敵國(guó)和親咆爽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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