侑夕 阿里巴巴高级前端工程师
本文是 2018 年 Weex Conf 中议题 Weex + Ui 的内容文档整理, 主要给大家介绍飞猪 Weex 技术体系从无到有的过程, 包括 Weex Ui 组件库的开发和发展, 重点分享在 Weex Ui 层建设的一些经验
文章较长, 首先放上 Weex Ui 的开源地址, 欢迎大家提 PR, 同时也可以通过 Star 来表示你的喜欢 (https://github.com/alibaba/weex-ui)
- Why Weex ?
- Weex vs H5
我们为什么选择 Weex 作为我们首要的跨端开发技术呢?
写过 H5 的同学肯定会被它的简单高效发布即更新一条 URL 可适配多端等这些快所吸引, 但写过 Native 的同学肯定也会被 Native 的富交互性能体验可调用原生能力可管理内存等特性给我们的业务带来更好的体验
快和体验想同时兼得
飞猪前几年也一直在这个方向上面探索
包括最开始的 Hybrid 开发, 通过 Bridge 提供部分 Native 能来提升 H5 体验, 譬如我们在 H5 里面可以直接获取 App 的定位信息使用相机播放视频导航跳转等能力, 业界也有 CordovaIonicMeteor 这些成熟的方案
还有利用离线包体系通过提前将资源件下载, 访问时路由拦截加载本地资源, 让我们的 H5 页面可以达到秒出动态更新弱网可用效果, 内部有手淘 Zcache 飞猪信鸽支付宝九州这些成熟的系统
等到了 16 年左右, 跨平台开发技术逐渐火起来后, 一种全新的开发思路吸引这我们, 也即用 JS 来写 Native, web 的开发体验构建性能可扩展的 Native 应, 同时真正获取上述所说的快和体验
业务对比分析
那么为什么会选择 Weex 呢? 其实和飞猪业务特点很有关系, 同时又可以很好解决这些痛点
飞猪业务迭代速度快, 也需要快速上线; 同时很多时候景点和海外弱网使用, 同时要体验良好;
其中最重要的一点是多容器接入, 适配飞猪手淘天猫支付宝, 也即我们一次重要业务的开发需要一个 iOS 一个 Android 同学来开发两端, 同时由一个 H5 同学来开发兼容手淘支付宝 UC 的 Web 版本, 也即一次业务发布涉及到多端同时开发上线
Weex 其实很好的解决了上述的一些问题, 包括在飞猪手淘天猫 Weex 环境下完全 Native 体验, 同时 Bundle 资源大小较 H5 小很多, 加上富交互体验长列表性能好非常适合商品列表页面和双十一场景, 最重要的是真正让我们从 3 个人的开发减少到了 1 个人, 其他 2 个人可以去做更多有意义的事情
接下来我们可以从下面这个展示来看 Weex 和 H5 业务的一个展示数据对比:
这是一个业务逻辑复杂的页面, 包括筛选排序日历选择收藏长列表业务逻辑也很复杂的页面, 重构成 Weex 以后, 我们首屏可用时间降级 68%Bundle 大小直接减少了 73%, 由于体验变好变快让我们页面转化率居然提升了 14.5%
以上也就是我们为什么选择 Weex 作为我们跨端开发的一些重要原因, 接下来介绍的是飞猪的 weex 技术体系
飞猪 Weex 技术体系
架构图
可以从底层一直往上看, 底层由我们 APP 的 Framework / Libraries / OS Kernel 等组成, 我们在 Weex 的上下层和手淘天猫一起设计出一套统一的 Api 设计, 包括接口请求数据埋点路由跳转网络状态支付功能导航栏定制等这一系列的通用服务, 在 Weex 上面我们封装了 Weex Ui 组件库业务组件库 UPX 搭建营销模块还有抹平多端差异的 Util 函数库, 这样在我们上层可以长出我们众多的业务
由于 Weex 在我们这边和 H5 一样, 都是当做页面来发布而不是一个 View 里面写很多子 View 来组织, 同时也很不建议大家使用 vue-router 来管理, 更多的使用多页面来跳转体验会更好
说到构建发布流程, 我们统一通过 Clam 来对我们项目进行初始化构建 debug 预发发布等工作, 同时在上线方面直接通过 Awpp 命令来直接发布页面到 CND, 同时可以通过信鸽将离线资源推送到 APP, 运营同学也可以直接通过搭建的方式将页面发布出去
Weex 页面如何在飞猪手淘支付宝进行多端投放 ?
那你可能会问 Weex 页面如何在飞猪手淘支付宝进行多端投放呢 ?
第一种为通过前端 URL 参数决定渲染为 Weex 还是 H5
xxxx.html ? _wx_tpl = xxxx.js
: 前面为降级时的 H5 地址, 后面 _wx_tpl 带的参数代表 Weex JS 地址, 当容器发现 URL 带有 _wx_tpl 参数时, 会下载后面的 JS 地址然后用 Weex 容器渲染
第二种为通过服务端返回内容决定渲染为 Weex 还是 H5
xxxx?wh_weex=true: 前面可以是 JS 地址也可以是 H5 地址, 后面是固定的参数 wh_weex=true, 当容器发现 URL 带有 wh_weex=true 时, 会请求前面的 xxxx 地址, 如果发现响应的 mime type(HTTP header content-type) 为
application / javascript
, 则使用 Weex 渲染返回的内容, 否则使用 WebView 渲染成 H5
飞猪 Weex 业务大盘
Weex 并不是像外界某些人传言说没有什么公司在使用 Weex 的, 反而是超过你的想象, 以上是我们这边 17 年 12 月份前的一个相关 weex 页面的一览, 大家可以在飞猪手淘支付宝里面找到这些页面, 均是一份页面同时投放到多端的
什么业务适合用 Weex ?
包括众多的营销业务首页频道搜索列表正向流程简单详情富交互页面都是很适合使用 Weex 来开发的, 同时在我们这边也有一个对应的原则包括 展示类项目优先使用 Weex 重构 / 新项目优先使用 Weex 深度垂直类目尝试使用 Weex
Weex 不适合复杂场景 ?
大家可以看下如下这几个场景的视频演示:
大家可能会觉得 Weex 不适合复杂的场景, 其实也不一定, 通过很多方式是可以做到复杂场景的支持, 包括双 11 超长列表滚动, 30 多屏数据, 快速滚动很顺滑
同时包括逻辑异常复杂多组件的国际机票列表页, Weex 同样也可以胜任; 包括图 3 富交互的使用场景, 粘手效果的丝滑拖动, 快速滑动, 动态隐藏头部等等功能都是可以做到的
通过在我们这边很多业务场景的使用 Weex 踩坑 最佳实践的积累, 其实有很多东西可以沉淀下来 通过封装的方式给后续其他业务使用, 这样让后面的业务可以达到快速生产, 这也是我们建议 Weex Ui 组件体系一个很大的原因
Weex Ui 的发展和开源 \
为什么要建立 Weex Ui 组件库体系 ?
在引入 Weex 初期, 通过 Weex Ui 让未接触 Weex 的同学对其编写有借鉴作用
提炼业务中的公共组件, 便于直接引用, 提高大家开发效率
业务规范视觉规范最佳实践的及时同步
将 Weex 业务中的疑难杂症通过组件封装, 对外只暴露简单逻辑
Weex Ui 一览
经过一年多的建设, 我们一步一步将 Weex Ui 优化, 整理, 最终于 20170930 进行了开源, 通过下图可以看到 Weex Ui 是怎么来的.
目前 Weex Ui 组件库包括 7 大类 31 个成熟的组件, 同时并不是直接开源给大家使用, 而是在内部已经使用了 1 年多后稳定后开源给大家使用, 大家可以通过手淘飞猪任何浏览器扫码进行预览.
同时一个开源库的文档其实是后续发展中用户是否能快速上手的一个很大因素, Weex UI
包括组件说明使用规则 Demo 展示详细使用 API 升级文档等等, 可以让你快速使用
Weex Ui 是不是只适合电商体系呢?
近期我们队 Weex Ui 的使用者做过一次问卷调查, 结果让我们很惊喜, 并不是只有电商在使用, 还很很多其他的体系在使用, 包括工具类企业应用文娱自媒体新闻这些其实都是有使用的
组件化搭建你的 Weex 页面
很多时候基础建设, 其实为了给业务开发来加速, 譬如接下来这个飞猪专线的页面就是通过我们的 Weex Ui 组件库来搭建起来的
然而基础组件只能够解决通用组件的问题, 其实还包括业务组件这一块, 也即上图中的 your-item 组件, 也即我们下面要说的 Weex 业务组件化.
除了基础库, 在 Weex Ui 层还可以做什么
Weex 业务组件化
业务组件库更多是前端后端设计师之间的一个约定, 通过一定规范共同让业务组件变得可复用
也即 Weex 代码中直接引入此组件, 直接插入后端返回的原始数据, 就可以生成设计师所设计出的商品卡片, 最终可以做到支撑任意 Weex 业务模块 投放到 任意 Weex 页面 中 任意位置 的能力
那么应该怎么做呢?
可以自动化测试 Weex 吗 ?
答案是可以的, 之前通过 macacajs 测试框架和 Weex 结合来弄, 通过自定义一连串的手势事件, 最后通过用 json 来表明执行的顺序, 可以做到:
1 安装 app
2 自动打开 native 页面
3 登录, 自动输入
4 自动测试飞猪度假首页, 包括点击跳转滑动下拉刷新等操作
5 自动测试飞猪专线包括左滑右滑操作
6 自动测试 Weex Ui, 包括打开组件点击交互逻辑
7 自动各个页面运行截图, 并将测试情况邮件给测试方
Weex 无障碍优化
Weex 其实也是支持无障碍的, 也即让盲人在最短的时间内通过最快的方式找到自己想要的信息
同时当盲人访问我们 Weex 页面时候, 让他们对 Weex 是可感知的可操作的可理解的同时页面也是鲁棒的
无障碍在 Weex 实现起来是很简单的, 譬如如下实现:
飞猪 Weex 双十一性能优化
每年的双十一也就是我们 Weex 的一个战场, 几乎所有会场页面均由 Weex 实现, 如何让用户丝滑的逛我们的页面呢? 期间我们也将之前很多经验包括优化技巧放到了双十一的会场页面, 包括一些经验的整理
回到开源
其实 Weex 可以在很多很多地方使用, 包括各种应用场景, 这也是我们开源 Weex Ui 的一个很大原因, 给大家更多 Weex 可实现功能的输入, 最佳实践实现的参考
同时外部开发者也急需要一套成熟组件库来提高开发效率 https://github.com/alibaba/weex-ui
从 2017 年 9 月 30 号开始, 我们一直在弄 Weex Ui 的开源发展, 包括共建 weex-toolkit 让其更好支持 Weex Ui 欠缺组件的补全 + 现有组件的增强继续扩展边界 + 轻舟解决方案 UI 库引入更多富交互体验 + 组件的无障碍优化简易的使用方式 + 详细的中英文档等等工作
其实更多的是想大家一起参与进来, 共同促进我们 Weex 的发展, 说到共同促进, 那么你可以做什么呢? 其实可以做很多很多事情:
晚上圆桌会议 - Weex 组件方向讨论总结
1. Weex 原生组件的封装应该注意什么?
通用性, 只有多个业务同时在使用, 同时具备可抽离性特性的组件, 譬如 Video/TabBar/TitleBar/ImageUpload 这些在 Native 中成熟的组件
稳定性, Native 组件不像 weex 上层的组件可调节性大, 所以需要注意好 Native 组件一定需要没有 Bug, 防止修复和更新麻烦, 同时 Native 组件一开始应该将大部分情况做成可配置化, 防止频繁更新, 导致需要适配很多版本
原子性, 不建议一个组件同时做很多事情, 应该是单一的功能, 然后通过搭配的方式来得到更多功能
2.weex 组件开发和实践过程中的一些经验?
811 原则, 默认 80% 的功能应该是不需要用户配置很多参数, 10% 的地方用户可以通过配置一些参数来达到目的, 10% 的稀有情况可以暂时不考虑, 可能这里会花费很多时间开发, 所以可以等到有业务需要使用时候, 再更新上去
统一收口原则, 为了避免后续组件变成一个大杂烩, 后续迭代视觉交互新功能的增加需要将通用性考虑进去, 这里需要一个人统一来收口开发维护此组件, 可以避免很多业务特性来干扰组件的可用性
性能体验的优化, Weex 组件比页面的编写更应该保证他的性能体验
信任机制: 很多时候别人使用你的组件一个很大原因是由于相信你的组件没有问题, 是稳定的, 同时后续会常常维护的
3. 大家认为 Weex Ui 组件还缺少什么?
缺少一些汇集起来使用的场景, 目前单个组件的使用文档已经详细说明, 但是对于多个组件的一些使用, 或者页面层面的开发缺少相关案例, 后期需要逐步补上 weex-ui-demo
主题配置灵活性上需要考虑进行, 目前更多是通过参数配置的方式来更改主题颜色, 其实是可以通过一个统一外部参数的配置来使它修改
4. 未来跨端开发会是怎么样的?
Native 的布局方式需要向 H5 的开发灵活性学习, 逐步使用自动布局来实现, 同时引入弹性思路开发, 避免绝对计算
数据绑定方面会越来越便捷, 譬如和 MVVM 思路一样, 数据变化后, 视图立马修改, 而不是手动去触发
来源: https://yq.aliyun.com/articles/444282