小程序的渲染瓶颈,首屏加载优化

小程序的js

ECMAScript是一种由Ecma国际通过ECMA-262标准化的脚本程序设计语言, JavaScript 是 ECMAScript 的一种实现。理解 JavaScript 是 ECMAScript 一种实现后,可以帮助开发者理解小程序中的 JavaScript同浏览器中的 JavaScript 以及 NodeJS 中的 JavaScript 是不相同的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
浏览器中,脚本严格按照加载的顺序执行,而在小程序中的脚本执行顺序有所不同。小程序的执行的入口文件是 app.js 。并且会根据其中 require 的模块顺序决定文件的运行顺序,当 app.js 执行结束后,小程序会按照开发者在 app.json 中定义的 pages 的顺序,逐一执行。

小程序渲染层和逻辑层:

小程序的运行环境分成渲染层和逻辑层,WXML 模板和 WXSS 样式工作在渲染层,JS 脚本工作在逻辑层。

<view>{{ msg }}</view>
Page({
  onLoad: function () {
    this.setData({ msg: 'Hello World' })
  }
})

从这个例子我们可以看到3个点:
1.渲染层和数据相关。
2.逻辑层负责产生、处理数据。
3.逻辑层通过 Page 实例的 setData 方法传递数据到渲染层。
小程序的渲染层和逻辑层是通过两个线程管理,渲染层的界面使用了WebView 进行渲染;逻辑层采用JsCore线程运行JS脚本。那么他们之间是怎么通信的呢?
在这里插入图片描述
小程序逻辑层和渲染层的通信会由 Native (微信客户端)做中转,逻辑层发送网络请求也经由 Native 转发。

代码编译的过程

WXML编译:
WebView无法直接理解WXML标签,所以需要经过编译。
微信开发者工具内置了一个二进制的WXML编译器,这个编译器接受WXML代码文件列表,处理完成之后输出JavaScript代码,这段代码是各个页面的结构生成函数。

编译过程将所有的WXML代码最终变成一个JavaScript 函数,预先注入在WebView中。在运行时确定了页面路径之后,将路径作为参数传递给这个函数得到该页面的结构生成函数,页面结构生成函数接受页面数据,输出一段描述页面结构的JSON,最终通过小程序组件系统生成对应的HTML。
在这里插入图片描述

WXSS 编译
与 CSS 相比,WXSS 扩展的一些特性,包括rpx尺寸单位和样式导入语法,这些特性都是WebView无法直接理解的。
微信开发者工具内置了一个二进制的WXSS编译器,这个编译器接受WXSS文件列表,分析文件之间的引用关系,同时预处理rpx输出一个样式信息数组,如图10-4,每个WXSS文件对应于这个数组中的一项。
在这里插入图片描述
在运行时,根据当前的屏幕宽度,计算出1rpx对应多少像素单位,然后将样式信息数组转换成最终的样式添加到页面中。
JavaScript编译
微信客户端在运行小程序的逻辑层的时候只需要加载一个JS文件(我们称为app-service.js),而小程序框架允许开发者将 JavaScript 代码写在不同的文件中,所以在代码上传之前,微信开发者工具会对开发者的JS 文件做一些预处理,包括ES6转ES5和代码压缩(开发者可以选择关闭预处理操作),在服务器编译过程将每个JS文件的内容分别包裹在define域中,再按一定的顺序合并成 app-service.js 。其中对于页面JS和app.js需要主动require。
在这里插入图片描述

小程序的数据驱动

WXML结构实际上等价于一棵Dom树,通过一个JS对象也可以来表达Dom树的结构,WXML可以先转成JS对象,然后再渲染出真正的Dom树。如图:在这里插入图片描述
在setData改变数据的时候,会通过diff算法比较dom树的变化,产生的JS对象对应的节点就会发生变化,此时可以对比前后两个JS对象得到变化的部分,然后把这个差异应用到原来的Dom树上,从而达到更新UI的目的,这就是“数据驱动”的原理
小程序的每个页面各自有一个WebView线程进行渲染,但是小程序切换页面时,小程序逻辑层的JS脚本运行上下文依旧在同一个JsCore线程中

