Weex开发初探

1、Weex的由来

WEEX前身

Weex的前身是WeApp,一个用JSON配置原生UI组件来实现动态化的框架,Weex是WeApp的进化版本,加上ex去掉App,就成了现在这个名字。

与Vue.js的关系

如果对前端有所涉猎的同学会发现,Weex的DSL风格与一个前端的MVVM框架Vue.js比较像,那么它们的关系是什么呢?
Weex由多个关键模块组成,分别是DSL transformer、JS Framework、HTML5/iOS/Android Renderer和工具链 , 其中JS Framework就直接使用了部分来自Vue.JS的代码。不过这种使用也是遵守开源协议的(Vue使用MIT协议,Weex使用Apache协议),Weex团队在源码的说明文件中记录了来自Vue.JS和其他开源项目的贡献

2、Weex工作原理

20160521131318618.png

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

Virtual DOM 是一个模拟 DOM 树的 JavaScript 对象。 weex使用 Virtual DOM 来渲染 UI,当组件状态state 有更改的时候,weex会自动调用组件的 render 方法重新渲染整个组件的 UI。
weex主要的目标是提供一套不同的, 高效的方案来更新 DOM.不是通过直接把 DOM 变成可变的数据, 而是通过构建 “Virtual DOM”, 虚拟的 DOM, 随后 weex处理真实的 DOM 上的更新来进行模拟相应的更新。

DOM 树上的节点被称为元素, 而 virtual DOM 是完全不同的抽象, 叫做 components,component 的使用在 weex里极为重要, 因为 components 的存在让计算 DOM diff 更高效。

简单的说就是:

当然如果真的这样大面积的操作 DOM,性能会是一个很大的问题,所以 Weex实现了一个虚拟 DOM,组件 DOM 结构就是映射到这个虚拟 DOM 上,weex在这个虚拟 DOM 上实现了一个 diff 算法,当要更新组件的时候,会通过 diff 寻找到要变更的 DOM 节点,再把这个修改更新到浏览器实际的 DOM 节点上,所以实际上不是真的渲染整个 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实现,提供统一的书写方案,Weex这方面相比之下还是有优势的,RN稍微慢了一步
2.Weex 有 H5 的解决方案,解决了如:分享到外部的问题
3.Weex 目前有效的解决了list比较费内存的情况
4.Weex 的受众更偏向于前端,因为类Vue的型的书写方式,足够简单。RN的解决方案,提供了很多先进的思路,谁能胜出,各家有各家的说法。

3.Weex优势

兼容css和js语法,学习成本低,上手简单。三端公用,可直接对H5页面稍做修改进行使用。支持热更新和降级处理,基于Vue实现了数据的绑定。

4.Weex劣势

并不能兼容所有的css,开发有一定的局限性,设计的时候没考虑cookie,使用cookie的时候会出现问题。基础控件比较少,若想自定义控件需要两端都实现。

4、Weex开发中遇到的问题

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:@"//"]) {
        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开发
如果已经有大量实践Vue,也可以尝试Weex开发
对渲染UI的流畅度有较高的期望又想能支持热更新,也可以尝试Weex开发

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 以前看过很多的文章,讲述怎么做好一个产品经理,如何达成共识,形成互利共赢的局面。而实际中,我们面对的是无尽的推诿、...
    朴老师87阅读 1,018评论 1 6
  • 下班的时候,从囤货的公司柜子里拿了一本“小猪害我打喷嚏”,想着可以回家与萌共读。 回家后,萌看见我高兴得不跟婆出去...
    艳萍和萌宝阅读 250评论 0 0
  • 缺6篇作业,一起写不知道有什么主题,也不想报流水账,于是决定还是写写印象深刻的电影,翻翻里面自己觉得的经典语句镜头...
    ATCATM阅读 513评论 0 0