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

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

智能小程序的视图层使用了 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.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

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

网页程序迁移至微信小程序web-view详解

小程序之前开放了webview功能,可以说是网页应用的一大福音了,但是微信的webview有一些坑,这篇文章就是列举一下我在开发过程中遇到的一些问题以及我找到的一些解决方案。

微信小程序WXS之谜

微信创造了 WXS ,除了提高性能,还有什么原因?WXS(WeiXin Script)是微信创造的一套脚本语言,它的官方说法是:“WXS 与 JavaScript 是不同的语言,有自己的语法,并不和 JavaScript 一致”。

小程序开发实践总结

从微信发布小程序以来,各大公司纷纷跟进都想从微信这个流量池里捞一杯羹。前前后后也开发了四五个小程序了。总觉得要留下点什么,既是记录那些年我们踩过的坑,也是希望大家别再掉坑。

了解小程序

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

微信小程序-页面跳转与参数传递

微信小程序页面跳转方式有很多种,可以像HTML中a标签一样添加标签进行跳转,也可以通过js中方法进行跳转。

小程序多端框架全面测评

最近前端届多端框架频出,相信很多有代码多端运行需求的开发者都会产生一些疑惑:这些框架都有什么优缺点?到底应该用哪个?作为 Taro 开发团队一员,笔者想在本文尽量站在一个客观公正的角度去评价各个框架的选型和优劣。

小程序如何改变onLoad 的执行时机?

也许在小程序所有生命周期里,我们用的最多的就是 onLoad,一大堆代码都要在初始化的时候执行。很多时候,初始化的代码是每个页面共用的,比如获取用户信息、获取定位等:

小程序超过2M限制的方法_分包加载

起初小程序上线时,微信限制了代码包不能超过1MB,后来功能变大变成了2M了,限制大小是出于对小程序启动速度的考虑,<br>希望用户在使用任何一款小程序时,都能获得一种“秒开”体验

小程序分享海报的实现

小程序分享到朋友圈只能使用小程序码海报来实现,生成小程序码的方式有两种,一种是使用后端方式,一种是使用小程序自带的canvas生成;后端的方式开发难度大,由于生成图片耗用内存比较大对服务端也是不小的压力;

微信小程序中清除定时器

在微信小程序的开发过程中,经常会遇到使用倒计时的情况,但是小程序的页面跳转经常会遇到跳转的下一个页面后,前一个页面的倒计时还在运行。这时候需要我们在关闭或者离开当前页面的时候清除掉当前的倒计时,但是传统的方式在小程序中无法使用,在小程序中我采用的是赋值然后清除的方法。

点击更多...

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