小程序的数据

App实例是单例的,因此不同页面直接可以通过App实例下的属性来共享数据。App构造器可以传递其他参数作为全局属性以达到全局共享数据的目的。
保持一个原则就可以提高小程序的渲染性能:每次只设置需要改变的最小单位数据。

页面常见的交互行为

触摸反馈,Toast和模态对话框,界面滚动
页面的用户行为

下拉刷新 onPullDownRefresh
上拉触底 onReachBottom
页面滚动 onPageScroll 用户转发
onShareAppMessage

小程序的协同工作:

在这里插入图片描述

小程序的底层框架

双线程模型
小程序是基于双线程模型的,在这个模型中,小程序的逻辑层与渲染层分开在不同的线程运行,这跟传统的Web 单线程模型有很大的不同,使得小程序架构上多了一些复杂度,也多了一些限制。
一般来说,渲染界面的技术有三种:

  1. 用纯客户端原生技术来渲染
  2. 用纯 Web 技术来渲染
  3. 介于客户端原生技术与 Web 技术之间的,互相结合各自特点的技术(下面统称
    Hybrid 技术)来渲染

由于小程序的宿主是微信,所以我们不太可能用纯客户端原生技术来编写小程序 。如果这么做,那小程序代码需要与微信代码一起编包,跟随微信发版本,这种方式跟开发节奏必然都是不对的。因此,我们需要像Web 技术那样,有一份随时可更新的资源包放在云端,通过下载到本地,动态执行后即可渲染出界面。
但是,如果我们用纯 Web 技术来渲染小程序,在一些有复杂交互的页面上可能会面临一些性能问题,这是因为在 Web 技术中,UI渲染跟 JavaScript 的脚本执行都在一个单线程中执行,这就容易导致一些逻辑任务抢占UI渲染的资源。

按照上面的讨论,使用纯客户端原生技术或纯 Web 技术都有各自的缺点,那如果使用两者结合起来的 Hybrid 技术来渲染小程序,能否优于各自独立渲染的技术方案呢?实际上,这种 Hybrid 技术在业界过去几年里演化过数种技术方案,典型的如早期的PhoneGap[1],还有近两年流行的React Native[2](下称 RN),还有像微信网页里的 JS-SDK[3] 这种轻量级的应用。
最终,我们选择类似于微信 JSSDK 这样的 Hybrid 技术,即界面主要由成熟的 Web 技术渲染,辅之以大量的接口提供丰富的客户端原生能力。同时,每个小程序页面都是用不同的WebView去渲染,这样可以提供更好的交互体验,更贴近原生体验,也避免了单个WebView的任务过于繁重。

Exparser框架

Exparser是微信小程序的组件组织框架,内置在小程序基础库中,为小程序的各种组件提供基础的支持。小程序内的所有组件,包括内置组件和自定义组件,都由Exparser组织管理。

1.基于Shadow DOM模型:模型上与WebComponents的ShadowDOM高度相似,但不依赖浏览器的原生支持,也没有其他依赖库;实现时,还针对性地增加了其他API以支持小程序组件编程。
2.可在纯JS环境中运行:这意味着逻辑层也具有一定的组件树组织能力。
3.高效轻量:性能表现好,在组件实例极多的环境下表现尤其优异,同时代码尺寸也较小。

小程序中,所有节点树相关的操作都依赖于Exparser,包括WXML到页面最终节点树的构建、createSelectorQuery调用和自定义组件特性等。

性能优化

小程序启动的时候:下载小程序代码包、加载小程序代码包、初始化小程序首页。
代码包下载:下载到的小程序代码包不是小程序的源代码,而是编译、压缩、打包之后的代码包。
从开发者的角度看,控制代码包大小有助于减少小程序的启动时间。

精简代码,去掉不必要的WXML结构和未使用的WXSS定义。

减少在代码包中直接嵌入的资源文件。

压缩图片,使用适当的图片格式。

