Weex開發(fā)初探

1短蜕、Weex的由來

WEEX前身

Weex的前身是WeApp,一個用JSON配置原生UI組件來實現動態(tài)化的框架鹏溯,Weex是WeApp的進化版本捏萍,加上ex去掉App太抓,就成了現在這個名字。

與Vue.js的關系

如果對前端有所涉獵的同學會發(fā)現令杈,Weex的DSL風格與一個前端的MVVM框架Vue.js比較像走敌,那么它們的關系是什么呢?
Weex由多個關鍵模塊組成逗噩,分別是DSL transformer掉丽、JS Framework、HTML5/iOS/Android Renderer和工具鏈 异雁, 其中JS Framework就直接使用了部分來自Vue.JS的代碼捶障。不過這種使用也是遵守開源協(xié)議的(Vue使用MIT協(xié)議,Weex使用Apache協(xié)議)纲刀,Weex團隊在源碼的說明文件中記錄了來自Vue.JS和其他開源項目的貢獻

2项炼、Weex工作原理

20160521131318618.png

1、DSL : weex文件示绊;
2锭部、Virtual DOM (提升性能) :

Virtual DOM 是一個模擬 DOM 樹的 JavaScript 對象。 weex使用 Virtual DOM 來渲染 UI面褐,當組件狀態(tài)state 有更改的時候拌禾,weex會自動調用組件的 render 方法重新渲染整個組件的 UI。
weex主要的目標是提供一套不同的, 高效的方案來更新 DOM.不是通過直接把 DOM 變成可變的數據, 而是通過構建 “Virtual DOM”, 虛擬的 DOM, 隨后 weex處理真實的 DOM 上的更新來進行模擬相應的更新展哭。

DOM 樹上的節(jié)點被稱為元素, 而 virtual DOM 是完全不同的抽象, 叫做 components湃窍,component 的使用在 weex里極為重要, 因為 components 的存在讓計算 DOM diff 更高效闻蛀。

簡單的說就是:

當然如果真的這樣大面積的操作 DOM,性能會是一個很大的問題您市,所以 Weex實現了一個虛擬 DOM循榆,組件 DOM 結構就是映射到這個虛擬 DOM 上,weex在這個虛擬 DOM 上實現了一個 diff 算法墨坚,當要更新組件的時候,會通過 diff 尋找到要變更的 DOM 節(jié)點映挂,再把這個修改更新到瀏覽器實際的 DOM 節(jié)點上泽篮,所以實際上不是真的渲染整個 DOM 樹。這個虛擬 DOM 是一個純粹的 JS 數據結構柑船,所以性能會比原生 DOM 快很多帽撑。

3榛斯、Android RenderEngine 將輸入Virtual DOM 轉換成輸出的android原聲控件旱幼;

20160521131253962.png

1、后臺部署時會將weex文件轉換為JSbundle坐桩,大家完全不必擔心這部分的時間逆巍,因為在后臺已經轉換完成及塘;
2、Native 渲染和 JavaScript 引擎之間的邊界放在了 Virtual DOM锐极,兩者通過約定 Virtual DOM 來進行通信笙僚,而不是 template + data 或是別的邊界,確保渲染性能和靈活度的平衡灵再;

3肋层、Weex和native,H5翎迁,RN的對比

3389046F-9160-4D0D-908F-DA50A62A55CB.png

1.Weex和H5對比


加載時間.png
資源消耗.png

2.Weex和RN對比

1.目前來說RN也在融合Android和iOS實現栋猖,提供統(tǒng)一的書寫方案,Weex這方面相比之下還是有優(yōu)勢的汪榔,RN稍微慢了一步
2.Weex 有 H5 的解決方案蒲拉,解決了如:分享到外部的問題
3.Weex 目前有效的解決了list比較費內存的情況
4.Weex 的受眾更偏向于前端,因為類Vue的型的書寫方式揍异,足夠簡單全陨。RN的解決方案,提供了很多先進的思路衷掷,誰能勝出辱姨,各家有各家的說法。

3.Weex優(yōu)勢

兼容css和js語法戚嗅,學習成本低雨涛,上手簡單枢舶。三端公用,可直接對H5頁面稍做修改進行使用替久。支持熱更新和降級處理凉泄,基于Vue實現了數據的綁定。

4.Weex劣勢

并不能兼容所有的css蚯根,開發(fā)有一定的局限性后众,設計的時候沒考慮cookie,使用cookie的時候會出現問題颅拦〉儆基礎控件比較少,若想自定義控件需要兩端都實現距帅。

4右锨、Weex開發(fā)中遇到的問題

1.使用本地圖片
<image class = "setBtn" src= 'xcassets:my_setting'/>

- (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)userInfo completed:(void(^)(UIImage *image,  NSError *error, BOOL finished))completedBlock
{
    if ([url hasPrefix:@"http://"]) {
        url = [@"http:" stringByAppendingString:url];
    }
    if ([url hasPrefix:@"xcassets:"]) {
        UIImage *image = [UIImage imageNamed:[url substringFromIndex:9]];
        completedBlock(image, nil, YES);
        
        return [WXXCassetsLoaderOperation new];
    }
   
    return (id<WXImageOperationProtocol>)[[SDWebImageManager sharedManager] loadImageWithURL:[NSURL URLWithString:url] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
        
    } completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
        if (completedBlock) {
            completedBlock(image, error, finished);
        }
    }];
}

2.list中cell的margin無效

    <cell class="Mine_fotter">
        <div class="Mine_fotter_div">
                <image class="fotter_btn_icon" src="xcassets:my_kefu"/>
                <text class="fotter_btn_name">我的客服</text>
        </div>
    </cell>

