微信小程序开发教学系列(9)- 小程序页面优化
第9章 小程序页面优化
在开发小程序时,页面性能优化是非常重要的一项任务。优化页面性能可以提升用户体验,使小程序更加流畅和高效。本章将介绍一些常见的页面优化方法和技巧,帮助您提升小程序的性能。
9.1 页面性能优化的基本原则
页面性能优化的目标是减少页面加载时间和提升页面渲染速度,从而提供更好的用户体验。以下是一些基本的优化原则:
-
减少网络请求:减少页面通过网络请求获取资源的次数,可以缩短页面加载时间。合并和压缩CSS和JavaScript文件,使用CDN加速等方法都可以减少网络请求次数。
-
缓存静态资源:合理利用缓存,将不经常变化的静态资源进行缓存,下次访问时可以直接从缓存读取,减少请求次数和传输时间。
-
延迟加载:将页面上的某些内容(如图片、音频、视频等)延迟加载,当用户需要时再加载,可以减少初始加载时间,提升用户感知速度。
-
压缩和合并资源:对CSS和JavaScript文件进行压缩和合并,可以使用工具来进行压缩和合并。例如,可以使用webpack等构建工具来自动压缩和合并JavaScript文件,使用CSS压缩工具来压缩CSS文件。
-
减少重排和重绘:当页面发生变化时,浏览器会触发重排(Layout)和重绘(Repaint)操作,这是非常耗时的。为了减少重排和重绘,可以采取一些措施,如避免频繁操作DOM、使用CSS3动画代替JavaScript动画等。
-
使用懒加载:对于较长的页面或大量的图片资源,可以使用懒加载技术。即将页面上的某些内容延迟加载,当用户滚动到该内容时再进行加载,可以减少页面初始加载时间。
-
预加载关键资源:对于一些关键资源,可以在页面加载完成后预先加载,以提前获取资源并缩短用户等待时间。例如,可以使用
<link rel="preload">标签来预加载CSS文件。 -
优化图片加载:图片通常是页面中占用带宽的主要资源,优化图片加载对于页面性能的提升非常重要。可以使用图片压缩工具来减小图片文件的大小,使用适当的图片格式(如JPEG、PNG、WebP等),并使用图片懒加载技术。
9.减少HTTP请求:每个HTTP请求都会带来一定的延迟,因此减少页面中的HTTP请求次数是提升性能的重要手段。可以通过合并CSS和JavaScript文件、使用CSS Sprites合并小图标、使用字体图标代替图片等方式来减少HTTP请求次数。
-
使用缓存:合理利用浏览器缓存机制,将一些静态资源进行缓存,可以减少重复的请求,提高页面加载速度。可以通过设置合适的缓存控制头、使用ETag和Last-Modified等机制来实现缓存。
-
压缩资源:使用压缩算法对CSS、JavaScript和HTML等文件进行压缩,可以减小文件的体积,加快文件的传输速度。可以使用工具如UglifyJS、Terser等对JavaScript进行压缩,使用工具如CSSNano、csso等对CSS进行压缩。
-
异步加载:将一些不影响页面展示的资源进行异步加载,可以提高首屏展示速度。例如,将统计代码或广告代码异步加载,不影响页面的渲染。
9.2 图片懒加载和延迟加载
图片通常是页面中占用带宽的主要资源,对于小程序页面优化来说,优化图片加载是非常重要的一步。其中,图片懒加载和延迟加载是常用的优化方式,可以减少初始加载时间,提高用户的感知速度。
图片懒加载
图片懒加载是指将页面中的图片延迟加载,当图片出现在可视区域内时再进行加载。这样可以减少初始加载时对图片资源的请求,提高页面加载速度。
在小程序中,可以通过使用Intersection Observer API来实现图片懒加载。该API可以监听元素与视口的交叉情况,当元素出现在视口内时触发回调函数,我们可以在回调函数中将图片的src属性设置为真正的图片地址,实现延迟加载。
以下是一个示例代码:
// 在页面的onLoad生命周期中初始化Intersection Observer
Page({onLoad() {const observer = this.createIntersectionObserver();observer.relativeToViewport().observe('.lazy-img', (res) => {if (res.intersectionRatio > 0) {const { dataset } = res.target;const { src } = dataset;res.target.src = src;observer.unobserve(res.target); // 图片加载后取消监听}});},
});
在上面的示例中,我们使用createIntersectionObserver函数创建了一个Intersection Observer实例,并通过observe方法指定监听的元素选择器。当元素出现在视口内时,触发回调函数,我们可以在回调函数中将图片的src属性设置为真正的图片地址。
在页面中,需要将需要懒加载的图片添加一个class名为"lazy-img",并在dataset中设置真正的图片地址。
<image class="lazy-img" data-src="https://example.com/image.jpg"></image>
在上面的示例中,我们将需要懒加载的图片添加了class名为"lazy-img",并在dataset中设置了真正的图片地址。
通过这种方式,页面加载时,图片的src属性为占位图或者空白图,当图片进入可视区域时,触发回调函数,将src属性设置为真正的图片地址,实现图片懒加载效果。
延迟加载
延迟加载是指将页面上的某些内容在需要时再进行加载。这在页面中存在较长内容或大量图片资源时特别有用,可以减少初始加载时间,提升用户的感知速度。
对于小程序,可以使用条件渲染和事件触发来实现延迟加载。通过在页面上添加一个触发事件,当用户滚动到该触发事件时,再进行内容的加载。
以下是一个示例代码:
<!-- 在wxml中添加触发事件 -->
<view bind:scrolltolower="loadMore">加载更多</view>
// 在页面中实现延迟加载
Page({data: {items: [], // 存储需要延迟加载的内容loaded: false, loaded: false, // 标记内容是否已加载完毕},onLoad() {// 模拟异步请求数据setTimeout(() => {const items = [1, 2, 3, 4, 5]; // 假设这是需要延迟加载的内容this.setData({items,loaded: true, // 数据加载完成后将loaded设为true});}, 2000);},loadMore() {if (this.data.loaded) {// 模拟加载更多数据setTimeout(() => {const newItems = [6, 7, 8, 9, 10]; // 假设这是新加载的内容const items = this.data.items.concat(newItems); // 将新加载的内容与原有内容合并this.setData({items,});}, 1000);}},
});
在上面的示例代码中,我们通过在页面上添加一个触发事件bind:scrolltolower="loadMore"来实现延迟加载。当用户滚动到页面底部时,触发loadMore方法。
在onLoad生命周期中,我们使用setTimeout模拟异步请求数据,并将需要延迟加载的内容存储在items中。在数据加载完成后,将loaded设为true。
在loadMore方法中,我们判断loaded是否为true,如果是,则模拟加载更多数据,并将新加载的内容与原有内容合并,最后通过setData更新页面的数据。
通过这种方式,用户在滚动到页面底部时,才会加载更多的内容,避免了一次性加载大量的数据,提高了页面的加载速度和用户的体验感。
9.3 页面渲染和数据加载优化
除了延迟加载和图片懒加载,还有一些其他的优化方法可以提高页面的渲染速度和数据加载效率。
使用setData优化数据更新
在小程序中,使用setData方法可以更新页面的数据,并触发页面的重新渲染。然而,频繁地调用setData会导致页面的重复渲染,降低性能。
为了优化数据更新,可以将多个数据的更新操作合并为一次setData调用。例如,将需要更新的数据存储在一个对象中,然后一次性将对象传递给setData,减少setData的调用次数。
以下是一个示例代码:
Page({data: {count: 0,name: '',age: 0,},updateData() {const newData = {count: this.data.count + 1,name: 'John',age: 25,};this.setData(newData);},
});
在上面的示例中,我们通过将需要更新的数据存储在一个对象newData中,然后一次性将newData传递给setData方法,实现了优化数据更新的效果。
使用分页加载
当页面需要加载大量数据时,为了避免一次性加载所有数据,可以考虑使用分页加载的方式。通过分页加载,可以将数据划分为多个页面,并在需要时逐页加载,减少一次性加载大量数据的负担,提高页面的加载速度。
在小程序中,可以通过监听页面滚动事件来实现分页加载。当用户滚动到页面底部时,触发加载下一页的操作。
以下是一个示例代码:
Page({data: {page: 1, // 当前页数pageSize: 10, // 每页加载的数据量dataList: [], // 存储加载的数据},onLoad() {// 初始化加载第一页数据this.loadData();},onReachBottom() {// 滚动到页面底部时触发加载下一页数据this.loadNextPage();},loadData() {// 模拟异步请求数据setTimeout(() => {const { page, pageSize, dataList } = this.data;const newData = []; // 模拟从服务器获取的新数据if (newData.length > 0) {const newPage = page + 1;const newDataList = dataList.concat(newData);this.setData({page: newPage,dataList: newDataList,});}}, 1000);},loadNextPage() {const { page } = this.data;// 加载下一页数据this.loadData();},
});
在上面的示例代码中,我们使用page和pageSize来管理当前页数和每页加载的数据量。在页面的onLoad生命周期中,我们初始化加载第一页的数据,在loadData函数中模拟了异步请求数据的过程。当数据加载成功后,将新数据与已有的数据拼接起来,更新页面的数据。
当用户滚动到页面底部时,会触发onReachBottom事件,进而调用loadNextPage函数加载下一页的数据。在loadNextPage函数中,我们只需调用loadData函数即可加载下一页的数据。
通过使用分页加载的方式,可以减少一次性加载大量数据的负担,提高页面的加载速度。
9.4 小程序页面优化总结
在本章中,我们介绍了一些常见的页面优化方法和技巧,包括延迟加载、图片懒加载、使用setData优化数据更新、分页加载等。
通过合理地应用这些优化方法,可以提升小程序的性能和用户体验,使页面加载更快、流畅。
在进行页面优化时,需要根据具体的业务场景和需求来选择合适的优化方法。同时,也需要通过测试和性能监控工具来评估优化效果,及时调整和改进优化方案。
相关文章:
微信小程序开发教学系列(9)- 小程序页面优化
第9章 小程序页面优化 在开发小程序时,页面性能优化是非常重要的一项任务。优化页面性能可以提升用户体验,使小程序更加流畅和高效。本章将介绍一些常见的页面优化方法和技巧,帮助您提升小程序的性能。 9.1 页面性能优化的基本原则 页面性…...
如何将储存在Mac或PC端的PDF文件传输到移动设备呢?
iMazing是一款iOS设备管理软件,用户借助它可以将iPad或iPhone上的文件备份到PC或Mac上,还能实现不同设备之间的文件传输,能很大程度上方便用户进行文件管理。 在阅读方面,iPad和iPhone是阅读PDF的优秀选择,相较于Mac或…...
一图看懂架构划分原则:技术划分 OR 领域划分?
架构划分原则 技术划分 描述: 按技术用途组织系统组件典型示例: 分层(多层)架构 组件按技术层组织 用户界面: 与用户直接交互的部分业务规则和核心处理: 逻辑和算法与数据库交互: 数据存取和查询数据库层: 数据存储和管理 优点: 当大部分更改与技术层次对齐时适用 缺点: 域更…...
从零开始的Hadoop学习(二)| Hadoop介绍、优势、组成、HDFS架构
1. Hadoop 是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决,海量数据的存储和海量数据的分析计算问题。广义上来说,Hadoop通常是指一个更广泛的概念—Hadoop生态圈。 2. Hadoop 的优势 高可靠性:Hadoop底层维护多…...
问道管理:逾4600股飘红!汽车板块爆了,多股冲击涨停!
A股商场今天上午全体低开,但其后逐级上行,创业板指数上午收盘大涨超越3%,北向资金也完成净买入38亿元。 别的,A股商场半年报成绩发表如火如荼进行中,多家公司发表半年报后股价应声大涨,部分公司股价冲击涨停…...
Java 语言实现选择排序算法
【引言】 选择排序算法是一种简单但有效的排序算法。它的原理是每次从未排序的元素中选择最小(或最大)的元素,放在已排序的末尾(或开头),逐渐形成有序序列。本文将使用Java语言实现选择排序算法,…...
【C语言每日一题】05. 输出保留12位小数的浮点数
题目来源:http://noi.openjudge.cn/ch0101/05/ 05 输出保留12位小数的浮点数 总时间限制: 1000ms 内存限制: 65536kB 问题描述 读入一个双精度浮点数,保留12位小数,输出这个浮点数。 输入 只有一行,一个双精度浮点数。 输出 …...
科大讯飞永久免费GPT入口来了!!!
讯飞GPT永久免费使用入口注册链接:讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞。 登录讯飞账号后,点击进入体验。 进入体验页面后,选择景点推荐。 笔者让其写一篇关于讯飞GPT介绍的文案。 讯飞GPT是一款由讯飞公司推出的人工智能语…...
亚马逊反馈和评论的区别
在亚马逊上,"反馈"(Feedback)和"评论"(Review)是两个不同的概念,它们分别用于描述购买者与商品或卖家之间的不同方面。 1、反馈(Feedback): 亚马逊的…...
Linux 查看当前文件夹下的文件大小
1.直接查看: ll 或者 ls -la #查看文件大小,以kb为单位 ll#查看文件大小,包含隐藏的文件,以kb为单位 ls -la2.以 M 或者 G 为单位查看,根据文件实际大小进行合适的单位展示 du -sh *...
玩转 PI 系列-看起来像服务器的 ARM 开发板矩阵-Firefly Cluster Server
前言 基于我个人的工作内容和兴趣,想要在家里搞一套服务器集群,用于容器/K8s 等方案的测试验证。 考虑过使用二手服务器,比如 Dell R730, 还搞了一套配置清单,如下: Dell R7303.5 尺寸规格硬盘CPU: 2686v4*2 内存&a…...
《Flink学习笔记》——第六章 Flink的时间和窗口
6.1 时间语义 6.1.1 Flink中的时间语义 对于一台机器而言,时间就是系统时间。但是Flink是一个分布式处理系统,多台机器“各自为政”,没有统一的时钟,各自有各自的系统时间。而对于并行的子任务来说,在不同的节点&…...
nano主板扩大swap交换交换空间大小 /windows里远程传输文件/ssh远程登陆访问GUI界面报错
nano主板扩大swap交换交换空间大小 /windows里远程传输文件/ssh远程登陆访问GUI界面报错 1.扩容 在编译某些文件时由于nano主控内存空间小,在编译工作空间catkin_make时会卡住,因此需要扩容 sudo fallocate -l 13G /var/swapfile #1.新增swapfile 文…...
7个用于机器学习和数据科学的基本 Python 库
推荐:使用 NSDT场景编辑器 助你快速搭建3D应用场景 这篇文章针对的是刚开始使用Python进行AI的人,以及那些有经验的人,但对下一步要学习什么有疑问的人。我们将不时花点时间向初学者介绍基本术语和概念。如果您已经熟悉它们,我们鼓…...
Kafka 简介 + 学习笔记
消息队列 先说明消息队列是什么: 亚马逊: 消息队列是一种异步的服务间通信方式,适用于微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高…...
Mybatis小记
目录 Mybatis第一个程序 xml文件 测试类 错误排查 Mybatis第一个程序 1.搭建实验数据库 2.导入MyBatis相关jar包 3.编写MyBatis核心配置文件 4.编写MyBatis工具类 5.创建实体类、 6.编写Mapper接口类 7.编写Mapper.xml配置文件 8.编写测试类 对象传参只引用需要的属性就可…...
如何向BertModel增加字符
这里写自定义目录标题 看起来add_special_tokens和add_tokens加入的新token都不会被切分。...
copilot切换下一条提示的快捷键
注意是右ALT 右ALT] 触发提示 右ALT/ 参考 https://www.cnblogs.com/strengthen/p/17210356.html...
Mongodb 删除文档Delete与Remove的区别
db.collection.remove() 此方法已被 mongosh 弃用 已弃用的方法替代方法db.collection.remove()db.collection.deleteOne() db.collection.deleteMany() db.collection.findOneAndDelete() db.collection.bulkWrite() 5.0版本更改。 db.collection.remove(<query>,…...
Docker 的基本概念和优势
Docker 是一种开源的容器化平台,可以轻松部署、管理和运行应用程序。它基于 Linux 容器技术,可以将应用程序和其依赖项打包到一个可移植的容器中,从而使应用程序更易于部署、移植和扩展。 Docker 的主要优势包括: 1. 简化部署&a…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
