广告
返回顶部
首页 > 资讯 > 精选 >微信小程序性能如何优化
  • 172
分享到

微信小程序性能如何优化

2023-06-26 08:06:48 172人浏览 独家记忆
摘要

这篇文章主要介绍了微信小程序性能如何优化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序性能如何优化文章都会有所收获,下面我们一起来看看吧。为什么要做性能优化?一切性能优化都是为了体验优化1. 使用小程

这篇文章主要介绍了微信小程序性能如何优化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序性能如何优化文章都会有所收获,下面我们一起来看看吧。

为什么要做性能优化

一切性能优化都是为了体验优化

1. 使用小程序时,是否会经常遇到如下问题?

  • 打开是一直白屏

  • 打开是loading态,转好几圈

  • 我的页面点了怎么跳转这么慢?

  • 我的列表怎么越滑越卡?

2. 我们优化的方向有哪些?
  • 启动加载性能

  • 渲染性能

3. 启动加载性能

1. 首次加载

你是否见过小程序首次加载时是这样的图?

这张图中的三种状态对应的都是什么呢?

小程序启动时,微信会为小程序展示一个固定的启动界面,界面内包含小程序的图标、名称和加载提示图标。此时,微信会在背后完成几项工作:下载小程序代码包、加载小程序代码包、初始化小程序首页。下载到的小程序代码包不是小程序的源代码,而是编译、压缩、打包之后的代码包。

2. 加载顺序

小程序加载的顺序是如何?

微信会在小程序启动前为小程序准备好通用的运行环境。这个运行环境包括几个供小程序使用的线程,并在其中完成小程序基础库的初始化,预先执行通用逻辑,尽可能做好小程序的启动准备。这样可以显著减少小程序的启动时间。

通过2,我们知道了,问题1中第一张图是资源准备(代码包下载);第二张图是业务代码的注入以及落地页首次渲染;第三张图是落地页数据请求时的loading态(部分小程序存在)

3. 控制包大小

提升体验最直接的方法是控制小程序包的大小,这是最显而易见的

  • 勾选开发工具中“上传代码时,压缩代码”选项;

  • 及时清理无用的代码和资源文件(包括无用的日志代码)

  • 减少资源包中的图片等资源的数量和大小(理论上除了小icon,其他图片资源从网络下载),图片资源压缩率有限

从开发者的角度看,控制代码包大小有助于减少小程序的启动时间。对低于1MB的代码包,其下载时间可以控制在929ms(iOS)、1500ms(Android)内。

4. 采用分包加载机制

根据业务场景,将用户访问率高的页面放在主包里,将访问率低的页面放入子包里,按需加载;

使用分包时需要注意代码和资源文件目录的划分。启动时需要访问的页面及其依赖的资源文件应放在主包中。

5 采用分包预加载技术

在4的基础上,当用户点击到子包的目录时,还是有一个代码包下载的过程,这会感觉到明显的卡顿,所以子包也不建议拆的太大,当然我们可以采用子包预加载技术,并不需要等到用户点击到子包页面后在下载子包,而是可以根据后期数据,做子包预加载,将用户在当先页可能点击的子包页面先加载,当用户点击后直接跳转;

这种基于配置的子包预加载技术,是可以根据用户网络类型来判断的,当用户处于网络条件好时才预加载;是灵活可控的

6. 采用独立分包技术

目前很多小程序主包+子包(2M+6M)的方式,但是在做很多运营活动时,我们会发现活动(红包)是在子包里,但是运营、产品投放的落地页链接是子包链接,这是的用户在直达落地时,必须先下载主包内容(一般比较大),在下载子包内容(相对主包,较小),这使得在用户停留时间比较短的小程序场景中,用户体验不是很好,而且浪费了很大部分流量;

可以采用独立分包技术,区别于子包,和主包之间是无关的,在功能比较独立的子包里,使用户只需下载分包资源;

7. 首屏加载的优化建议

1 提前请求

异步请求可以在页面onLoad就加载,不需要等页面ready后在异步请求数据;当然,如果能在前置页面点击跳转时预请求当前页的核心异步请求,效果会更好;

2 利用缓存

利用storage api, 对变动频率比较低的异步数据进行缓存,二次启动时,先利用缓存数据进行初始化渲染,然后后台进行异步数据的更新,这不仅优化了性能,在无网环境下,用户也能很顺畅的使用到关键服务;

3 避免白屏

可以在前置页面将一些有用的字段带到当前页,进行首次渲染(列表页的某些数据--> 详情页),没有数据的模块可以进行骨架屏的占位,使用户不会等待的很焦虑,甚至走了;

4 及时反馈

及时的对需要用户等待的交互操作进行反馈,避免用户以为小程序卡了,无响应


渲染性能优化

1. 小程序渲染原理

双线程下的界面渲染,小程序的逻辑层和渲染层是分开的两个线程。在渲染层,宿主环境会把WXML转化成对应的js对象,在逻辑层发生数据变更的时候,我们需要通过宿主环境提供的setData方法把数据从逻辑层传递到渲染层,再经过对比前后差异,把差异应用在原来的Dom树上,渲染出正确的UI界面。