如果小程序比较复杂,优化后的代码总量可能仍然比较大,此时可以采用分包加载的方式进行优化。
采用分包时,小程序的代码包可以被划分为几个:一个是“主包”,包含小程序启动时会马上打开的页面代码和相关资源;其余是“分包”,包含其余的代码和资源。这样,小程序启动时,只需要先将主包下载完成,就可以立刻启动小程序。这样就可以显著降低小程序代码包的下载时间。
在这里插入图片描述
页面层级准备
在小程序启动前,微信会提前准备好一个页面层级用于展示小程序的首页。除此以外,每当一个页面层级被用于渲染页面,微信都会提前开始准备一个新的页面层级,使得每次调用wx.navigateTo都能够尽快展示一个新的页面。

页面层级的准备工作分为三个阶段。
第一阶段是启动一个WebView,在iOS和Android系统上,操作系统启动WebView都需要一小段时间。
第二阶段是在WebView中初始化基础库,此时还会进行一些基础库内部优化,以提升页面渲染性能。
第三阶段是注入小程序WXML结构和WXSS样式,使小程序能在接收到页面初始数据之后马上开始渲染页面(这一阶段无法在小程序启动前执行)。

数据通信
在小程序启动或一个新的页面被打开时,页面的初始数据(data)和路径等相关信息会从逻辑层发送给视图层,用于视图层的初始渲染。Native层会将这些数据直接传递给视图层,同时向用户展示一个新的页面层级,视图层在这个页面层级上进行界面绘制。视图层接收到相关数据后,根据页面路径来选择合适的WXML结构,WXML结构与初始数据相结合,得到页面的第一次渲染结果。
在这里插入图片描述
更新数据通信
初始渲染完毕后,视图层可以在开发者调用setData后执行界面更新。在数据传输时,逻辑层会执行一次JSON.stringify来去除掉setData数据中不可传输的部分,之后将数据发送给视图层。
为了提升数据更新的性能,开发者在执行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中用到,而且它很长…………………………'
    }

  }
})

视图更新渲染
视图层在接收到初始数据(data)和更新数据(setData数据)时,需要进行视图层渲染。在一个页面的生命周期中,视图层会收到一份初始数据和多份更新数据。收到初始数据时需要执行初始渲染,每次收到更新数据时需要执行重渲染。
在这里插入图片描述
在这里插入图片描述
swiper组件数据加载慢怎么办?列表数据量太大怎么办?
先初始化数组,只给前三个赋值。可以只渲染3个,然后在swiperChange里面,每次change的时候删掉一个listCopy已经显示的值,再加上一个未显示的值。
首屏时间指的是什么?
首屏时间是指用户从打开小程序看到第一屏主要内容的时间,首屏时间太长会导致用户长时间看到的都是白屏,影响使用体验。
优化首屏时间,可以分为以下几种情况:

首屏渲染的内容较多,需要集合多份数据进行渲染。这种情况需要开发者把内容分优先级,把优先级高的内容做优先展示,缩短白屏时间;
首屏内容依赖的数据从服务端请求的时间太长。开发者需要从服务端侧具体分析服务端数据返回的时间长的原因;
一次性渲染数据太大或依赖的计算过于复杂。减少渲染的数据量、优化渲染相关数据的算法可以解决这类问题。

首屏的加载速度除了和网络有关系,和小程序自身启动机制也有关系,首先要了解小程序的启动机制,小程序的启动分为冷启动和热启动。
检查

  1. 检查图片 检查图片包括:
  2. 图片是否过大 检查图片属性,如果图片加载过大,就利用工具压缩图片。此时要考虑如果图片像素要求很高,压缩要注意不能失真,其次压缩要注意等比例,留意是否不小心剪裁了图片大小等。
  3. 图片懒加载 如果首页要加载的有很多列表或者图片展示,此时要注意图片加载时长,如果超过一定时间,懒加载是个不错的办法。
  4. 图片是否可以用cdn托管 对于icon小图标可以放在小程序项目image文件夹里,但是如果图片占用资源,放在cdn托管既可以缩小代码包的大小还可以提升加载效率。。
  1. 检查首屏接口耗时 一个接口一个接口的排查,在network中查看加载的时间,逐个排查原因,所有请求最好在1s内返回结果。
  1. 检查有无错误日志
    在JS中如果在同步任务中,一个错误的发生会造成后面整段代码都不执行。
    此时应该排查下是否有异常错误,避免出现首屏一直处于加载的状态。必要的时候try catch处理。
  1. 检查界面是否使用定时器 定时器一般设置为全局变量,或者定时器和倒计时相关功能绑定,用定时器一定要记得及时回收。
  1. 检查基础版本库
    如果首页使用里自定义组建,不同颁布要注意基础库要一致。可能不同基础库有些功能的支持条件不一致,要做兼容处理。

