微信小程序-性能优化

微信官方文档:性能与体验

启动性能

  1. 代码包体积优化,合理使用分包加载

    • 承载更多功能:小程序单个代码包的体积上限为2M,使用分包可以提升小程序代码包总体积上限,承载更多的功能与服务
    • 降低代码包下载耗时:使用分包后可以显著减少启动时需要下载的代码包大小,在不影响功能正常使用的前提下,有效降低启动耗时
    • 降低小程序代码注入耗时:使用分包可以避免不必要的组件和页面初始化
    • 降低内存占用:分包能够实现页面、组件和逻辑较粗粒度的按需加载,从而降低内存的占用
    • 分包的扩展功能,独立分包,分包预下载,分包异步化
  2. 避免非必要的全局自定义组件和插件

    如果自定义组件只在某个分包的页面中使用,应定义在页面的配置文件中
    如果插件只在某个分包中使用,仅在分包中引用插件

  3. 控制代码包内的资源文件

    小程序代码包在下载时会使用ZSTD算法进行压缩,图片、音频,视频、字体等资源文件会占用较多代码包体积,并且通常难以进一步被压缩,对于下载耗时的影响较大,所以,这类文件尽可能的部署到CDN,并使用URL引入,建议在代码包内的图片只包含一些体积小的图标

  4. 及时清理无用代码和资源

  5. 代码注入优化(按需注入,用时注入)

  6. 启动过程中减少同步API的调用(getSystemInfo、getStorageSync)

  7. 避免启动过程进行复杂运算

  8. 首屏渲染优化

    • 使用按需注入和用时注入,减少需要初始化的组件数量
    • 启用初始渲染缓存,可以在非首次启动时,提前将页面渲染结果展示给用户
    • 避免引用未使用的自定义组件

    页面渲染时,会初始化在当前页面配置和全局配置通过usingComponents引用的自定义组件,以及组件所依赖的其他自定义组件,当组件不被使用时,应及时从usingComponents中移除

    • 精简首屏数据
      首页渲染的耗时和页面的复杂度正相关,对于复杂页面可以选择进行渐进式的渲染,根据页面内容优先级,对于非关键部分或者不可见的部分进行延迟更新
      此外,与视图层渲染无关的数据应尽量不要放在data中,避免影响页面渲染时间

    • 提前首屏数据请求

    犹豫网络请求需要相对较长的时间,建议在onload或者更早的时机发起网络请求,而不应该等待onready之后

    • 数据预拉取:小程序冷启动时,由客户端通过微信后台提前向三方服务器拉取业务数据,减少用户等待时间
    • 周期性更新:未打开小程序的情况下,提前从三方服务器拉取数据,减少用户等待时间
    • 缓存请求数据,通过本地缓存的数据进行渲染视图
    • 使用骨架屏,灰色的区块大致勾勒轮廓,避免展示空白页面,提升用户等待意愿

