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


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 相关文章推荐
js查找父节点的简单方法
Jun 28 Javascript
理解Javascript_07_理解instanceof实现原理
Oct 15 Javascript
js对象与打印对象分析比较
Apr 23 Javascript
javascript实现简单查找与替换的方法
Jul 22 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
Aug 04 Javascript
jQuery实现图片渐入渐出切换展示效果
Aug 15 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
May 03 Javascript
jqGrid用法汇总(全经典)
Jun 28 Javascript
JS设计模式之访问者模式定义与用法分析
Feb 05 Javascript
如何从零开始利用js手写一个Promise库详解
Apr 19 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
May 09 Javascript
微信小程序实现上传图片功能
May 28 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
ThinkPHP页面跳转success与error方法概述
2014/06/25 PHP
PHP实现自动对图片进行滚动显示的方法
2015/03/12 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python实现字符串和日期相互转换的方法
2015/05/13 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
python实现神经网络感知器算法
2017/12/20 Python
Python实现的建造者模式示例
2018/08/06 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
Python加速程序运行的方法
2020/07/29 Python
Omio葡萄牙:全欧洲低价大巴、火车和航班搜索和比价
2019/02/09 全球购物
计算机专业求职信
2014/06/02 职场文书
日语专业求职信
2014/07/04 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL
Win11怎么把合并的任务栏分开 Win11任务栏合并分开教程
2022/04/06 数码科技