Taro 已经 100% 支持转换京东小程序,受到了很多同学的关注。当中有欢呼雀跃的声音:“一键转换为京东小程序,终于可以准时下班啦”。也有对 Taro 不太了解的同学提出了一些疑问:“转换的效果如何?”、“转换后代码的性能是否达标?” 等等。

针对各种疑问,我们从性能与开发体验的角度切入,把京东小程序原生开发与 Taro 开发进行了一番对比。

性能对比

针对性能的问题,我们分别测试了 Taro 空项目的包大小和 Taro 在长列表中的表现。因为包大小会影响小程序的首次加载速度,而长列表则是常常出现性能瓶颈的场景。

Taro 空项目包大小

目前各小程序都有对主包的大小进行限制,如京东小程序限制为 5M、微信小程序限制为 2M。这是因为初次进入的速度对于用户的体验非常地关键,而主包体积越大下载的时间就最长。因此小程序框架的大小也成为了开发前框架选型的重要参考指标之一,倘若框架体积过大,就会压缩业务逻辑的可用空间。

下列图片分别是 Taro 运行时框架压缩前后的大小,可以看到压缩后仅为84k,对主包空间的影响十分小。

压缩前:

压缩后:

长列表渲染表现

benchmark 介绍

我们参照 js-framework-benchmark 编写了一份 benchmark,测试对比了 Taro 代码与原生代码在长列表场景下的渲染表现。

测速指标
  • 初始化:从进入页面开始到完成 40 个商品的渲染。
  • 创建:页面 onLoad 后创建 40 个商品。
  • 增加:往已创建了 40 个商品的列表中每次增加 20 个商品。
  • 部分更新:在 400 个商品中更新每第 10 个商品的名称。
  • 交换:在 400 个商品中交换其中两个商品的位置。
  • 选中:点击商品图片,改变商品名称的字体颜色。
计时点

Taro

开始:事件响应函数的顶部。

结束:setState 回调函数的顶部。

原生小程序

开始:事件响应函数的顶部。

结束:setData 回调函数的顶部。

其它

benchmark 仓库:Github

Taro 版本:1.3.21

测试机型:魅蓝 note

测试方法:每组测试 10 条数据,去除其中最大值与最小值后求平均值

测试结果

因为在京东小程序与微信小程序中,setData 的 callback 的触发时机稍有不同,所以分开列出

操作 Taro jd 原生京东小程序 初始化 150 123 创建 87 85 部分更新 125 235 交换 140 213 选中 131 155

| 操作 | Taro weapp | 原生微信小程序 | |:----:|:----:|:----:|:----:| | 初始化 | 1155 | 1223 | | 创建 | 500 | 408 | | 部分更新 | 167 | 307 | | 交换 | 252 | 309 | | 选中 | 193 | 178 |

经测试发现,列表的长度会对增加操作的耗时产生影响:列表越长,增加操作的耗时越久。因此不能简单地对 N 次增加操作求平均增加耗时。这里我们选择使用折线图来展现出随增加操作次数的变化,渲染耗时的变化趋势。

测试结论

创建

在创建时,Taro 会对数据做一些处理,因此会比原生稍慢。

初始化

初始化与创建相比,差别是引入了页面构造耗时。即初始化耗时 = 页面构造耗时 + 创建操作耗时

Taro 在页面初始化、创建操作时都会对数据进行处理,因此整个初始化耗时会比原生稍慢。

那为什么微信小程序中 Taro 初始化耗时更短呢?在 benchmark 中 Taro 和原生分别在 componentWillMount 和 onLoad 渲染列表,而 Taro 使用 Component 构造页面,componentWillMount 其实是在 attached 生命周期中触发。因为在微信小程序中 attached 比 onLoad 早触发得多,所以会出现如此现象。

选中

因为 Taro 只是把回调函数包装了一层,处理了事件参数和 this 等,所以和原生的速度相当。

部分更新、交换、增加

Taro 的速度会优于原生。原因是 Taro 会先对将要 setData 的数据和当前 data 的数据做一次 diff,这能够大大减少 setData 的数据量,加快渲染速度。对比两个折线图可以得知,数据量越大,diff 的优化收益也越大。

Taro 对小程序的性能优化

setData

在小程序中,性能的问题主要在于单次 setData 数据量过大和频繁调用 setData 上。Taro 利用 diff 解决了单次 setData 数据量过大的问题,而对于频繁调用 setData 也有解决的办法。