优化策略

  1. 分包加载:减少代码包

  2. 利用缓存:快速展示。
    当小程序被销毁需要重新渲染界面时,此时冷启动会再次请求接口加载数据,可以利用小程序提供了缓存方法wx.setStorage、wx.getStorage将数据存储在本地。

  3. 不使用空白屏
    视觉效果,增加交互感。
    当数据没有被渲染时展示页面的基本骨架,利用toast提示加载进度,或者loading提示,给用户反馈出加载的进度,会延长用户的等待时间。把优先级高的内容做优先展示,缩短白屏时间;

  4. 首页架构调整
    代码量的减少,主要是减少dom树的构建。

  5. 渲染优化
    避免首页多次setData,以上有介绍,初始渲染相关问题。

  6. 使用懒注入

{
  "lazyCodeLoading": "requiredComponents"
}

注意:添加这项配置后,未使用到的代码文件将不被执行
7. 提前首屏数据请求
大部分小程序在渲染首页时,需要依赖服务端的接口数据,小程序为开发者提供了提前发起数据请求的能力:

数据预拉取:能够在小程序冷启动的时候通过微信后台提前向第三方服务器拉取业务数据,当代码包加载完时可以更快地渲染页面,减少用户等待时间,从而提升小程序的打开速度。
周期性更新:在用户未打开小程序的情况下,也能从服务器提前拉取数据,当用户打开小程序时可以更快地渲染页面,减少用户等待时间。

小程序动画的实现原理

简单来说,整个动画实现过程就三步:

创建一个动画实例 animation。
调用实例的方法来描述动画。
最后通过动画实例的 export 方法导出动画数据传递给组件的 animation 属性。

在这里插入图片描述
也可以通过css3动画样式来实现。
小程序直播-疯狂点赞动画实现原理解析
需求分析:

点赞动画图片大小不一,运动轨迹也是随机的。
点赞动画图片都是先放大再匀速运动。
快到顶部的时候,逐渐缩小并消失。
收到大量的点赞请求的时候,点赞动画不扎堆,井然有序持续出现。

具体实现参考该链接: https://www.yuque.com/caixiaozhen/fx8n76/zvyl06

h5原生功能怎么和webview通信呢?

在微信打开的H5可以调用到微信原生一些能力,例如公众号文章里可以打开公众号的Profile页。所以早期微信提供了Webview到原生的通信机制,在Webview里注入JSBridge的接口,使得H5可以通过它调用到原生能力。

我们可以通过JSBridge微信预览图片的功能:

WeixinJSBridge.invoke('imagePreview', {
  current: https://img1.gtimg.com/1.jpg',
  urls: [
    'https://img1.gtimg.com/1.jpg',
    'https://img1.gtimg.com/2.jpg',
    'https://img1.gtimg.com/3.jpg'
  ]
})

在这里插入图片描述

