小程序初步优化

前言

由于小程序本身层面做了一些优化,展示比h5在某些更优。但目前随着代码量的增加,页面本身显示得越来越不“小程序”了。本次着手从表现层面进行优化。

现场

  1. 首页列表越滚动越卡顿。
    在请求20次后几乎卡死,究其原因发现是业务调用setComponent时,框架onion在updateComponent设置过多数据导致 。每次重新set时,会把新增数据合并到原有的数据再重新调用setData,这样让数据量成倍增加,但渲染时间却如下图,超过1M报错
    image

    [图片来源网络]
  • 优化前,时间呈上图函数增长。最后一条接近3s


    image
    • 优化后,render的时间比较平稳,维持50ms以下。


      image
  • 优化方法

用一个新的数组来存储新增的数据,这样保证每次数据量体积稳定。

_updateComponent(name, indexs) {
    let data = {},
        newData = {},
        componentKey = 'components.' + name

    data[componentKey] = this.data.components[name]

    if (indexs && indexs.length) {

        Object.keys(data[componentKey]).forEach(key=>{
            if (indexs.indexOf(key) > -1){
                newData[componentKey + '.' + key] = data[componentKey][key];
            }
        })

        data = newData
    }

    this.setData(data)

  }

2.店铺首页
通过小程序模拟器的Audits检查页面问题

image

a.图片相关

  • 大体积图片

    • 图片统一限高裁切,部分图片过大,占用内存资源。通过添加w和h参数对图片大小控制
  • 图片文件格式

    • 判断是否支持webp?目前通过平台判断,非ios下则在图片链接后追加webp。当然更好的方式是通过加载是否支持webp的图片来实现,以后微信可能支持显示webp。
    function supportWebpBySystem() {
       supportWebp = false;
       wx.getSystemInfo({
           success: function(res){
               var platform = res.platform || '';

               if (platform.toLocaleLowerCase() !== 'ios') {
                   supportWebp = true;
               }
           },
           fail: function(){
               supportWebp = false;
           },
       });
   }

更好的方式

  • 减少一次性图片请求
    • 使用图片懒加载。在未处理前最多同时请求30+张图片,这无论是在流量上还是性能上都有一些损失。由于我们采用组件开发的形式,考虑到一些特殊情况,所以在组件内部新增一个lazyLoad变量来控制懒加载。
      组件的每一个元素上都有一个唯一标示no,而它又作为class。这样就可以通过createIntersectionObserver来监听加载

用于推断某些节点是否可以被用户看见、有多大比例可以被用户看见。
支持版本 >= 1.9.3

  function  createIntersectionObserver(){
       var self = this,
           key,
           id = this.id.replace('.','-'),
           lazyLoad = this.data.lazyLoad;

       setTimeout(() => {
           for(let i = 0;i < this._data.no; i++){

               key = id + '-' + i;
               (function(key){
                   wx.createIntersectionObserver().relativeToViewport({bottom: 20}).observe('.' + key, (res) => {
                       if (res.intersectionRatio > 0 && !lazyLoad[key]) {
                           self.setData({
                               ['lazyLoad.' + key] : true
                           });
                       }
                   });
               })(key);
           }
       }, 300);    // 延时是为了挂载完再监听,这里只是随便写的一个数字,具体挂载完的时间没有测试过
   }

b.变量管理
与UI没关系的变量,不通过setData来进行设置。直接通过变量_data来管理,这样既能减少调用setData的次数,又能缩小data的大小。

参考

【微信小程序】性能优化https://juejin.im/post/5b9f5d55e51d450e4006a9e5
彻底解决长列表页setData超过1M时报错和严重卡顿的问题

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 因新工作主要负责微信小程序这一块,最近的重心就移到这一块,该博客是对微信小程序整体的整理归纳以及标明一些细节点,初...
    majun00阅读 7,485评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,174评论 1 32
  • 给提问的开发者的建议:提问之前先查询 文档、通过社区右上角搜索搜索已经存在的问题。 写一个简明扼要的标题,并且...
    极乐叔阅读 14,109评论 0 3
  • 乔一在想F君,只是春光如此,却不得见你。沿着林荫路走下去,走好久好久,不知道自己到底想去哪里。 昨天经过某个村子,...
    程少啊阅读 1,133评论 0 0
  • 大家好,我是宰飞,今天晚上我想聊聊一个简单的主题就是成为更好的自己。 接下来我将从四个小的角度聊聊这件简单并且其实...
    无铗投资与写作阅读 181评论 0 0