关于小程序优化的一些建议(小结)


Posted in Javascript onDecember 10, 2020

setData

setData 是小程序开发中使用最频繁的接口,也是最容易引发性能问题的接口。在介绍常见的错误用法前,先简单介绍一下 setData 背后的工作原理。

工作原理

小程序的视图层目前使用 WebView 作为渲染载体,而逻辑层是由独立的 JavascriptCore 作为运行环境。在架构上,WebView 和 JavascriptCore 都是独立的模块,并不具备数据直接共享的通道。当前,视图层和逻辑层的数据传输,实际上通过两边提供的evaluateJavascript 所实现。即用户传输的数据,需要将其转换为字符串形式传递,同时把转换后的数据内容拼接成一份 JS 脚本,再通过执行 JS 脚本的形式传递到两边独立环境。

而 evaluateJavascript 的执行会受很多方面的影响,数据到达视图层并不是实时的。

常见的 setData 操作错误

1. 频繁的去 setData

在我们分析过的一些案例里,部分小程序会非常频繁(毫秒级)的去setData,其导致了两个后果:

  • Android 下用户在滑动时会感觉到卡顿,操作反馈延迟严重,因为 JS 线程一直在编译执行渲染,未能及时将用户操作事件传递到逻辑层,逻辑层亦无法及时将操作处理结果及时传递到视图层;
  • 渲染有出现延时,由于 WebView 的 JS 线程一直处于忙碌状态,逻辑层到页面层的通信耗时上升,视图层收到的数据消息时距离发出时间已经过去了几百毫秒,渲染的结果并不实时;

2. 每次 setData 都传递大量新数据

由setData的底层实现可知,我们的数据传输实际是一次 evaluateJavascript 脚本过程,当数据量过大时会增加脚本的编译执行时间,占用 WebView JS 线程,

3. 后台态页面进行 setData

当页面进入后台态(用户不可见),不应该继续去进行setData,后台态页面的渲染用户是无法感受的,另外后台态页面去setData也会抢占前台页面的执行。

图片资源

目前图片资源的主要性能问题在于大图片和长列表图片上,这两种情况都有可能导致 iOS 客户端内存占用上升,从而触发系统回收小程序页面。

图片对内存的影响

图片对页面切换的影响

除了内存问题外,大图片也会造成页面切换的卡顿。我们分析过的案例中,有一部分小程序会在页面中引用大图片,在页面后退切换中会出现掉帧卡顿的情况。

当前我们建议开发者尽量减少使用大图片资源。

代码包大小的优化

小程序一开始时代码包限制为 1MB,但我们收到了很多反馈说代码包大小不够用,经过评估后我们放开了这个限制,增加到 2MB 。代码包上限的增加对于开发者来说,能够实现更丰富的功能,但对于用户来说,也增加了下载流量和本地空间的占用。

开发者在实现业务逻辑同时也有必要尽量减少代码包的大小,因为代码包大小直接影响到下载速度,从而影响用户的首次打开体验。除了代码自身的重构优化外,还可以从这两方面着手优化代码大小:

控制代码包内图片资源

小程序代码包经过编译后,会放在微信的 CDN 上供用户下载,CDN 开启了 GZIP 压缩,所以用户下载的是压缩后的 GZIP 包,其大小比代码包原体积会更小。 但我们分析数据发现,不同小程序之间的代码包压缩比差异也挺大的,部分可以达到 30%,而部分只有 80%,而造成这部分差异的一个原因,就是图片资源的使用。GZIP 对基于文本资源的压缩效果最好,在压缩较大文件时往往可高达 70%-80% 的压缩率,而如果对已经压缩的资源(例如大多数的图片格式)则效果甚微。

及时清理没有使用到的代码和资源

在日常开发的时候,我们可能引入了一些新的库文件,而过了一段时间后,由于各种原因又不再使用这个库了,我们常常会只是去掉了代码里的引用,而忘记删掉这类库文件了。目前小程序打包是会将工程下所有文件都打入代码包内,也就是说,这些没有被实际使用到的库文件和资源也会被打入到代码包里,从而影响到整体代码包的大小。

WXS 模块

每个 wxs 模块均有一个内置的 module 对象。
直接在wxml中引入,可以将写需要转化数据的写进去,防止给setData加负担

使用了过大的 WXML 节点数目

一个太大的WXML节点树会增加内存的使用,样式重排时间也会更长,建议一个页面使用少于1000个WXML的节点,节点树深度少于30层,子节点数不大于60

小程序有并发限制

wx.request、wx.uploadFile、wx.downloadFile 的最大并发限制是 10 个。

所有为了保险起见,采用公共方法和组件

编写公共方法和组件,可以避免重复造轮子。
1.公共埋点方法
2.各种处理js的方法(转https,throttle,formatTime等)
3.公共组件(iphonex兼容组件,倒计时组件等)

需要写个请求队列,如果并发量大于10,则等待请求。

埋点的坑

埋点用公共方法,页面曝光pv埋点放入onshow生命周期中更加准确。

setData注意点

1. 频繁的去 setData
存在将未绑定在 WXML 的变量都不需要传入 setData。

2. 每次 setData 都传递大量新数据,可局部更新

this.setData({
  list[index] = newList[index]

})

3. 后台态页面进行 setData

当页面进入后台态(用户不可见),不应该继续去进行setData,后台态页面的渲染用户是无法感受的,另外后台态页面去setData也会抢占前台页面的执行。也就是上文提到的不要忘了clearTimeout、clearInterval。

到此这篇关于关于小程序优化的一些建议(小结)的文章就介绍到这了,更多相关小程序优化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JQuery下关于$.Ready()的分析
Dec 13 Javascript
50款非常棒的 jQuery 插件分享
Mar 29 Javascript
深入探秘jquery瀑布流的实现
Jan 30 Javascript
值得分享的JavaScript实现图片轮播组件
Nov 21 Javascript
小程序实现抽奖动画
Apr 16 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
Feb 02 Javascript
微信小程序+云开发实现欢迎登录注册
May 24 Javascript
node 标准输入流和输出流代码实例
Sep 19 Javascript
Node.js API详解之 readline模块用法详解
May 22 Javascript
vue+element实现图片上传及裁剪功能
Jun 29 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
Oct 27 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
Nov 07 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
Dec 10 #Vue.js
echarts柱状图背景重叠组合而非并列的实现代码
Dec 10 #Javascript
javascript实现放大镜功能
Dec 09 #Javascript
Javascript实现单选框效果
Dec 09 #Javascript
javascript实现移动端轮播图
Dec 09 #Javascript
JavaScript实现弹出窗口效果
Dec 09 #Javascript
五句话帮你轻松搞定js原型链
Dec 09 #Javascript
You might like
融入意大利的咖啡文化
2021/03/03 咖啡文化
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
解决django前后端分离csrf验证的问题
2019/02/03 Python
详解python和matlab的优势与区别
2019/06/28 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
Python之多进程与多线程的使用
2021/02/23 Python
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
悦木之源美国官网:Origins美国
2016/08/01 全球购物
苹果美国官方商城:Apple美国
2016/08/24 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
如何让Java程序执行效率更高
2014/06/25 面试题
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
大学生家政服务项目创业计划书
2014/01/30 职场文书
军训自我鉴定范文
2014/02/13 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
长城导游词300字
2015/01/30 职场文书
2015年班组工作总结
2015/04/20 职场文书
文明礼貌主题班会
2015/08/14 职场文书
乔迁新居祝福语
2019/11/04 职场文书
Mysql 一主多从的部署
2022/05/20 MySQL