微信小程序图片资源优化实践

在开发微信小程序时,如何合理管理和优化图片资源是一个需要重点关注的问题。过大的图片包会导致小程序包体积过大,影响用户的下载和启动体验。因此,我们需要采取一系列措施来优化图片资源的使用。

1、合理选择图片存储位置

不建议将图片直接打包在小程序包中,这样会增加包的大小。
推荐将图片上传到云存储服务(如腾讯云、阿里云等)或者 CDN 服务,然后在小程序中引用图片的远程地址。

// 上传图片到云存储
wx.cloud.uploadFile({cloudPath: 'example.jpg',filePath: 'local/example.jpg',
}).then(res => {// 获取图片的云文件 IDconst fileID = res.fileID// 在小程序中引用图片this.setData({imageUrl: fileID})
})

2、优化图片格式

尽量使用体积更小的图片格式,如 WebP、JPEG 等。避免使用 PNG 等无损压缩格式,除非图片需要透明背景。
示例代码:

<!-- 在 WXML 中使用 webp 格式的图片 -->
<image src="{{imageUrl}}.webp" mode="aspectFit" />

3、实现图片懒加载

使用懒加载技术,只在图片进入可视区域时再加载。
示例代码:

// 在 page.js 中定义一个 observer 监听图片是否进入视窗
const observer = wx.createIntersectionObserver(this)
observer.observe('.lazy-load-image', (res) => {if (res.intersectionRatio > 0) {// 图片进入视窗时加载this.setData({'imageUrl': 'https://example.com/image.jpg'})}
})

4、设置图片缓存

对于不常变动的图片,可以设置较长的缓存时间,减少重复下载。
对于经常变动的图片,可以使用 MD5 或时间戳等方式控制缓存,确保用户获取到最新图片。

// 在请求图片时设置缓存
wx.request({url: 'https://example.com/image.jpg',success: (res) => {wx.setStorageSync('image_cache', res.data)}
})// 在需要使用图片时先从缓存中读取
const cachedImage = wx.getStorageSync('image_cache')
if (cachedImage) {this.setData({imageUrl: cachedImage})
} else {// 缓存中没有则从服务器请求this.loadImage()
}

5、使用 image 组件的 webp 模式

可以直接在 image 组件上使用 webp 属性,自动将图片转换为 WebP 格式。

<image src="{{imageUrl}}" mode="widthFix" webp></image>

6、使用 CSS 技术实现图片效果

对于一些背景图片等场景,可以使用 CSS 属性来实现,减少图片资源的使用。

.bg-image {width: 300rpx;height: 200rpx;background-image: url(https://example.com/image.jpg);background-size: cover;background-position: center;
}

7、使用 SVG 图标

对于一些简单的图标,可以使用 SVG 格式来代替图片,SVG 文件体积较小,并且可以任意缩放而不失真。

<!-- 在 WXML 中使用 SVG 图标 -->
<svg width="24" height="24" viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z" />
</svg>

8、使用雪碧图

将多个小图标合并成一张大图,然后通过 CSS 定位的方式来显示,可以减少网络请求次数。

/* 在 WXSS 中定义雪碧图 */
.icon {width: 24px;height: 24px;background-image: url('https://example.com/icons.png');background-repeat: no-repeat;background-size: 120px 72px;
}.icon-search {background-position: -24px 0;
}.icon-menu {background-position: -48px 0;
}<!--WXML 中使用雪碧图图标 -->
<view class="icon icon-search"></view>
<view class="icon icon-menu"></view>

9、使用 base64 编码

对于一些非常小的图片,可以直接将其转换为 base64 编码,内嵌在 CSS 或 HTML 中,避免额外的网络请求。

/* 在 WXSS 中使用 base64 编码的图片 */
.small-icon {width: 16px;height: 16px;background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH5QYIBxgKgKPuYQAAALhJREFUOMvdkjEOgkAQRd+yBQswsLCxsLCwsLGxsLCxsLCwsLCxcQEOQGJhYWFh4QDcEDNmMQsLMCHRmWQ2M5lMJvPfhKQTMABqoADqQAqcgCNQAyVQBHQHLMAKWANL4AicgAtwAQ7ABbgBN+AG3IAHcAcewBOYAU9gBryANfAG1sAHWAMfYA18gDXwAdbAB1gDH2ANfIA18AHWwAdYAx9gDXyANfAB1sAHWAMfYA18gDXwAdbAB1gDH2ANfIA18AHWwAd4AV1MKRRbHKKGAAAAAElFTkSuQmCC');
}

10、动态加载图片

根据用户的操作动态加载图片资源,比如在点击某个按钮时再加载相应的图片。

// 在 page.js 中定义一个函数来动态加载图片
loadImage() {this.setData({imageUrl: 'https://example.com/image.jpg'})
}// 在需要加载图片的地方调用这个函数
<button bindtap="loadImage">Load Image</button>

11、使用 skeleton 骨架屏

在图片资源尚未加载完成时,先显示一个占位的骨架屏,提升用户体验。

<!--WXML 中使用骨架屏 -->
<view class="skeleton-screen" wx:if="{{!imageLoaded}}"><view class="skeleton-image"></view><view class="skeleton-text"></view><view class="skeleton-text"></view>
</view><view class="image-container" wx:else><image src="{{imageUrl}}" mode="aspectFit" /><view class="image-description">This is the image description</view>
</view>/* 在 WXSS 中定义骨架屏样式 */
.skeleton-screen {display: flex;flex-direction: column;align-items: center;justify-content: center;width: 100%;height: 300rpx;background-color: #f0f0f0;
}.skeleton-image {width: 200rpx;height: 200rpx;background-color: #e0e0e0;border-radius: 4rpx;animation: skeleton-loading 1s infinite linear;
}.skeleton-text {width: 400rpx;height: 40rpx;background-color: #e0e0e0;margin-top: 20rpx;border-radius: 4rpx;animation: skeleton-loading 1s infinite linear;
}@keyframes skeleton-loading {0% {background-color: #e0e0e0;}50% {background-color: #f0f0f0;}100% {background-color: #e0e0e0;}
}

以上就是微信小程序在开发中图片相关的11个优化方法,合理利用各种技术手段来优化图片资源,既可以提高小程序包的体积,也能确保良好的视觉效果和用户体验。我们需要根据实际需求,灵活运用这些优化方法,为用户提供出色的小程序体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XML Data – Semi-Structured Data XML 数据 - 半结构化数据

Outline • Structured, Semistructured, and Unstructured Data • XML Hierarchical (Tree) Data Model • Extracting XML Documents from Relational Databases • XML Documents, DTD, and XML Schema • XML Languages 结构化、半结构化和非结构化数据 - XML 层次&#x…

$.when.apply($, deferreds).done(function() {}) 用法

$.when.apply($, deferreds).done(function() {}) 这行代码是 jQuery 中用于处理多个异步操作的一种模式。让我们逐步解释其用法&#xff1a; $.when(): 这是 jQuery 中的一个方法&#xff0c;用于创建一个新的 Deferred&#xff08;延迟&#xff09;对象。Deferred 对象用于管…

普通用户权限运行Docker

普通用户权限运行Docker 安装Docker Docker的安装比较简单&#xff0c;在Docker官网已经给出了具体的方案&#xff0c;可以直接使用apt安装 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/…

如何设计循环队列(两种方法)

文章目录 前言一、方法一:数组法二、方法二.链表法总结 前言 前面有提到过队列的知识&#xff0c;这次来说一下怎么设计一个循环队列 一.循环队列&#xff08;力扣&#xff09; . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资…

P1020 [NOIP1999 提高组] 导弹拦截

一、问题描述 P1020 [NOIP1999 提高组] 导弹拦截 二、问题简析 该题要我们求两个问题&#xff1a; 1、不上升子序列的最大长度2、不上升子序列的最少个数 利用 D i l w o r t h Dilworth Dilworth 定理&#xff0c;我们得到不上升子序列的最少个数等于上升子序列的最大长…

【算法每日一练]-动态规划(保姆级教程 篇17 状态压缩)#POJ1185:炮兵阵地 #互不侵犯

目录 今日知识点&#xff1a; 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1和i-2行进行不断转移 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1行进行状态匹配&#xff0c;然后枚举国王数转移 POJ1185&#xff1a;炮兵阵地 思路&#xff1a; 题目&#xff1a;互…

代码随想录算法训练营第二十八天|● 93.复原IP地址 ● 78.子集 ● 90.子集II (JS写法)

93 复原IP地址 题目链接/文章讲解&#xff1a;https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1XP4y1U73i/ 思路&#xff1a; /*** param {string} s* return {string[]}*/ var resto…

Ollama、Langchain相关学习资源(动态更新)

大型预训练模型如GPT系列、BERT系列等&#xff0c;在消费级产品和垂直行业应用中加快了部署步伐&#xff0c;包括但不限于智能客服、内容创作、代码生成、决策支持等领域。 随着大模型开源&#xff0c;相关的部署工具和框架也得到发展和完善。例如&#xff0c;出现了一些专门针…

微信商家转账到零钱:实用指南,涵盖开通、使用与常见问题

商家转账到零钱是什么&#xff1f; 商家转账到零钱功能整合了企业付款到零钱和批量转账到零钱&#xff0c;支持批量对外转账&#xff0c;操作便捷。如果你的应用场景是单付款&#xff0c;体验感和企业付款到零钱基本没差别。 商家转账到零钱的使用场景有哪些&#xff1f; 这…

基于YOLOv8深度学习的橙子病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分类

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【动态规划】Leetcode 746. 使用最小花费爬楼梯

【动态规划】Leetcode 746. 使用最小花费爬楼梯 解法 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 解法 &#x1f612;: 我的代码实现> 动规五部曲 ✒️确定dp数组以及下标的含义 dp[i] 表示跳跃到第 i 层&#x…

「Swift」AttributedString常见使用方法

前言&#xff1a;AttributedString是Apple推出的可以实现单个字符或字符范围带相应属性的字符串。属性提供了一些文本特性&#xff0c;可以让文本展示的样式更加丰富。在日常开发过程中&#xff0c;我通常用于同一个Label中包含不同的字体大小或字体颜色的样式编写中。 使用举…

11 Games101 - 笔记 - 几何(曲线与曲面)

11 几何&#xff08;曲线与曲面&#xff09; 贝塞尔曲线 定义 贝塞尔曲线&#xff1a;由控制点和线段组成的曲线&#xff0c;控制点是可拖动的支点。 如图&#xff0c;蓝色为贝塞尔曲线&#xff0c;p1, p2, p3为控制点&#xff0c;曲线和初始与终止端点相切&#xff0c;并且…

Java解决作为子字符串出现在单词中的索引

Java解决作为子字符串出现在单词中的索引 01 题目 给你一个字符串数组 patterns 和一个字符串 word &#xff0c;统计 patterns 中有多少个字符串是 word 的子字符串。返回字符串数目。 子字符串 是字符串中的一个连续字符序列。 示例 1&#xff1a; 输入&#xff1a;patterns…

【原理图PCB专题】Cadence 17.4版本导出excel版本坐标文件

坐标文件记录了板卡上每个元件的坐标是生产的基础资料,在PCBA生产时,需要提坐标文件并且务必保证 准确无误。 Cadence导出坐标文件大部分网上的都是txt文件,其格式如下。导出的文件存在没有对应的Title,格式打开混乱等问题。 那么Cadence 17.4版本如何导出有标题、…

操作系统内功篇:硬件结构之软中断

一 中断是什么&#xff1f; 在计算机中&#xff0c;中断是操作系统用来响应请求硬件设备的一种机制&#xff0c;操作系统收到硬件的中断请求&#xff0c;会打断正在执行的进程&#xff0c;然后调用内核中的中断处理程序来响应请求。 这样的解释可能过于学术了&#xff0c;容易…

分布式系统的基本特性

一般&#xff0c;分布式系统需要支持以下特性&#xff1a; 资源共享 开放性 并发性 可伸缩性 容错性 透明性 下面分别讨论。 容易理解的 资源共享 一旦授权&#xff0c;可以访问环境中的任何资源。 资源&#xff1a;包括硬件(e.g. printer, scanner, camera)、软件&a…

对于组件通信的深刻理解

父组件传递数据给子组件 props传递数据 父组件在子组件的标签上写自定义的属性,属性值是自己的变量,当渲染到子组件时,执行props会找自定义属性,内存了变量的内存,可访问到,写props,会生成vue实例的时候,将props的变量赋给,值找变量内存存入变量.插值语句等可访问.父组件会变…

python综合实战案例-数据分析

Python是进行数据分析的好工具&#xff0c;今天就是借助一个案例给大家进行数据分析讲解。 本例设计一个log.txt⽂件&#xff0c;该文件记录了某个项⽬中某个 api 的调⽤情况&#xff0c;采样时间为每分钟⼀次&#xff0c;包括调⽤次数、响应时间等信息&#xff0c;⼤约18万条数…

如何在 Django 中使用 pyecharts

为项目新建一个目录&#xff0c;将其命名为django_pyecharts_demo, 在终端中切换到这个目录&#xff0c;并创建一个虚拟环境。 python -m venv django_pyecharts激活虚拟环境 django_pyecharts\Scripts\activate要停止使用虚拟环境&#xff0c;可执行命令 deactivate创建并激…