Taro 的 setState 遵循 React 规范,不同于 setData 的同步更新,它会异步地去更新视图。因此假设开发者在单次事件循环中多次调用 setState,最后也只会在下一个事件循环中进行一次 setData。

跳转预加载

小程序由 A 页面跳转到 B 页面的过程中,从 A 页面发起跳转到 B 页面触发 onLoad,有着 300400 毫秒的延时。Taro 提供了 componentWillPreload 钩子,钩子会在发起跳转后立即执行。开发者可以尽早地在钩子里做一些数据拉取的工作,相比在 onLoad 触发后再去拉取数据就能够节省 300400 毫秒的延时。

shouldComponentUpdate & Taro.PureComponent

开发者的 Class Component 可以继承 Taro.PureComponent,这样组件在更新前会对新旧 props 和新旧 state 各做一次浅对比,避免不必要的更新。当然开发者可以自己实现 shouldComponentUpdate,通过手动控制新旧 props 和新旧 state 的对比,决定是否更新组件。

Taro.memo

如果开发者书写的是函数式组件,则可以利用 Taro.memo 实现 shouldComponentUpdate 的相同功能。

开发体验对比

语法

京东小程序的原生语法和微信小程序相仿,都是类 MVVM 语法,没有接触过小程序的开发者有一定学习成本。另外样式语法为 css 的子集,其中自适应尺寸单位为 rpx,这样意味着如果我们需要 css 预处理器时需要手动配置工作流,并且在编写样式时处处注意尺寸单位的转换。

目前 Taro 遵循 React 语法(将来会支持所有 Web 前端框架),JSX 令我们的代码更加灵活。因此拥有 React 开发经验的开发者可以马上上手 Taro 的开发工作。在样式方面 Taro 支持在创建项目时选择是否使用 css 预处理器,选择后会自动配置相应的工作流。对于样式单位 Taro 也会把用户编写的 px 数值自动转换成对应的 rpx 数值,开发者无需再分心处理各平台的样式单位。

项目结构

原生开发中,页面和组件各由4个文件(js、jxml、jxss、json)所组成,代码管理相对麻烦。

Taro 中页面和组件均由一份 js 文件和一份样式文件组成,创建与维护十分容易。

开发生态

微信小程序经过不断迭代,相继推出了插件系统和支持引用 npm 包的功能。但京东小程序暂不支持前两者,京东小程序社区也还没打造起来,开发生态资源十分匮乏。

Taro 中不但能自由引用 npm 包,而且还大量支持 React 社区中沉淀的优秀工具和库,如 react-redux、mobx-react 等。

开发辅助

京东小程序原生开发不支持 Typescript,只能在 IDE 的编辑器中有自动补全功能,编码效率不高,同时也容易出错。

Taro 完美支持 Typescript,自带代码智能提示和代码实时检查功能,能让开发效率大大提升。

写在最后

看到这里大家可能会问,Taro 性能真的优于原生吗?其实并不然,针对每个场景,我们都可以用原生写出性能最佳的代码。但是这样做工作量太大,实际项目开发中需要掌握效率与优化之间的平衡。Taro 的优势在于能让我们在书写更有效率的代码、拥有更丰富的生态的同时,还带来了不错的性能。

最后,欢迎大家来使用 Taro 开发各端应用,有任何开发问题或合作意愿请联系 taro@jd.com,我们会第一时间回复。


欢迎关注凹凸实验室博客:aotu.io

或者关注凹凸实验室公众号(AOTULabs),不定时推送文章:

