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

更新日期: 2018-12-18阅读量: 1602标签: 小程序

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

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

微信小程序开发中遇到的坑

开发小程序的过程中踩的坑不可谓不多,而有些坑也实在是让人郁闷,不扒一扒难以平我心头之愤呐。

微信小程序跳转小程序

以前小程序跳小程序直接通过api调用跳转即可,但在2018.11.1下午微信公众平台通知需做navigateToMiniProgramAppIdList配置,否则无法提交审核,配置要跳转的微信小程序id ,最多不能超过10个。

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

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

Remax:使用真正的 React 构建小程序

Remax 是基于真正 React 的小程序构建工具,本文由 Ant Design 团队的 Mack 执笔,让我们跟随作者一起了解 Remax。因为 React 是我们最熟悉的技术。小程序糟糕的 API 设计已经有很多文章吐槽

手把手教你写个小程序定时器管理库

后台的定时器积累得越多,小程序就越卡,耗电量也越大,最终导致程序卡死甚至崩溃。特别是团队开发的项目,很难确保每个成员都正确清理了定时器。因此,写一个定时器管理库来管理定时器的生命周期,将大有裨益。

小程序框架_推荐多款高质量的小程序框架组件

小程序到底有多火,看看目前推出的开源框架以及组件库就知道了。由于小程序开发的火爆,大家都在致力于探索如何更好的,更加高效的开发小程序,以至于很多公司都贡献了小程序开源框架和组件库。 如: mpvue、Tina.js、Taro、wepy、weweb、touchwx

小程序开发的一些细节,你有注意吗?

我认为小程序是一个没有什么技术含量的东西,特别是现在有了组件库,而且小程序生态不断完善的情况下,只要对着文档慢慢写就好,就是时间的问题。然后这里也不是教大家怎么去写程序之类的,而是本人在经历过后的一些小建议

小程序多余文本省略号显示

如何在 wxml 页面中截取数据?取数据想必大家都会,不就是 substring 吗?但是这种方法在 wxml 页面中是无效的。那还有 css 啊,不一样可以做到吗?但是个人觉得 css 复用性太差,暂不考虑。

优雅解决微信小程序授权登录需要button触发

聊一聊最近的一个项目,这个项目是一个收书、售书的小程序,有商城、专栏、信息发布论坛等功能。虽然不是面向所有用户,但要求无论用户是否授权都皆可使用,但同时也要求部分功能对不授权的用户限制开放。

微信小程序分包加载

开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。在构建小程序分包项目时,构建会输出一个或多个分包。每个使用分包小程序必须包含一个主包,所谓的主包,即放置默认启动页/TabBar 页面

点击更多...

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