wx.previewImage({
  current: https://img1.gtimg.com/1.jpg',
  urls: [
    'https://img1.gtimg.com/1.jpg',
    'https://img1.gtimg.com/2.jpg',
    'https://img1.gtimg.com/3.jpg'
  ]
})
阳阳C
关注 关注
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一篇关于小程序数据渲染性能的优化
2202_75483062的博客
01-27 389
首先,我们要知道小程序是如何实现逻辑层与渲染层进行通信的,小程序逻辑层提供了设置页面数据的 API——setData。通过setData 将数据从逻辑层发送到渲染层。 这里需要注意的是,setData 发送数据时,逻辑层发送到渲染层是异步方式,同时改变对应this.data 的值是同步方式。如果直接修改this.data而不调用 this.setData不仅无法改变页面状态,还会造成数据不一致。 举个例子,在表单提交时,我们采用Token来避免数据重复提交。如果使用setData是不能判断数
微信小程序 优化经验
qq_35123187的博客
08-07 290
1.页面跳转传参解码 escape(JSON.stringify(options)) => JSON.parse(unescape(options)) 2.当使用button组件时 千万记住: 不要设置其position为inherit、initial、static之类(只能为relative、fixed、absolute), 否则在页面中不管你点哪里都会触发button的tap事件 3...
微信小程序首页加载优化
weixin_45695200的博客
09-15 2641
冷启动 如果用户首次打开,或小程序销毁后被用户再次打开,此时小程序需要重新加载启动,即冷启动。 触发场景 新用户第一个进入小程序 用户已经进入过小程序,但小程序被销毁(原因:小程序被删除或小程序在后台等待时间过长,自动销毁了) 首屏加载慢大部分原因是冷启动时加载的数据过多,需要依赖过多的服务端的接口数据等 热启动 如果用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时小程序并未被销毁,只是从后台状态进入前台状态,这个过程就是热启动。 触发场景:用户打开了小程序,在小程序没有被销毁时再次打开小
微信小程序首次加载优化
最新发布
qq_43128140的博客
03-28 793
首次加载速度对于微信小程序的用户体验至关重要。微信小程序的成功与否很大程度上取决于其性能和用户体验,而首次加载速度是其中最为关键的因素之一。首屏时间不超过 5 秒;渲染时间不超过 500ms;每秒调用 setData 的次数不超过 20 次;setData 的数据在 JSON.stringify 后不超过 256kb;页面 WXML 节点少于 1000 个,节点树深度少于 30 层,子节点数不大于 60 个;所有网络请求都在 1 秒内返回结果;
如何提高小程序加载速度?
weixin_49021391的博客
10-27 1846
如何提高小程序加载速度?
微信小程序性能优化入门指南
weixin_34329187的博客
11-05 910
小程序从发布到现在也已经有将近两年的时间,越来越来多的公司开始重视小程序生态带来的流量,今年也由于小程序平台对外能力的越来越多的开放以及小程序平台的自身优化,越来越多的开发者也自主的投入到小程序的开发当中,现在,作为前端如果会写小程序,绝对是一个不折不扣的面试加分项。相信不少人刚接触小程序时的感觉大都是小程序很简单,开发只要是会写html...
skeletons首屏渲染小程序骨架屏动态注入组件
08-10
skeletons 首屏渲染-小程序骨架屏动态注入组件
微信小程序Markdown渲染
05-10
下载并拷贝wemark目录到小程序根目录 WXSS中引用样式:@import '../wemark/wemark.wxss' WXML中引用结构: JS中引用wemark:var wemark = require('wemark') 2. JS部分 首先需要确定一个用于wemark渲染使用的数据...
小程序redux性能优化,提升三倍渲染速度
03-29
最近用户反馈我们的小程序很卡,打开商品列表需要四五秒时间,带着这个疑问,我决定对小程序做个全面的性能优化,要做性能优化,必须先理清以下三个关键点。 1、产生性能问题的关键点  2、度量性能指标  3、寻找...
微信小程序渲染性能调优小结
10-16
主要介绍了微信小程序渲染性能调优,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
微信小程序优化
03-29
小程序的视图层目前使用 WebView 作为渲染载体,而逻辑层是由独立的 JavascriptCore 作为运行环境。在架构上,WebView 和 JavascriptCore 都是独立的模块,并不具备数据直接共享的通道。当前,视图层和逻辑层的数据...
单页应用的优缺点,单页应用首屏加载优化小程序首次启动速度优化
qq_57334853的博客
07-11 647
单页应用的优缺点 单页应用,简称(Single Page Application)是指整个应用只一个HTML页面,所有的功能和交互都在这个页面完成,利用JavaScript动态改变HTML内容。
微信开发之微信小程序性能优化
lee前端技术站
07-01 2862
微信小程序的开发,是当前移动端开发的重点,随着这么多年微信小程序的发展,也基本进入到了一个相对稳定的状态,大家当前不紧紧对功能要求更高了,对性能的要求也是越来越高,那么微信小程序的性能优化就是当前的重点,那么微信小程序性能优化应该从哪些方面入手呢? 首先看下小程序加载流程: 以上图就是小程序加载流程,主要分三个步骤: 资源准备,就是说小程序在下载资源包; 业务代码注入和渲染,就是说小程序开始将业务代码注入到视图层和逻辑层,然后开始渲染页面; 异步数据请求,就是当进入首页如果有数据请求,那么
小程序首页白屏优化,并举例说明
BradenHan的专栏
11-25 540
合理使用异步渲染:对于复杂的页面结构或有大量数据需要处理的情况,可以采用异步渲染的方式,先展示页面框架和必要内容,再进行异步加载渲染。图片懒加载:对于非首屏显示的图片,可采用图片懒加载的方式,只有当用户滚动到相关区域时才加载图片,减少首页加载时对图片资源的消耗。预加载关键资源:对于首页必须使用的关键资源,可采用预加载的方式,在用户进入小程序时提前加载这些资源,减少用户感知的等待时间。使用分包加载:将首页内容与其他页面的内容分开打包,只加载当前页面所需的资源,避免不必要的资源加载,提升首页加载速度。
微信小程序性能优化
前端御书房
02-22 887
删除无用代码、资源文件开启按需加载组件分包初始渲染缓存提前请求数据在onLoad或更早发起请求使用本地缓存。
微信小程序--首页加载界面demo
海到无边天作岸 山登绝顶我为峰
11-15 4314
效果图 代码 wxml <!-- loading.wxml --> <view class="loading"> <view class="dot" animation="{{alpha[0]}}"></view> <view class="dot" animation="{{alpha[1]}}"></view>...
小程序首屏加载
hkduan的博客
04-20 478
检查图片 检查图片包括: 图片是否过大 图片懒加载 如果首页要加载的有很多列表或者图片展示,此时要注意图片加载时长,如果超过一定时间,懒加载是个不错的办法。 图片是否可以用cdn托管 对于icon小图标可以放在小程序项目image文件夹里,但是如果图片占用资源,放在cdn托管既可以缩小代码包的大小还可以提升加载效率。 检查首屏接口耗时 一个接口一个接口的排查,在network中查看加载时间,逐个排查原因,所有请求最好在1s内返回结果。 检查有无错误日志 在JS中如果在同步任务中,一..
京东大咖实战分享:小程序性能优化实践
mengluzhixing的专栏
03-01 479
作为京东购物小程序黄金流程之一,购物车汇聚了大量的营销玩法,页面内容丰富多样。页面节点树庞大、千变万化的特点,导致性能问题比较突出且优化难度较大。在纯技术角度的性能优化达到瓶颈之后,我们开始尝试基于业务进行性能优化。实际上,购物车页的数据加载渲染采用了多策略组合方式,根据场景和当前机器环境的特点动态选择数据加载渲染策略,目的是在保障用户刚需的同时为更多用户提供更极致的体验。例如某些场景使用缓存模式+自动分页渲染,而在一些兜底场景使用的是常规模式+触底渲染等等。
关于小程序网络数据请求延迟导致页面渲染失败问题
yxp 的博客
05-19 3937
关于小程序网络数据请求延迟导致页面渲染失败问题解决方法: 定义回调函数示例代码app.js 文件index.js 文件index.wxml 文件index.css 文件 微信小程序 wx.request 网络请求默认为异步,js 文件内 wx.request 发出请求后,主程序流程将继续向下执行,此时 wxml 页面若有服务器返回的数据绑定,将输出一个空白。当异步请求完毕数据返回后,wxml 页面已经渲染完毕,返回的数据不会显示在页面。
小程序页面卡顿,前端应该怎么优化
07-16
小程序页面出现卡顿时,可以考虑以下前端优化措施: 1. 减少渲染层级:减少页面中的嵌套层级,避免过深的DOM树结构。可以通过减少组件的嵌套或使用组件化开发来实现。 2. 虚拟列表:对于大量数据的列表展示,可以采用虚拟列表技术,只渲染可见区域的内容,减少渲染的元素数量。 3. 图片懒加载:将页面中的图片设置为懒加载模式,在图片进入可见区域时再进行加载,减少页面初始加载时的网络请求。 4. 避免过多的动画效果:过多或复杂的动画效果可能会导致页面卡顿,可以适度减少或优化动画效果的实现方式。 5. 异步操作:使用异步操作来处理耗时的任务,避免阻塞主线程。例如使用`setTimeout`、`setInterval`、Promise等来处理耗时的计算或网络请求。 6. 数据缓存和本地存储:合理利用小程序提供的数据缓存和本地存储功能,减少重复获取和请求数据的次数。 7. 使用性能分析工具:使用小程序性能分析工具(如微信开发者工具提供的性能分析功能),定位性能瓶颈,找出具体的优化点。 8. 代码优化和压缩:减少不必要的代码,对代码进行合理的压缩和优化,减小包体积和加载时间。 9. 异步渲染:使用小程序提供的异步渲染能力,将页面渲染任务分解为多个小任务,减少单次渲染时间。 10. 使用合适的数据绑定方式:根据实际场景选择适合的数据绑定方式,如使用单向绑定或双向绑定,减少数据绑定带来的性能开销。 综上所述,通过合理使用上述优化措施,可以提升小程序页面的性能和流畅度。在优化过程中,也可以结合具体应用场景和性能分析工具进行定制化的优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 删除对象属性的三种方法 37552
  • vite打包工具的介绍 12593
  • 移动端开发的vconsole插件 6829
  • 客户端存储和http缓存 5224
  • vue+ts的书写规范 4591