微信小程序多次跳转后不能点_京东小程序 Taro 开发对比原生开发测评相关推荐

  1. 京东小程序 Taro 开发对比原生开发测评

    Taro 已经 100% 支持转换京东小程序,受到了很多同学的关注.当中有欢呼雀跃的声音:"一键转换为京东小程序,终于可以准时下班啦".也有对 Taro 不太了解的同学提出了一些疑 ...

  2. 微信小程序多次跳转后不能点_微信突然更新,但我劝你这次别升级

    时隔 42 天,iOS 版微信迎来一波正式更新,最新版本号是 7.0.15. 更新日志上,程序猿仍然很神秘,没写什么更新点.没事,到底有什么更新,就交给机哥. 终于...机哥能愉快地 吐槽 介绍新功能 ...

  3. 微信小程序多次跳转后不能点_微信小程序运营需要先知道它的规则

    不管是做SEO(搜索引擎优化排名)还是做SEM投放广告,都需要知道它的规则,因为只有知道了他的规则之后才能合理的优化,才能在运营的过程中不踩雷区,合理运用平台的规则来实现自己的目的.那么微信小程序也一 ...

  4. 解决微信小程序使用switchTab跳转后页面不刷新的问题

    解决微信小程序使用switchTab跳转后页面不刷新的问题 参考文章: (1)解决微信小程序使用switchTab跳转后页面不刷新的问题 (2)https://www.cnblogs.com/mmyk ...

  5. python表示三个数升序_编写程序,输入三个数,然后以升序显示_学小易找答案

    [简答题]按照软件开发的顺序,实现下列程序: 计算三角形面积的公式为:s = (side1 + side2 + side3) / 2,area = (s - side1)(s - side2)(s - ...

  6. python跳回循环开始位置_如何将程序从用户输入循环回起始位置?

    我刚刚开始使用python.我做的第一个程序是一个提示计算器,我已经做了三个版本来重写和添加更多.我想编写的下一部分代码是一个循环,它提示一个是或否问题.当"是"时,我希望程序循环 ...

  7. 微信小程序,用户拒绝授权后重新授权;uni-app小程序,用户拒绝授权后点击无效;重新进入后拉起位置授权框;

    问题:当用户第一次进入小程序,点击授权按钮后,点了拒绝,再次点击不会出现授权页面,只有再次进入小程序的时候,才会出发请求授权 . 案例: 假如我们获取微信位置,第一次点击的时候弹起授权,用户点击的拒绝 ...

  8. 哪个是python程序中与缩进有关的正确说法_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()。_学小易找答案...

    [单选题]白内障的主要症状 [多选题]白内障病人手术后护理重点观察是 [单选题]某女,21岁.排球比赛时与队员发生碰撞,后诉鼻梁疼痛来院就诊,检查鼻腔发现鼻中隔有一小血肿.正确处理方法是 [单选题]开 ...

  9. 网线重新插拔后恢复正常_生活小窍门之网线不够长怎么办,毕亚兹网线连接器轻松搞定...

    很多朋友在家中装修完时候,为了整齐和方便收纳都会把每个屋中的网口和光纤输出口集中到一起,放置到网络箱中,看起来更加整齐划一,但是装修时都不会考虑到网线要预留很长,很多时候都只留了很短的一节网线,还有的 ...

  10. python程序中的空格和空行可有可无_为了让代码更加紧凑,编写Python程序时应尽量避免加入空格和空行。_学小易找答案...

    [判断题]Python 代码的注释只有一种方式,那就是使用#符号. [判断题]为了让代码更加紧凑,编写Python程序时应尽量避免加入空格和空行. [多选题]脱水后的污泥可采取( )方法进行最终处理. ...

最新文章

  1. nginx转发请求_Nginx为什么高效?一文搞明白Nginx核心原理
  2. Python 守护线程
  3. word2007-2010排版中解决段后插入分页符 新页首行空行问题
  4. 设备像素,设备独立像素,CSS像素
  5. 你是否应该成为一名全栈工程师?
  6. 关于Object.clone克隆方法的测试
  7. SAS对数据变量的处理
  8. python: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file:
  9. php+代码模板下载地址,简单而强大的PHP模板引擎
  10. Android开发实践:自定义ViewGroup的onLayout()分析
  11. CSS3渐变——gradient
  12. Proteus--软件简介及安装教程
  13. IT英语4-计算机英语缩写术语
  14. python中install语法错误_找不出python的语法错误该如何解决?
  15. Python系统学习第二十四课
  16. DIV+CSS样式---网易盖楼
  17. 监督学习、无监督学习、半监督学习和强化学习
  18. 5月27日 | 极客俱乐部:集成平台赋能业务流程再造与创新
  19. 即时通讯IM 源码 uniapp php 全开源
  20. 低学历逆袭难,真的只是不够努力吗?

热门文章

  1. 科技部部长:院士头衔不是学术不端挡箭牌!已有多位院士、校长等被“拿下”...
  2. GS3D An Efficient 3D Object Detection Framework for Autonomous Driving算法解析
  3. springboot快速入门(Eclipse)
  4. javascript判断给定字符串是否是回文
  5. ZigBee cc2530芯片学习 error记录(1)
  6. (绪论和参考文献)基于深度强化学习的复杂作业车间调度问题研究
  7. 基于深度极限学习机DELM的回归预测
  8. 专题三——枚举、模拟、排序
  9. ArcMAP 启动要素构造工具条
  10. 基于FVC_MSAVI_EVI的荒漠化等级分类方法