分析这个流程不难得知:页面初始化的时间大致由页面初始数据通信时间和初始渲染时间两部分构成。其中,数据通信的时间指数据从逻辑层开始组织数据到视图层完全接收完毕的时间,数据量小于64KB时总时长可以控制在30ms内。传输时间与数据量大体上呈现正相关关系,传输过大的数据将使这一时间显著增加。因而减少传输数据量是降低数据传输时间的有效方式。

2. 避免使用不当setData

在数据传输时,逻辑层会执行一次JSON.stringify来去除掉setData数据中不可传输的部分,之后将数据发送给视图层。同时,逻辑层还会将setData所设置的数据字段与data合并,使开发者可以用this.data读取到变更后的数据。因此,为了提升数据更新的性能,开发者在执行setData调用时,最好遵循以下原则:

1 不要过于频繁调用setData,应考虑将多次setData合并成一次setData调用;

2 数据通信的性能与数据量正相关,因而如果有一些数据字段不在界面中展示且数据结构比较复杂或包含长字符串,则不应使用setData来设置这些数据;

3 与界面渲染无关的数据最好不要设置在data中,可以考虑设置在page对象的其他字段下

提升数据更新性能方式的代码示例

Page({  onShow: function() {    // 不要频繁调用setData    this.setData({ a: 1 })    this.setData({ b: 2 })    // 绝大多数时候可优化为    this.setData({ a: 1, b: 2 })    // 不要设置不在界面渲染时使用的数据,并将界面无关的数据放在data外    this.setData({      myData: {        a: '这个字符串在WXML中用到了',        b: '这个字符串未在WXML中用到,而且它很长…………………………'      }    })    // 可以优化为    this.setData({      'myData.a': '这个字符串在WXML中用到了'    })    this._myData = {      b: '这个字符串未在WXML中用到,而且它很长…………………………'    }  }})复制代码

4 切勿在后台页面进行setData

在一些页面会进行一些操作,而到页面跳转后,代码逻辑还在执行,此时多个WEBview是共享一个js进程;后台的setData操作会抢占前台页面的渲染资源;

3. 用户事件使用不当

视图层将事件反馈给逻辑层时,同样需要一个通信过程,通信的方向是从视图层到逻辑层。因为这个通信过程是异步的,会产生一定的延迟,延迟时间同样与传输的数据量正相关,数据量小于64KB时在30ms内。降低延迟时间的方法主要有两个。

去掉不必要的事件绑定(WXML中的bind和catch),从而减少通信的数据量和次数; 2.事件绑定时需要传输target和currentTarget的dataset,因而不要在节点的data前缀属性中放置过大的数据。

4. 视图层渲染原理

1首次渲染

初始渲染发生在页面刚刚创建时。初始渲染时,将初始数据套用在对应的WXML片段上生成节点树。节点树也就是在开发者工具WXML面板中看到的页面树结构,它包含页面内所有组件节点的名称、属性值和事件回调函数等信息。最后根据节点树包含的各个节点,在界面上依次创建出各个组件。

在这整个流程中,时间开销大体上与节点树中节点的总量成正比例关系。因而减少WXML中节点的数量可以有效降低初始渲染和重渲染的时间开销,提升渲染性能。

简化WXML代码的例子

<view data-my-data="{{myData}}">   <view class="my-class" data-my-data="{{myData}}" bindtap="onTap"><text>   {{myText}}text>  view>view><view class="my-class" data-my-data="{{myData}}" bindtap="onTap">  {{myText}}view>复制代码

2 重渲染

初始渲染完毕后,视图层可以多次应用setData的数据。每次应用setData数据时,都会执行重渲染来更新界面。初始渲染中得到的data和当前节点树会保留下来用于重渲染。每次重渲染时,将data和setData数据套用在WXML片段上,得到一个新节点树。然后将新节点树与当前节点树进行比较,这样可以得到哪些节点的哪些属性需要更新、哪些节点需要添加或移除。最后,将setData数据合并到data中,并用新节点树替换旧节点树,用于下一次重渲染。

在进行当前节点树与新节点树的比较时,会着重比较setData数据影响到的节点属性。因而,去掉不必要设置的数据、减少setData的数据量也有助于提升这一个步骤的性能。

5. 使用自定义组件

自定义组件的更新只在组件内部进行,不受页面其他不能分内容的影响;比如一些运营活动的定时模块可以单独抽出来,做成一个定时组件,定时组件的更新并不会影响页面上其他元素的更新;各个组件也将具有各自独立的逻辑空间。每个组件都分别拥有自己的独立的数据、setData调用。

6. 避免不当的使用onPageScroll

每一次事件监听都是一次视图到逻辑的通信过程,所以只在必要的时候监听pageSrcoll

关于“微信小程序性能如何优化”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“微信小程序性能如何优化”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 微信小程序性能如何优化

本文链接: https://www.lsjlt.com/news/308361.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 微信小程序性能如何优化
    这篇文章主要介绍了微信小程序性能如何优化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序性能如何优化文章都会有所收获,下面我们一起来看看吧。为什么要做性能优化?一切性能优化都是为了体验优化1. 使用小程...
    99+
    2023-06-26
  • 如何优化微信小程序
    小编给大家分享一下如何优化微信小程序,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!避免使用本地大图片、大资源文件请避免在小程序的...
    99+
    2022-10-19
  • 微信小程序如何实现调起键盘性能优化
    这篇文章主要介绍微信小程序如何实现调起键盘性能优化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在小程序中,我们经常有调起键盘的操作场景,但是在不同的场景下解决方案不尽相同,还是需要...
    99+
    2022-10-19
  • 微信小程序怎么优化
    这篇文章主要介绍了微信小程序怎么优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。页面跳转优先采用navigator组件小程序提供了两种页面路由方式:a. navigator...
    99+
    2023-06-20
  • 微信小程序调起键盘性能优化的方法
    本篇内容主要讲解“微信小程序调起键盘性能优化的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序调起键盘性能优化的方法”吧!需求分析最近在项目中有一个需求,是从列表页点击评论按钮进入详...
    99+
    2023-06-26
  • 微信小程序怎么做优化
    微信小程序可以从这几方面优化:1.样式优化,小程序整体风格统一;2.布局优化,小程序各版块要有逻辑;3.搜索优化,标题使用行业关键词;4.使用优化,针对页面反应速度及导航设置进行优化;微信小程序可以从以下几方面来优化样式优化小程序整体风格样...
    99+
    2022-10-15
  • 如何优化PHP开发的微信小程序?
    如何优化PHP开发的微信小程序?随着微信小程序的普及,越来越多的开发者开始关注如何优化微信小程序的开发。在开发中,PHP是一种常用的后端语言,它提供了丰富的功能和严密的安全性。下面将介绍一些优化的方法和具体代码示例,以帮助开发者更好地使用P...
    99+
    2023-10-27
    优化 微信小程序 PHP开发
  • 微信小程序如何开发微信支付功能
    本篇内容主要讲解“微信小程序如何开发微信支付功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序如何开发微信支付功能”吧!用户请求开发者后台,发起下单请求发起请求前在小程序端调用&nbs...
    99+
    2023-06-26
  • 微信小程序渲染性能调优的示例分析
    小编给大家分享一下微信小程序渲染性能调优的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!小程序的双线程架构与传统的浏览器Web页面最大区别在于,小程序的是基于 双线程 模型的,在这...
    99+
    2022-10-19
  • 微信小程序 | 小程序组件化开发
    🖥️ 微信小程序 专栏:小程序组件化开发 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫...
    99+
    2023-09-09
    前端 javascript 开发语言 微信小程序 前端框架
  • 如何才能使用微信小程序
    这篇“如何才能使用微信小程序”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何才能使用微信小程序”文章吧。  第一步:填写账...
    99+
    2023-06-26
  • 微信小程序实战中如何使用类优化程序结构
    本篇文章为大家展示了微信小程序实战中如何使用类优化程序结构,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。虽然Javascript是一种脚本语言,但是依然可以定义和使用类。在这个小程序中,将监控点相关...
    99+
    2023-06-19
  • 微信小程序代码包大小的优化方法
    这篇文章主要讲解了“微信小程序代码包大小的优化方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“微信小程序代码包大小的优化方法”吧!setDatasetData是小程序开发中使用最频繁的接口...
    99+
    2023-06-26
  • 微信小程序怎么做好界面优化
    这篇文章主要讲解了“微信小程序怎么做好界面优化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“微信小程序怎么做好界面优化”吧!  微信小程序如何做好界面优化  1、页面新颖有趣  为了更好地以...
    99+
    2023-06-26
  • 【小程序】微信小程序如何获取微信公众号openid?
    一图总览 大家可以先看看下面的流程图,来了解笔者想实现的功能,简单来说就是两个不同主体间的小程序与公众号该如何产生关联。 注:为什么这里要强调不同主体呢,因为同主体的小程序与公众号是可以通过unionId来进行关联绑定。 ...
    99+
    2023-08-19
    微信小程序 小程序 微信
  • 微信小程序组件化如何开发
    本篇内容主要讲解“微信小程序组件化如何开发”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序组件化如何开发”吧!组件的定义组件是小程序中的一个重要概念,它能够将页面分解成独立的、可复用的部...
    99+
    2023-07-05
  • 微信小程序初始化如何配置
    这篇“微信小程序初始化如何配置”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序初始化如何配置”文章吧。小程序初始化配...
    99+
    2023-06-26
  • 微信小程序checkbox如何变小
    这篇“微信小程序checkbox如何变小”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序checkbox如何变小”文...
    99+
    2023-06-26
  • 微信小程序有哪些优点
    这篇文章给大家分享的是有关微信小程序有哪些优点的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。提供一个新的开发平台许多公司都想开发自己的APP,但是这需要太多的人力和物力。微信小程序的出现解决了他们的问题。只需输入...
    99+
    2023-06-27
  • 微信小程序有什么优势
    小编给大家分享一下微信小程序有什么优势,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  微信小程序的优点1、背靠微信超级社交流量  微信小程序位于微信生态中,享受...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作