分类专栏

  • 浏览器 1篇
  • css 1篇
  • diff 1篇

最新评论

  • new 关键字做了什么

    Yi_qian1000: blackPlayer.__proto__ === Player.prototype

  • 登入态的几种方式

    奔跑的乌龟1.0: 这么好的文章可惜他们不会欣赏

  • IndexedDB 数据库的使用

    阳阳C: 感谢认可

  • IndexedDB 数据库的使用

    CSDN-Ada助手: 非常感谢博主的用心分享,这篇博客对于我这个刚接触IndexedDB的小白来说非常有帮助。博客内容详细,讲解清晰,让我对这个数据库有更深入的了解。希望博主能够再接再厉,分享更多的知识,让我们受益更多。再次感谢博主的辛勤付出! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。

  • this指向 js作用域链

    Iam_楠: // 第三种 函数作为参数传递 function run(fn) { fn() } run(obj1.fn) // 这里传进去的是一个引用 可以说一说这一段的理解吗?

大家在看

  • 服务器硬件基础知识的初步了解 438
  • 基于Vue的物联网可视化平台,同时集成了安全预警系统+源代码+文档说明+界面演示
  • 网络运维:企业稳定运行的基石 67
  • 毕业设计-基于VUE搭建的关于医疗资源可视化系统+源代码+文档说明+界面截图
  • 基于Flask,jquery,echarts,JavaScript实现的餐饮类消费数据的可视化分析系统+源代码+文档说明+界面截

最新文章

  • 数组的几种常用方式汇总
  • IndexedDB 数据库的使用
  • 将React 类组件转换成 函数式组件
2023年1篇
2022年7篇
2021年66篇
2020年41篇
2019年2篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司黄石网站建设设计推荐黄冈百度关键词包年推广报价大同SEO按天计费长治英文网站建设推荐云浮关键词排名包年推广价格黄南百姓网标王报价日照SEO按天扣费公司济南关键词排名哪家好安阳网站搜索优化哪家好荷坳百度竞价价格临汾关键词按天计费公司益阳百度关键词包年推广推荐珠海SEO按天扣费多少钱菏泽百度竞价包年推广价格昭通seo网站优化报价爱联网站优化排名价格济源SEO按天计费襄樊百姓网标王推广公司吕梁百度竞价包年推广价格兰州seo网站优化推荐芜湖百姓网标王推广价格枣庄网站排名优化价格楚雄seo网站推广哪家好宝鸡品牌网站设计价格信阳建网站公司喀什网站推广系统哪家好宿州网站优化排名价格东莞模板网站建设固原百度网站优化价格益阳SEO按效果付费推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化