又是一年四月天,距离上次发布跨端开发框架深度横评已过去整整一年。
这一年,小程序在用户规模及商业化方面都取得了极大的成功。微信小程序日活超过3w Q X T Q亿,支付宝、百度、字节跳动小程序的月活也纷纷超过3亿。
对应小程序开发领域,这一年也发生了巨大变化。开发框架从单纯的微信小程序开发,过渡到多端框架成为标配,进一步提升开发效率成为开发者的强烈需求9 d f / k。
这一年 mpvue 停止更新,Taro开始探索 taro next,u) , F uni-app 产品和生态持续完善. @ 9 q R,微信新推出了r ! k s ^ ( h V支持H5和微信小程序的 kbone 框架...
去年的深度横评中很多老将已经退出江湖,一些新秀吸引眼球,因此,是时候来一波2020版的新横评了。
评测目标筛选T X g _ O j o e A
跨端框架是一个重投入工作,在各框架的1年多的比拼中w + b ? ~ K V R I,很多框架因为投入不足而逐渐被开发者+ O f ^ 6 (放弃,unU E (i-appv v g g { h E和taro依靠持续的大力度投入,成为了市场主流。
taro 在稳定版的基础之. } K u W G Y上,最近也推出了 taro next,这2个版本差异较大,本次会分别评测。
kbone 框架虽面^ t } 4 e世不久,但毕竟是微信官方S L V q ] N b l }发布,关注的人不少,故本次将 kbone 加入评测目标。
所以,本次评测的对象(按发布时间排序):
- 微K K W信原生开发
- taro,京东凹凸实验室出品,官网地址:p 7 f d | m e b lhttps://ta8 9 k m d ^ T R }ro.jd.com/
- uni-app,DCloudz ( 2 8 q T 3 a L出品,官网地址:https://uniapp.dcloud.net.cn
- kbone,腾讯微信团队出品,官网地址:https://wechat-min_ T 7 T ] G x #iprogram.github.io/ _ 7 v ; . ykbone/docs/
本次评测除了运行性能等实测数据外,尽可能t ; ^ V得通过框架官网及github、掘金、腾讯课堂等三方社区公开采集数据,希望给大家一个综合全面的评估依据。
功能实现
taro 和] @ k M D [ Q O E uni-a~ 7 V 7 kpp 是比较典型的多端框架,发布+ G 7到各个端均可。而 kbone 只支持微信小程序和H5。
taro 和 uni-app 均将常用接口及组件封装了成了跨端A1 ! S &PI和跨端组件,组件规范沿用微信小程序的规范,部分平台特有API,这两个框架亦有应对方案:
- tau * x % W y 7ro:支持与小程序代码混写,可通过混写的方式调用框架尚未封装的小程序新增API
- uni-app:支持条件编译,可在条件编译代码块中,随意调用各个平台新增的API及组件
taroa a S N y 和 ub t F S (ni-app 可以不受限的调用各家小程序平台所有的API及组件。
kbone 沿用web的开发习惯,使用html( Q e ; [ O n标签及js api;涉及微信特有api时,可通过process.env.isMiniprogram判断环境,然后编写微信原生代码。对于html中没有标签可替代的微信内置组件(如swiper),需要使C Z ]用 wx-component 标签或k R i Q者使用 wx- 前缀,这G 8 s b S 4 x样的内置组件会被包裹一层自定义组件,带来相应的性能开销。
除了接口、组件之外,我们以微信小程序为例,找几个典型能力对比框架支持度:
补充说明:
- 如果在 TarG = io 项目引用了小程序D w A B &原生的第三l $ } v t & X方组件,那么该项目将不再具备多端转换的能力,例如,如果使用了微信小程序的第三方组件,n O @ * j x那么项目只能转换成微信小程序,转义成其他平台会失效,详见taro官V J _ a ` Q F f ,网
- uni-app 中使用微信自定义组件的话,支持编译发行到App/H5/微信小L F Q % L程序/QQ小程序4个平台,详见uni-app官网
- taror L o | 不支持 wxs 的依据:#2c 0 ~ k 8 p959
- kbone 不支持微信三方插件的依据:#58;不支持wxs的依据* ? k:#129
- 云开发在微信平台,三个框架都支持,但 taro/kb; A W sone仅支持微信小程序平台,uni-app支持App/H5/小程序所有平台使用云开发,详见下 4 E y @ )方 serverless/云开发 章节。
w/ u R Ixs是提升性能体验的重要利器,除了微信小程序的wxs外,还有支付宝的SJS、百度的Filter,这些高级技术 uni-app 均完善支持。参考:谜之wF t 6 *xs,uni-app如z @ Y ! u何用它大幅提升性能
从如上功能对比来看:微信原生 ~ uni-app > taro > kbone
运行性能
我们继i 4 ` 1 5 ( q + }续沿用去年的测试模型,看看一年来,各家小程序开发框架W R A #的性能是否有提升。详细如下:
- 开发内容:开发一个仿微博小程序首页的复杂长列表` ~ w V,支持下拉刷新、上拉翻页、点赞L : x S。
- 界面如下:
- 开发版本:一共开发了5个版本,包括微信原生版、taro版、uni-app版、kbone版,按照官网指引通过cli方式默认安装。
- taro 目前稳定版本是2.0版,但近期在宣传跨框架的taro next,故我们基于同样的 react代码,同时测试了taro 2.0 和 taro next 两个版本的数据。 c t _ R
- 测试代码开源(Github仓库地址:https://gi6 = j ` f 9 %thub.com/dcloudio/test-framework), Tips:若有同学觉得测试代码写法欠妥,欢迎提交 PR 或 Issus
- 测试机型:红米 Redmi 6 Pro、J P l ~MIUI 11.0.5 稳定版F f ( A(最新s B - J Z版)、微信版本 7.0.12(最新版)
- 测试环境:每个框架开始测试前,杀掉各App进程、清空内存,保证测试机环J H x % W !境基本一致;每次从本地读取静态数据,屏蔽网络差异。
我们以0 / J 3上述仿微博小程序为例,测试2个容易出性能问题的点:Z c v a ) y w z长列表加载、大量点赞组件的响应。
1.2.1 长列/ 9 : = J v o l表加载
仿微博的列表是一个包含很多组件的列表,这种复杂列表对性能的压力更大,很适合做性能测试。
从触发上拉加载到数据更新、页面渲染完成,* ! u @ 9 % ` 9 5需要准] s J ; P确计时。人眼视觉计时肯定不行,我们采用程序埋点的方式,制定了如下计时时机n 4 r ! 8 B V n:
- 计时开始时机:交互事件触发,框架赋值之前,如:上拉加载(onReachBottom)函数开头
- 计时结束时机:页面渲染完毕(微信setData回调函数开头)
Tips:setData回调函数开头可认为是页面渲染完成的时间,是因为微信setData定义如下(微信规范):
测试方式:从页面空列表开始,通过程序自+ e , ; %动触发上拉加载,每次新增20条列表,记录单次耗时;固定间隔连续触发 N 次上拉加载,使得页面达到@ R w } 20*N 条列表,计算这 N 次触发上拉到渲染8 + 0 ] D m p _完成的平均耗时。
测试结果如下:
说明:以400条微博列表为例,从页面空列表开始,每隔1秒触发一次上拉加载(新增20条微博),记录单次耗时,触发20次后停止(页面达到400条微博),计算这20次的平均耗时,结果微信原生在这20次 触发上拉 -> 渲染完成 的平均耗时为538毫秒,最D W K | W快的uni-app是446毫秒,最慢的kbone是4057毫秒
大家初看这个数据,可能比较疑惑,别急,下方有详细说明
说明1:为何 taro ne1 W b Vxt/kbone 测试数据x t n i H不完整?
因为 taro next 和kbone 采用的是动态渲染方案,这类方案在页面复杂、组件较多时,会大量增加页面 dom 节点数量,甚至超出微信的 dom 节点数限制(如下告警信息)。我h 5 L 2 ? # J们在 红米手机(Redmi 6 Pro)上实测,页面组件超过600个时,taro next、kv # L G e m | N 8bone 实现的仿微博App就会报出运行异常,并停止渲染(页面白屏)N . J w,故这两个测试框架在组件S . ~ C较多时,测试数据不完整。这也就意M k I味着,当页面v Q x 6组件太多时,无法使用这R J v ? #2个框架。
dom limit exceeded please check if theF y = a 7 P cre\'s any mistake you: k 0 k f b ] ;\'ve made
另外,kbone官网有如下介绍:
kbone 是使用一定h 6 } S n的性能损耗来换取更为全h # + 4 {面的 Web 端特性支持。
故taro next& l X K B u T . W、kbone的测试数据,明显和taro 2.0、uni-app不是一个量级的。
如果你的应用是长列表场景,那taro next、kbone就明显不太合适。
说明2:为什么测试数据显示uni-app 会比微信原生框架Z / * L的性能略好呢?
这个问题在去年的测评中,已解释过。为了避免新同学迷惑,这里再次说明一下。
微信原生框架耗时主要在setData调Y C d ) : y用上,开发者若不单独优化,则每次都会传递大量数据;而 uni-app、taro 都在调用setData之前自动做diff计算,每次仅传递变动的数据。
例如当前页面有20条数据,触发上拉加载时,会新加载20条数据,此时a V p _ : 2 = b (原生框架通过如下代码测试时,setData会传输40条数据
data: { listData: []},onReachBottom() { /Y c l + o A y/上拉加载 let listData = this.data.listData; listData.push(...Api.getNews());//新增数据 this.setData({ listData }) //全量数据,发送数据到视图层}
开发者使用微信原生框架,完全m # i $ b ) I可以自己优化,精简传递数据(每次仅传递变化的20条数据),比如修改如下:
data: { listData: []},onReachBottom() { //上拉加载 // 通过长度获取下一次渲染的索引M k Z F j k 6 3 let index = this.dj H * n 9 s : ` @ata.listData.length; let newData = {};f @ 5 R X //新变更数据 Api.getNews().forEach((item) =>v c M 0 6 M % K; {  k a d }; newData[\'listData[\' + (index++) + ~ 5 0 R\']\'] = item //赋值,索引递增 }) this= D V F.setData(newData) //增量数据,发送数据到视图层}
经过如上优化修改后,再次测试,微信原生框架性能数据如下:
从测试W m I ~ # * D结% W p果可看出:
- 经过开发者手动优化,微信原生框架可达到更好的性能;
- uni-app相比微信原生,性能接近,算是一个数量级;并且随着数据量增加,性能消耗增加不明显,从438到454,3 @ T D L O a _ q只有16毫秒的变化5 t )
- tar{ } y @ co 2.0随着数据f , q 5 S R F量越大,性能损耗随着增大,从595到790,有将近200毫秒c R 7 z的变化;
- taro next和kbone相比之下,差距就比较大了。_ r r P
这个结果,和web开发类似,web开发也有原生js开发、vue、react框架等情况。如果不X 1 } E a T o Q做特殊优* 2 |化,原生js写的网页,性能经常还不如vue、react框架的性能。
也恰恰是因为Vue、react框架的优秀,性能好,开发体验好,所以原生js开发已经逐渐减少使用了。
说明4 x & I +3:为何今年的性能测试数据和去年的不同?; , D { B f
细心的同学会发现,同样的测试手机,同D 5 W样的测试代码,为何今年的性能数据会比去年的数据有大幅提升?
- taro、uni-app及微信原生,三个框架的数据都有大幅提升,400条记录时,至少都有300毫秒的优化
- uni-app及优化后的微信原生,随着数据量的增加,耗时数据变化并不明显,但去年是很明显的线性增长
其实,通过微信原生工程的数据对比,就能得出结论:2019年,微信针对小程序运行时r { 5 Z | T做了大幅性能优化。
这对开发者来A y P j F g 1说应该是个好g T | _ = w F 6消息,C P V小程序性能体验更佳,可承载更好的用户业务。
复杂长列表加载下一页评测结论:微信原生开发(手动优化) ~ uni-app > 微信原生开发(未手动优化) ~ taro 2.0 > taro next > kbone
1.2.2 点赞组件响应速度R ; ) e D
长列表中的某个组件,比如点赞组件,点击时是否能及时的修改未赞和已赞状态?是这项测试的评测点。
测试方式:
- 选中某微博,点击“点赞”按钮,实现点赞状态状态切换(已赞高亮、未赞灰色),
- 点赞按钮 onclick函数开头开始计时,setData回2 3 l 0 * v U L e调函数开u a & q S头结束计时;
在红米手机(Redmi 6 Pro)上进行多次测试,求其平均值,结果如下:
说F Y 1 , &明:也就是在列表数量为400时,微信原生开发的应用,点赞按钮从点击到D 7 ) j E m m状态变化需要26毫秒。
测试结果数据说明C A u ] e p:
- taro next/kbone 测试数据不完整的原因同上,在组件较多时,页面已经不再渲染了
- taro 2.0版本、uni-app和微信原生在点赞组件上的性能体验接近,但taro next和kbone有较, } & r大的性能差距,这个也是因为动态运行时框架导致的。
组件数据更新性能测评:uni-app ~ taro 2.l ; + l j s0 >$ : - c; taro next > kbone
综上,本性能测试做了2个测试,长列表加载和组件状态更新,综合2个实验,结论如下:
微信原生开发(手动优化) ~ uni-app- ; 1 ` 1 f ) p | &c - | B o 5 }gt;r ] X A P : 微信原生开发(未手动优化) ~ taro 2T - H # . b.0 > taro next- D d q B - B , > kbone
跨端支持
这三个框架都是为I x L q了解决平台k v K f a C T同构问题,跨端的比较是必需的。
taro 和 uni-app 相对比较成熟,支持主流的所有平台。kbone 只支持微信小程序和 Web 端。我们重| { t L s _ ] q点比较一下 taro 和 uni-app。
小- g O d B K程序平台
taro 和 uni-app 均支持w 4 a ^微信、8 e a F _支付宝、百度、字节跳动小程序,功能基本可以: O i L u拉齐。
双方都有不少大厂案例,taro有京东、货拉拉、淘票票等公司小程序案例,uni-app有腾讯、华为、vivo、e N y f `联想、中华英才网等公司小程序案{ F T v例。
App平台
- 能力方面
taro与微信小程序引擎拉齐度较低,很多功能需要开发者分别在iOS和And? U Lroid上做原生开发才能实现。比如App端很常见的三方登录、支付、分享等能力,taro并未封装。
uni-app则在基础引擎层面提供了丰富的能力,还提供了丰富的插件市场,可切实提升开发者的效率。
- 性能方面
tu ! = t = z 3 z daro在App端使用了react native的渲染引擎,虽然渲染层ui是原生的,但在实时交互和高响应要w 9 { g {求M ~ Q的q R yUI操作方面表现c B k一直不佳,js层和视图层的通信损耗让很多开发者深感无力。
uni-app的App引擎同时给开发者提供了原生渲染引擎和小程序引擎的双选方1 x J h P K .案,并且由于发明了renderjs技术,以及支持wxsJ p l * G、bindingx等技术,解决了js层和视图层的通信损耗问题,在高响应要求的UI操作方面有更好的性能表现。比如这类canvas动画:
- 开发体验方面
taro的开发者需自行搭建iOS/Android开发环境,比较繁琐) m = K,(官方原文地址):
uni-app可以做到让前端开发者不依赖原生工程师独立完成App。其开发的小程序,可以更平滑的变成可商用的e O g z 9App。
使用跨平台开发的核心诉求在于提升效率, I v M _如果一个App的开发由前端、iOS、Android等3拨工程师协作完成,其实效率反而非常低。
另外,uni-app还提供了uni小程序sdk,这个工; G ~ & 6 # 0 + K具可以帮助原生App快速搭建自己的小程序平台。这是其他框架所未提供的。
H5平台
taro的H5平台在一年来的进步较多,可用性大幅提升。但相比于uni-app,目前仍然缺失对wxs和小程序组件的支持。
快应b N A用
taro支持快应用的时间比uni-app早。
但快应用发展到2020年有了一些变化,uni, 3 Z W-app针对新的形势,提供了2个发行到快应用的方案(当前] F s v | Y两个版本都处于社区维护状态):
- quickapp-vue版:使用 Vue开发快应用。此方案由小米主导,但华为快应用暂不支持。
- quickapp-light版:基于小程序架构的快应用(Light版),详见https://} q * twww.hellohub.cn。此方案由华为主导,但小米快应用暂不支持。
跨端灵活性
跨端开发,离不开m I n条件编译。因为不能用统一来抹杀各个平台的特色。
优良的条件编译能力H ( u o L O ( } &对各e 5 U 7 9 Q z C S端开发的灵活度至关重要,可以让开发者在共享和个性化之间游刃有余。
taro 、uniN 9 h = @ j g Y s-{ s H , jappp Y o和 kbone 均支持在z : y F s ijs代码通过process.env判断平台,然后编写平台特有代码。
taro额外支持统一接口的多端文件编码方E H ] [ l M式,以及在样式文件中使用ifdef条件编译。
uni-app是全面可条件编译的,目录、文件、配置、组件、js- I h } k Z、css,所有一切均可通过ifdef条件编译。
跨端支持小结结论:uni-app > taro >J 4 H C ^ f D [; kbone
开发体验
taro、uni-app、kbone均支持cli模& 1 , U式,可以在主流前端工具中开发,且基本都带7 # i | c有d.ts的语法提示库。三个框架均支持主流的vue或react语法,配套的ide工具链较丰富,着色、校验、格式化完善。
相比微信原生,这三个开发框架的开发体验都更为优秀。
但在开发工具维度上,明显高出一截的框架是uni-app,其出品公司同时也是HBuilderX的出品公司DCloud.ij ; - r i 4 (o,HBuilderX为uni-app做了很多优化,代码提示、转到定义、easycom、运行调试...故uni-app的开发效率、易用性非其他框架可及。
开发体验维度,对比结果:uni-app > tar1 8 ^ ` zo,kbonc L &e
seE K ~ Jrverless/云开发
serverless是目前炙手可热的一个概念,被称为下一代的云技术,是真正的”云“。
微信率先将 serverless 技术引入小程序开发领域,即云开发,帮助开发者云端一体的完成业务。随后,支付宝、百度都上线了自己的云开发。根据微信公开的数据,已经有50万开发者在使用微信云开发了。
不过小程序厂家主导的云开发B L G存在一个天然限制,就是和平台绑定过紧,无法和其它平台共享数据。
我们以微信云开发为例,如果你仅开发微信小程序,数据独家存在微信平台,那没问题;但如果你同时还有App或其他家小程序,此时微信小程序的数据存储在微信平台,其它平台的数G ] H o据存储在开发者自己的服务器上,此时就出现了数据割裂。假设一个用户先使用小程序,个人数据存储在微信平台;有了粘性后升级到App,g v @ i % & g此时App端无法读取微信平台的数据,则用户就无法查看之前在小程序上的历史数据,甚至在App平台需要重新注册。m 3 K i这种情况对开发者是不利的。
因此,跨端的 serverless 方案才是开发者的最优解。
目前主流框架对云开发的支持情) z P D T况:
- Taro:仅支持微信小程序,详见小程序云u D R 5 ` v B开发模板
- uni-app:DCloud 联合阿里云、腾讯云,提供基于 serverless 模式和 js 编程的云开发平台,支持App/H5/小程序所有平台,详见uniCloud
- kbone:仅支持微信小程序,详见云开发
serverless 维度上,uni-app大P k E A ?幅领先其它框架W @ { E 3 f 5。
插件市场J 7 ~ q h N
一个开发框架A $ = - p能否成功,除了框架自身的高度产品化外,开发者生态的构建也至关重要。
uni-app 于2018年底率先推: 3 Y B - Z q O出插件市场,支持前端组件、js sdk、页面模板、项目模板、w _ . ( ( c 1原生插件等多种类型,且提供了赞赏、付费购买等手段,刺) ) n ] - U E 9激轮子作者的创作激情。目前市场上已发布插P z E { ( . 2件接近1500个,众多插件下载量都在万次以上。
TaQ A Q @ g e N 5ro 于 2019年5月上线物料市场,目前市场上已发布物料90个;从热门榜单] 9 @ 2 /来看,下载量并不大,E m A s ( s n下载最多的也就数百。
kbone目前k [ ] i c { f还没有插件市场。
Tips:
- 插件数量及下载量数据采集时间3 j ] ^ { f $ M为 2020.04.03 16:00
插件市场维度,uni-app独领风骚。
学习资源
除了各大框架官网外,开发者通常还{ q j @ [会通过视频教程、社区博客等方式系统学习。
相关学习资源的丰富程度,也能侧面反映一个框架的受欢迎程度,故我们采d H $ ;集了几个三方I @ 0 P站点的数据。
视频教程
TipsJ E ? + 1 ? h 2:
- 视频教程数据采集时间为2020.04.05 22:00
开发交流
除了入门的学习资源,开发期的交流3 J Q @ d也很重要,这个我们主要看官方组织的社区和交流群。
社区论坛
uni-app 的问答社区,帖子丰富,沉淀较多;目前已沉淀2O h K . 1 C万多相关帖子,每日更新n u Z 5 K / n 帖子数百篇,月uv百万。
对C l j u = W于习惯使用 github issue反馈问题的用户,uni-app同样支持,目前累计有1391个issues。
Taro 早期基于githu` c Y e a M d - Xb issue进行产品Bug管理,目前累计已有近4898个issue;后于2019年5月上线开发p X H C m Y Q X h者社区[ t m ; = Y x l |,和物料市场上线时间相_ : ! ` R同,目前沉淀1300+帖子,每日更新帖子在10个左右,相关数据计算方法如下:
- 帖子总数:Taro 社区顶部选择板块,计算每个板块下所有主题总数,如下图。
- 每日更新帖子S ! J数:根据帖子列表中的最后回复时间,计算24小时内有回复或评论的主题总数
kbone 在微信开放社7 y 9 V e L区中新增了一个Kbone官方框架的专区,因产品发布较晚,K K p ] t ~ X 7 !目前只有一百多个帖子。
总结一下社区帖子及issue数据,情况如下(采集时间为 2020.04.03 23:00):
交流群
Tips:
- Taro 有16个微信群是根据 Taro 官网上显示Taro 开发交流 15 群 已满推论而出,每个微信群500人,交流群人数: 500*11 # v6 = 8000人
- uni-app 官网 QQ群有35个,微信群20个,还有十几个专项QQ群,其中有30个QQ群达到2000人,交流群人数: 30 * 2000 + 5* 1000 + 20*500 + 5000 = 90000人
- kbone 在 github 的 readme中有一个qq交流群,申请H 6 [ , m h C加g H 1 B入时显示500人已满
除了交流Q ` l ? h N c群外,DCloud对外公布的uni-app的开发者数量达到百万人,暂未看到taro和kbo9 g l I O q F p one公布此类数据。
总体而言,开发交流维度比较结果如h l 3 ` j l Y下:uni-app > taro > kbone
其它指标
github
在开源社区方面,Taro做的还是非常成功的,它吸引了更多开发者为其贡献代码、文档。
百度指数
通过index.baidu.com,可查看主流框架的搜索指数,它代表了网友的搜索量和相关文章的收录量。目前kbone尚未收录到百度指数中,如u v , j 7 8 e下是近期 uni-app 和 taro的百度指数对比图:
结语
所有的h H x T / f评测都只是提供决策依据,最后的结果还是要依赖开发者的团队技术栈、业务诉求、未来@ 6 3 u Z规划等。
不过作为一篇评测文章的结语,我们还是要给出自己的建议:
- 如果你熟悉ReactS 7 c F { M,不懂Vue.js,推荐Taro;
- 如果你熟悉Vue.js,则推荐 uni-ap{ } i e C | 9 xp;
- 如果你已经有H5代码,只想增加微信小程序平台,并且对性能要求不高{ 4 Y j u },可以考虑kbone;
- 如果你4 c k ( * 5 j !的业务涉及多端,更推荐 uni-app;
- 如果你希望通过 serverless 方案快速上线业务,推荐 uni-app。
如有读者认为本文中任何评测失真,欢迎在这里报 issuse。