百度小程序性能优化建议:分包和合理使用setData

时间: 2018-12-18阅读: 784标签: 小程序

智能小程序的视图层使用了 san 框架,相对于其他类似 react 等 mvvm 框架来通过 virtual dom diff 来实现组件的渲染来说,san 框架是基于 data 的 diff 来进行的组件重新渲染,减少了内存的使用率与计算量,保证视图更新的高效性。所以智能小程序的视图层对于数据的变更更加敏感,感受到数据变更时则会直接触发组件的重渲染。


代码包的优化

优化大小

对于开发者来说,为了实现更加丰富的功能,所以有时会忽略对代码包大小的优化,但对于用户设备来说,需要把智能小程序所使用的代码包下载到本地空间。
所以代码包的大小会影响着用户所需的下载流量以及空间占用。另外,代码包的下载速度也会直接影响着用户的首次打开智能小程序的体验。

智能小程序的打包过程会把用户工程下所有的文件都进行打包,生成最终的用户包,所以,应该在实际开发用户包的过程中,实现业务逻辑的同时尽量去除冗余,提高复用性,及时清理不再使用的库文件和资源,来减少代码包的大小。


使用分包

可以合理的使用智能小程序的分包策略。按功能聚合、业务代码的使用频度等指标来进行代码包的拆分,当用户访问到不同包内的页面时,客户端再分别加载对应的分包。这样既能够减少智能小程序首次加载时的使用流量,也能够提升智能小程序首次加载时的速度。


图片资源优化

当使用大图片或者是长列表图片时,可能会导致客户端的内存占用上升,当占用量达到一定指标时,会触发客户端销毁智能小程序的机制。另外,大图片也可能会造成客户端的卡顿,所以建议开发者尽量减少使用大图片的资源。


合理的使用 setData

setData 是用户开发中经常使用的接口,对于手机百度智能小程序而言,使用不当也是极易引起性能问题的接口。
为了使大家更好的理解 setData 的错误用法,首先先介绍一下其背后的工作原理。


setData 的工作原理

智能小程序的逻辑层与视图层分属于不同的运行环境,相互之间不具备直接数据共享通道,他们之间的数据传递是通过客户端的消息事件派发来实现,所以到达视图层的 object 对象并非原指针,而是数据的复制版本。两者数据也并非完全同步,而是在数据未到达视图层之前,逻辑层的数据会领先于视图层。

智能小程序的视图层使用了 san 框架,相对于其他类似 react 等 mvvm 框架来通过 virtual dom diff 来实现组件的渲染来说,san 框架是基于 data 的 diff 来进行的组件重新渲染,减少了内存的使用率与计算量,保证视图更新的高效性。所以智能小程序的视图层对于数据的变更更加敏感,感受到数据变更时则会直接触发组件的重渲染。


常见不合理的使用 case

下面列举在开发者开发的过程中会常见的使用 setData 不当的场景。

1. setData 数据粒度划分不够

常见场景:开发者仅改变对象中某个属性的值,setData 的数据却是整个对象
例如:假设 person 的模型为

{
	name:'swan',
	age:'20',
	sex:'man',
	getName:fn,
	……
}

错误写法:

//code from http://caibaojian.com/baiduapp-optimization.html
let person = this.getData('person');
person.age = 30;
this.setData('person',person);

正确写法:

this.setData('person.age',30);

此时,若逻辑层直接向视图层传递更新整个 person ,那么首先传输的数据量会成倍增长,其次,视图层中所有使用了 person 中任何属性的组件均重新渲染。
好在逻辑层对于此处进行了优化,在逻辑层先进行数据对比,自动将 setData(‘person’,person) 补全为 setData(‘person.age’,30)。
但上述写法也依旧使逻辑层增加处理过程,并且对于特殊的数据类型,如 array ,逻辑层的 diff 比较无法精准到具体 key 。
例如:假设 numbers 模型为 [1,2,3,4,5]
错误写法:

let numbers = this.getData('numbers');
numbers.unshift();
this.setData('numbers',numbers);

正确写法:

this.unshiftData(array);

所以在开发过程中,开发者应正确划分 setData 的数据粒度,以优化程序性能。

2. 频繁的 setData

原因同上,频繁的 setData,常见场景如 setInterval ,或其他循环执行。
上述操作逻辑层每次均会通过客户端传递数据到视图层,消耗用户的网络流量与增加传输次数。并且,视图层也会频繁的重渲染组件,造成用户视觉卡顿等不好的体验。

3. 智能小程序页面不可见后进行 setData

在页面进入到后台状态时,程序后台的 setData 会占用前台页面的执行资源,且后台页面的渲染对用户并不可见,导致资源浪费。所以在页面隐藏时,不应该继续进行 setData 。


 原文链接:http://caibaojian.com/baiduapp-optimization.html  


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/1638

关闭

小程序 showLoading与showToast不能共存

loading与toast一般不能同时引用,所以一般先把hideloading了,再执行showtoast,之前把hideloading加到了complete中,所以toast就一直出问题

在小程序中实现 Mixins 方案

在原生开发小程序的过程中,发现有多个页面都使用了几乎完全一样的逻辑。由于小程序官方并没有提供 Mixins 这种代码复用机制,所以只能采用非常不优雅的复制粘贴的方式去“复用”代码

小程序web-view关闭后,页面音频没有关闭

在web-view的src中,引入了一个HTML5页面,这个页面有个自动播放的音频。在小程序中,点击右上角关闭小程序后,web-view页面中的音频依然会播放。

了解小程序

顾名思义,「小程序」本质上与我们平常经常使用的 app 和操作系统一样,都是一段电脑程序。你可以将小程序理解为「运行在微信上的 app」。与普通的 app 不同的是,小程序的语言使用网页前端的技术栈

mpvue开发微信小程序基础知识

mpvue 是一个使用 Vue.js 开发小程序的前端框架。框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验。mp 即 mini program 的缩写。

在微信小程序中使用 async/await

微信小程序中有大量接口是异步调用,比如 wx.login() 、 wx.request() 、 wx.getUserInfo() 等,都是使用一个对象作为参数,并定义了 success() 、 fail() 和 complete() 作为异步调用不同情况下的回调。

微信小程序用户授权

对于小程序未授权的用户,官方取消wx.getUserInfo方法的直接调用,首次授权必须主动触发自定义按钮,才可调起官方授权组件。思路步骤:wx.getSetting查看是否授权,已授权使用wx.getUserInfo获取用户信息,保存

在微信小程序中保存网络图片

在小程序的文档中我们得知,wx.saveImageToPhotosAlbum 是用来保存图片到相册的。 但是仔细一看会发现这个接口的filePath参数只接受临时文件路径或永久文件路径,不支持网络图片路径,意味着我们不能直接调用这个接口。

小程序图片加载失败使用默认图片

小程序的image标签有几个常用的属性,lazy-load(懒加载,默认为fasle,不过和本文无关),bindload(当图片加载完成的时候触发的事件),另一个就是我们本文的主角binderror(当发生错误的时候触发的事件);

支付宝小程序个人开发者,但暂未开放支付接口

支付宝小程序今日正式面向个人开发者开放公测。这是继微信之后,业内第2家面向个人开发者开放的小程序平台。有开发能力的个人用户可访问支付宝小程序平台,扫码验证个人身份以后即可开始支付宝小程序账号申请并进行代码开发。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!