微信小程序开发教学系列(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…...
Windows系统信息里藏了多少宝?教你用systeminfo和wmic命令挖出BIOS等硬件详情
Windows命令行高手课:用systeminfo和wmic打造硬件信息查询工具箱 每次打开第三方硬件检测工具时,那些闪烁的广告弹窗是否让你不胜其烦?其实Windows早已内置了一套堪比专业软件的硬件信息查询系统。本文将带你解锁systeminfo和wmic这对黄金组合…...
GHelper终极指南:3步掌握华硕笔记本性能控制秘籍
GHelper终极指南:3步掌握华硕笔记本性能控制秘籍 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertb…...
告别单调列表!用Unity Dropdown组件打造游戏中的动态交互式菜单(附事件处理完整代码)
告别单调列表!用Unity Dropdown组件打造游戏中的动态交互式菜单(附事件处理完整代码) 在独立游戏开发中,UI交互的细腻程度往往决定了玩家的沉浸感。想象一下:当玩家在角色创建界面选择职业时,下拉菜单不仅显…...
利用Taotoken用量看板精细化管理团队API消耗
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken用量看板精细化管理团队API消耗 对于依赖大模型API进行开发的团队而言,清晰、透明地掌握资源消耗情况是成…...
基于MCP协议构建加密货币数据查询工具:coinpaprika-mcp详解
1. 项目概述:一个连接加密货币数据世界的桥梁 最近在折腾一个需要实时获取多种加密货币数据的项目,从价格、市值到社区动态,需求五花八门。市面上数据源不少,但要么API调用限制太死,要么数据维度不够全,要…...
如何永久免费使用Cursor Pro:完整破解指南与工具详解
如何永久免费使用Cursor Pro:完整破解指南与工具详解 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tria…...
解锁B站高清与会员视频:基于you-get与EditThisCookie的自动化下载方案
1. 为什么需要you-get与EditThisCookie组合方案 每次在B站看到喜欢的视频想保存下来,你是不是也遇到过这样的烦恼?用普通下载工具要么画质模糊得像打了马赛克,要么遇到会员专属内容直接提示"无权限"。作为常年混迹技术社区的老司机…...
SQL数据库如何实现数据的逻辑删除_利用状态位与查询过滤
逻辑删除应使用UPDATE修改状态字段而非DELETE物理删除,因后者导致数据不可恢复、审计困难、关联断裂;须全局统一过滤status1,建索引、用视图/ORM作用域、冗余状态列保障一致性。为什么不能直接用 DELETE 语句删数据逻辑删除本质是“假装删了”…...
把旧路由器改造成远程ADB调试服务器:OpenWrt安装adb与公网访问指南
旧路由器变身远程ADB调试服务器:OpenWrt实战指南 在移动应用开发过程中,频繁连接USB数据线进行调试不仅效率低下,更限制了开发者的工作灵活性。想象一下,当你需要同时调试多台设备,或者在不同网络环境下快速切换测试场…...
Diablo Edit2:终极暗黑破坏神2存档编辑器完全指南
Diablo Edit2:终极暗黑破坏神2存档编辑器完全指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否厌倦了在暗黑破坏神2中反复刷装备的枯燥过程?是否因为技能点分配失…...
