微信小程序的开发,是当前移动端开发的重点,随着这么多年微信小程序的发展,也基本进入到了一个相对稳定的状态,大家当前不紧紧对功能要求更高了,对性能的要求也是越来越高,那么微信小程序的性能优化就是当前的重点,那么微信小程序性能优化应该从哪些方面入手呢?

首先看下小程序的加载流程:

微信小程序ios开启高性能 微信小程序运行速度_es6

以上图就是小程序的加载流程,主要分三个步骤:

  1. 资源准备,就是说小程序在下载资源包;
  2. 业务代码注入和渲染,就是说小程序开始将业务代码注入到视图层和逻辑层,然后开始渲染页面;
  3. 异步数据请求,就是当进入首页如果有数据请求,那么现在开始异步数据加载。

了解了小程序的启动过程后,我们就具体说说小程序性能的优化:

1、代码包大小的优化

代码包的大小会直接影响小程序的启动速度,代码包越大,那么下载包的时间也就会越长,代码注入的时间也就会越长,所以控制包的大小势在必行:

(1)控制包大小

  • 在开发完成之后,上传代码的时候,开发工具会自动压缩代码,将包的体积变小,另外也可以通过第三方工具,如webpack,gult等打包工具压缩代码;
  • 要把文件中的没有用的文件,无用代码,及时清理掉,这样也可以缩减代码包;
  • 要尽量将类似于图片等资源放到cdn上,因为小程序对资源文件的压缩比例特别的小;

(2) 分包加载 + 分包预加载

分包加载:我们如果不做分包,那么也就意味着小程序在初次加载的时候,将会把小程序的所有包都下载下来,那么这个过程中就会将暂时用不到的包也下载下来,这岂不是又费时又费力,所以,我们要分包下载,首先将tab页放到主包中,那么在最开始加载的时候加载主包,其他的按需加载,这样就实现了分包下载。性能也就提高了。可分包加载也有它的局限性,用户首次打开分包页面时,需要先进行分包代码的加载和注入,会造成页面切换时产生一定的延时,因此在此基础上,官方又推出了分包预加载和独立分包。

分包预加载:提前配置可能会跳到哪些分包,框架在进入页面后根据配置进行预下载,分包预加载会在你进入主包页面后,为你静默开启分包代码的下载和注入,这个过程是无感的。分包预加载需要注意的是:同一个分包中的页面享有共同的预下载大小限额2M,限额会在工具中打包时校验,因此不能把所有的分包页面都配置到分包预加载的配置中,只配置主包页面会跳转的页面即可。

(3)独立分包

从分包页面启动时,必须依赖于主包的下载和注入,启动所以就会收到主包大小的限制,因此,我们就需要独立分包,这样在启动页面的时候,就可以不依赖于主包,减少了主包的下载和注入时间,通常会将广告,活动等具有独立逻辑的代码做独立分包。

2、首屏加载优化

  • 提前发起请求,异步数据数据请求不需要等待页面渲染完成;
  • 利用缓存,可以将异步请求的数据缓存,下次进入页面的时候,可以先从缓存中获取,如果没有,再发起异步请求;
  • 避免白屏:先展示页面骨架和基础内容;
  • 及时反馈:及时地对需要用户等待的交互操作给出反馈,避免用户以为小程序没有响应 

3、渲染优化

微信小程序ios开启高性能 微信小程序运行速度_javascript_02

上图是小程序的渲染流程。可以看出:js引擎和native都可以通过js的计算或者data修改来对Webview发起绘制操作,但是对开发者来说最重要的就是js引擎和Webview之间的通信,这通信过程是一个跨进程通信,是非常耗时的一个过程。所以:

(1)避免使用setData不当

  • 使用data在方法间共享数据,会增加setData传输的数据量,同时会增加页面重绘的概率
  • data仅包括与页面相关的数据
  • 使用setData传输大量数据,通讯耗时与数据量正相关,页面更新延迟可能造成更新开销增加
  • 仅传输页面中发生变化的数据,使用setData的特殊key实现局部更新
  • 后台页面进行setData抢占前台页面的资源
  • 页面切入后台后的setData调用,延迟到页面重新展示的时候执行

总结来说就是在data中只定义与页面渲染相关的数据,其他与页面渲染无关的数据都定义成普通变量,在做setData操作时,尽量只传输页面渲染需要的数据,当页面切换时,将后台执行的setData操作销毁,等到页面重新展示的时候再执行。

(2)避免使用onPageScroll不当

  • 只在必要的时候监听pageScroll事件
  • 避免在onPageScroll中执行复杂逻辑
  • 避免在onPageSroll中频繁调用setData
  • 避免频繁查询节点信息(SelectQuery),部分场景使用节点布局相交状态监听(IntersectionObserver)替代

由于onPageSroll事件监听在处理js引擎和webview之间的通信时也是一个跨进程通信,因此在使用onPageScroll事件时,要注意以上的几点内容,来进行相关的优化

(3)使用自定义时间

在需要频繁更新的场景下,自定组件的更新只在组件内部更新,不受页面其他部分内容复杂性影响,这样也可以在一定程度优化渲染性能。

小程序的性能优化大致说这么多,当然还有很多要做。。。。请在评论区留言。。。。。