將cell的最外層嵌套一個div,對div進行margin操作

3.Weex和Native的交互

#pragma mark - 初始化weex配置
- (void)resignWeex{
    
    [WXAppConfiguration setAppGroup:@"AliApp"];
    [WXAppConfiguration setAppName:@"Weex_haojie"];
    [WXAppConfiguration setAppVersion:@"1.1.0"];
    
    [WXSDKEngine initSDKEnvironment];
    
    [WXSDKEngine registerModule:@"callNative" withClass:[WXCustomEventModule class]];
    
    [WXSDKEngine registerHandler:[WXImgLoaderDefaultImpl new] withProtocol:@protocol(WXImgLoaderProtocol)];
    
#ifdef DEBUG
    [WXLog setLogLevel:WXLogLevelLog];
#endif
    
}

將WXCustomEventModule注冊為callNative

WX_EXPORT_METHOD(@selector(pushNativeVC::))
/**
 跳到原生頁面

 @param name 跳轉的原生類名
 @param params 參數
 */
- (void)pushNativeVC:(NSString *)name :(id)params{
    
    [self pushToViewController:@"JRSettingController" :params];
}

實現并注冊方法pushNativeVC::

//注冊
const app = weex.requireModule('callNative');
//調用
app.pushNativeVC(methodName);

4.元素的顯示隱藏

        <div class="bottomAlert" v-if="isHaojie">
            <text class = 'bottomAlertTitle'>{{bottomAlertMsg}}</text>
        </div>

因為weex沒有兼容v-show和display:none的屬性,所以要實現元素的顯示隱藏要使用v-if,其值為bool值

5.類選擇器

      <div v-for="item in topArray" :class="[loginState?'TopLoginItem':'TopItem']" @click="jump(item.url)">
          <image class="topitemIcon" :src="item.icon" />
          <text class="topitemTitle">{{item.title}}</text>
      </div>

和vue語法不同碌秸,其格式為:class="[loginState?'TopLoginItem':'TopItem']"

6.視圖的生命周期 willAppear绍移,willDisAppear

//js代碼
<div class="body" @viewappear="onViewappear">
</div>
//ios代碼
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self updateInstanceState:WeexInstanceAppear];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [self updateInstanceState:WeexInstanceDisappear];
}

- (void)updateInstanceState:(WXState)state
{
    if (_instance && _instance.state != state) {
        _instance.state = state;
        
        if (state == WeexInstanceAppear) {
            [[WXSDKManager bridgeMgr] fireEvent:_instance.instanceId ref:WX_SDK_ROOT_REF type:@"viewappear" params:nil domChanges:nil];
        }
        else if (state == WeexInstanceDisappear) {
            [[WXSDKManager bridgeMgr] fireEvent:_instance.instanceId ref:WX_SDK_ROOT_REF type:@"viewdisappear" params:nil domChanges:nil];
        }
    }
}

5、總結

如果考慮三端讥电,可以嘗試Weex開發(fā)
如果已經有大量實踐Vue蹂窖,也可以嘗試Weex開發(fā)
對渲染UI的流暢度有較高的期望又想能支持熱更新,也可以嘗試Weex開發(fā)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末恩敌,一起剝皮案震驚了整個濱河市恼策,隨后出現的幾起案子,更是在濱河造成了極大的恐慌潮剪,老刑警劉巖涣楷,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異抗碰,居然都是意外死亡狮斗,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門弧蝇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碳褒,“玉大人,你說我怎么就攤上這事看疗∩尘” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵两芳,是天一觀的道長摔寨。 經常有香客問我,道長怖辆,這世上最難降的妖魔是什么是复? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任删顶,我火速辦了婚禮,結果婚禮上淑廊,老公的妹妹穿的比我還像新娘逗余。我一直安慰自己,他們只是感情好季惩,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布录粱。 她就那樣靜靜地躺著,像睡著了一般画拾。 火紅的嫁衣襯著肌膚如雪关摇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天碾阁,我揣著相機與錄音,去河邊找鬼些楣。 笑死脂凶,一個胖子當著我的面吹牛,可吹牛的內容都是我干的愁茁。 我是一名探鬼主播蚕钦,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鹅很!你這毒婦竟也來了嘶居?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤促煮,失蹤者是張志新(化名)和其女友劉穎邮屁,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體菠齿,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡佑吝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了绳匀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芋忿。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疾棵,靈堂內的尸體忽然破棺而出戈钢,到底是詐尸還是另有隱情,我是刑警寧澤是尔,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布殉了,位于F島的核電站,受9級特大地震影響拟枚,放射性物質發(fā)生泄漏宣渗。R本人自食惡果不足惜抖所,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痕囱。 院中可真熱鬧田轧,春花似錦、人聲如沸鞍恢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帮掉。三九已至弦悉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟆炊,已是汗流浹背稽莉。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涩搓,地道東北人污秆。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像昧甘,于是被迫代替她去往敵國和親良拼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容

  • 以前看過很多的文章充边,講述怎么做好一個產品經理庸推,如何達成共識,形成互利共贏的局面浇冰。而實際中贬媒,我們面對的是無盡的推諉、...
    樸老師87閱讀 1,021評論 1 6
  • 下班的時候肘习,從囤貨的公司柜子里拿了一本“小豬害我打噴嚏”掖蛤,想著可以回家與萌共讀。 回家后井厌,萌看見我高興得不跟婆出去...
    艷萍和萌寶閱讀 252評論 0 0
  • 缺6篇作業(yè)蚓庭,一起寫不知道有什么主題,也不想報流水賬仅仆,于是決定還是寫寫印象深刻的電影器赞,翻翻里面自己覺得的經典語句鏡頭...
    ATCATM閱讀 516評論 0 0