运行时性能

  1. 合理使用setData

    • setData的流程
      1)逻辑层虚拟DOM树的遍历和更新,会触发组件生命周期和observer等
      2)将data从逻辑层传输到视图层
      3)视图层虚拟DOM树的更新、真实DOM元素的更新并触发页面渲染更新

    • 数据通信

      对于第2步,由于小程序的逻辑层和视图层是两个独立的运行环境、分属不同的线程或进程,不能直接进行数据共享,需要进行数据的序列化、跨线程/进程的数据传输、数据的反序列化,因此数据传输过程是异步的、非实时的

    • 使用建议
      1)data应只包括渲染相关的数据,setData的方式更新渲染无关的字段,会出发额外的渲染流程,或增加传输的数据量,影响渲染耗时
      2)页面或组件的data字段,应用来存放和页面或组件渲染相关的数据(即直接在wxml中出现的字段)
      3)页面或组件渲染间接相关的数据可以设置为纯数据字段,key使用setData设置并使用observers监听变化
      4)页面或组件渲染无关的数据,应挂在非data的字段下
      5)避免在data中包含渲染无关的业务数据
      6)避免使用data在页面或组件方法间进行数据共享
      7)避免滥用纯数据字段来保存可以使用非data字段保存的数据
      8)仅在需要进行页面内容更新时调用setData
      9)对连续的setData调用尽可能的进行合并
      10)选择合适的setData范围,组件的setData只会引起当前组件和子组件的更新,对于需要频繁更新的页面元素,可以封装为独立组建,在组建内部进行setData,必要时可以使用CSS contain属性限制计算布局、样式和绘制等范围
      11)setData应只传发生变化的数据,建议以数据路径形式钢鞭数组中某一项或对象的某个属性,而不是每次更新整个对象
      12)页面切后台后的更新操作,应尽量避免,或延迟到页面onShow后延迟进行
      13 )控制setData的频率,每次setData都会触发逻辑层虚拟DOM树的遍历和更新,也可能会导致触发一次完整的页面渲染流程。过于频繁(毫秒级)的调用setData,会导致一下后果:

    逻辑层JS线程持续繁忙,无法正常响应用户操作的事件,也无法正常完成页面切换
    视图层JS线程持续处于忙碌状态,逻辑层->视图层通信耗时上升,视图层收到消息的延时较高,渲染出现明显延迟
    视图层无法及时响应用户操作,用户滑动页面时干到明显卡顿,操作反馈延迟,用户操作时间无法及时传递到逻辑层,逻辑层亦无法及时将操作处理结果传递到视图层

  2. 渲染性能优化

    • scroll事件触发频率很高
    • 非必要不监听scroll事件,
    • 在实现与滚动相关动画时,优先考虑滚动驱动动画(仅<scroll-view>)或wxs响应事件
    • 不需要监听事件时,不要保留onPageScroll空函数
    • 避免在scroll事件监听函数中执行复杂逻辑
    • 避免在scroll事件监听中频繁调用setData或同步API
    • 需要监控元素曝光情况,建议使用节点布局相交状态监听IntersectionObserver推断某些节点是否可见,有多大比例可见(避免监听onPageScroll中持续调用selectQuery判断)
    • 建议一个页面wxml节点数量少于1000个,节点树深度少于30层,子节点数不大于60个
    • 对于比较复杂的数据对象,建议在onload或created时手动赋值到this上,而不是page构造时的参数传入
    • 选择高性能的动画实现方式

    优先使用CSS渐变、CSS动画、或小程序框架提供的其他动画实现方式完成动画
    在一些复杂场景下,如果上述方式不能满足,可以使用wxs响应事件动态调整节点的style属性做到动画效果。
    避免通过连续setData实现动画,不可避免,则尽可能改成自定义组件中的setData

  3. 页面切换优化

    • 页面切换时,会先调用前一个页面的onHide/onUnload方法,所以避免在onHide/onUnload执行耗时操作
    • 页面预加载
  4. 资源加载优化

    • 控制图片资源大小
    • 避免滥用image组件的widthFix和heightFix,尽量预先指定图片尺寸,避免加载完成后二次调整尺寸
  5. 内存优化

    • 合理使用分包
    • 使用按需注入和用时注入
    • 内存分析
    • 处理内存告警,必要时使用wx.onMemoryWarning监听内存告警时间,进行必要的内存清理,释放一些暂时不用的组件或者js对象
    • 内存泄露
      1)小程序长期持有页面实例,导致页面和引用组件无法正常销毁(事件监听持有页面this,页面实例呗页面外变量或者全局变量引用,页面实例呗异步回调长时间引用等)*
      2)事件监听未解绑
      3)未清理的定时器
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 先要进行性能优化首先需要了解小程序的实现原理:参考文档: https://github.com/febobo/we...
    青城墨阕阅读 1,071评论 0 1
  • 历史回顾: 微信小程序自定义组件 - 表格组件来啦 通过微信小程序来实现 “钉钉打卡” 记一次微信小程序项目分包,...
    尤小小阅读 2,777评论 0 2
  • 最近了解了一下微信小程序的性能优化,搜集了一些相关的方法,整理出来,和大家共享。 一、控制代码包大小 1. 开启开...
    CC前端手记阅读 274评论 0 0
  • 前言 2018年7月份微信公开课上的小程序专场中“小程序性能优化”模块中提到了小程序性能优化方面的知识,其中从启动...
    Gopal阅读 12,801评论 0 8
  • 微信小程序开发技巧以及性能优化 近一年写了挺多小程序,一直没有系统化整理过小程序相关知识体系,最近面试时候也有被问...
    LonJin_up阅读 773评论 0 1