当前位置:首页 > 科技  > 软件

5.25秒变0.023秒:小程序图片优化全攻略

来源: 责编: 时间:2024-01-15 09:22:14 304观看
导读最近在公司写微信小程序,该小程序主要展示一些高清图片,所以图片数量非常多,而且图片尺寸也比较大,导致小程序的加载时间非常长。所以这里记录一下如何减少小程序图片的加载时间。优化前这里我挑选了一些项目里面比较大的

最近在公司写微信小程序,该小程序主要展示一些高清图片,所以图片数量非常多,而且图片尺寸也比较大,导致小程序的加载时间非常长。所以这里记录一下如何减少小程序图片的加载时间。Y0v28资讯网——每日最新资讯28at.com

优化前

这里我挑选了一些项目里面比较大的图片,还有我之前保存的一些背景图,共计12张,上传到阿里云oss,然后写了一个demo去渲染图片,这里我们先看看加载时间。Y0v28资讯网——每日最新资讯28at.com

图片Y0v28资讯网——每日最新资讯28at.com

可以看到,一旦文件大小到了1M以上,加载基本都在1秒以上了,而且加载最慢的一张图片大小为2.4M;加载耗时5.27秒。然而在这个小程序中,有非常多的瀑布流图片展示,需要加载的图片也非常多,这对于这种图片展示类的小程序来说,简直是非常糟糕的体验。下面我们就分析一下,如何提升用户体验,缩短加载时间。Y0v28资讯网——每日最新资讯28at.com

分析优化

这里我总结了一些常见图片优化策略,方法如下:Y0v28资讯网——每日最新资讯28at.com

图片图片Y0v28资讯网——每日最新资讯28at.com

下面我们就根据总结的优化策略进行优化,具体如下:Y0v28资讯网——每日最新资讯28at.com

优化1:使用webp格式的图片

首先我们知道,在小程序中是支持webp格式的图片的,所以我们可以将图片转换为webp格式,这样可以减少图片体积,提升加载速度。 公司使用的阿里云oss进行图片存储,阿里云oss是支持格式转换的,只需要在图片url后面加一定的参数即可,我们可以给图片后面加上?x-oss-process=image/format,webp即可。Y0v28资讯网——每日最新资讯28at.com

// 原本图片路径:let url =' https://lonjin.oss-cn-beijing.aliyuncs.com/weixin-test/3%20%282%2917047050403470042.png'// 转化为webp格式的图片路径:let url =' https://lonjin.oss-cn-beijing.aliyuncs.com/weixin-test/3%20%282%2917047050403470042.png?x-oss-process=image/format,webp'

清除缓存,刷新页面,再来看加载时间:Y0v28资讯网——每日最新资讯28at.com

图片图片Y0v28资讯网——每日最新资讯28at.com

可以看到,加载时间大幅缩短,图片格式转化后,图片大小已经非常小了,最大的一张图片仅仅有730kb;随之加载时间也大幅缩短,最慢的一张图片从之前的5.27秒缩短为1.71秒,加载速度提升了3倍!其他的图片加载基本都在500ms左右,加载速度提升也是比较明显。Y0v28资讯网——每日最新资讯28at.com

这里我们还需要注意一下webp图片格式的支持范围,我这里使用的uni-app做为demo,查了一下文档,支持范围如下:Y0v28资讯网——每日最新资讯28at.com

Android4以上(含)、iOS14以上(含)系统内置支持webp,此时,不管web、小程序、app,也不管vue/nvue/uvue都可以直接使用webp; iOS14以下,app-vue下,iOS不支持;app-nvue/uvue下,iOS支持;微信小程序2.9.0起,配置属性webp为true时iOS支持;Y0v28资讯网——每日最新资讯28at.com

所以如果考虑一些特殊情况,我们可以进行一些特殊情况下的处理。Y0v28资讯网——每日最新资讯28at.com

如果文件是直接放在服务器上的,我们可以借助一些第三方工具来把图片批量转化为webp格式;比如convertio.coY0v28资讯网——每日最新资讯28at.com

优化2:根据需求设置适当的分辨率

阿里云oss支持在图片后面加上参数来设置图片的分辨率,我这里写的demo中,image标签图片宽度均为小程序图片默认宽度;即为width: 320px;,所以我们可以给图片url后面加上/resize,w_320即可,其中w_320表示图片宽度为320px。Y0v28资讯网——每日最新资讯28at.com

// 原本图片路径:let url =' https://lonjin.oss-cn-beijing.aliyuncs.com/weixin-test/3%20%282%2917047050403470042.png?x-oss-process=image/format,webp'// 设置宽度后的图片路径:let url =' https://lonjin.oss-cn-beijing.aliyuncs.com/weixin-test/3%20%282%2917047050403470042.png?x-oss-process=image/format,webp/resize,w_320'

清除缓存,刷新页面,再来看加载时间:Y0v28资讯网——每日最新资讯28at.com

图片图片Y0v28资讯网——每日最新资讯28at.com

图片大小大幅度减少,最大的一张图片仅仅有15.4 kB;随之加载时间也大幅缩短,最慢的一张图片从之前的1.71秒缩短为316毫秒,加载速度提升了5倍!这时候所有图片的加载速度全部没有超过1秒,最大不超过350ms;基本上算是质的飞跃了。不过需要注意的是,图片分辨率还是需要结合业务需求进行调整的,如果要求必须高清,不建议设置太小的分辨率。不过我们可以写一个检测用户网络状态的方法,在不同的网络环境下加载不同分辨率的图片;后面我会专门来写一篇文章来实现这个功能。Y0v28资讯网——每日最新资讯28at.com

优化3:使用雪碧图

雪碧图,也叫Sprite,是将多个小图片合并成一张大图,然后在页面中使用background-image和background-position属性来显示其中的某一张图片。这样可以减少图片的加载次数,减少图片的大小,同时减少图片的加载时间。在项目中难免会有很多小图标,我们就可以使用雪碧图的方式来使用,减少请求次数。这里我就不做展示了。Y0v28资讯网——每日最新资讯28at.com

优化4:合理使用占位图片

通常情况下,为了内容的动态展示,需要通过网络请求从接口中获取图片的url。如果在网络慢的情况下,image加载图片的过程可能会非常慢,在请求完成之前页面都会因为没有数据而呈现一片空白,这是非常差的用户体验,这里我们可以借助小程序image标签上的@error 和@load事件来实现占位图片的展示。我们可以根据需求去封装一个LoadImage组件统一处理,上面提到的优化1、优化2也可以通过定义参数实现批量添加,同时我们也可以给组件加上lazyLoad,减轻小程序加载压力。Y0v28资讯网——每日最新资讯28at.com

组件具体代码如下:Y0v28资讯网——每日最新资讯28at.com

<template>    <view class="loadImage-wrapper">        <image v-if="isLoading" :src="defaultImage" :mode="mode" :lazy-load="lazyLoad" />        <image :class="[isLoading ? 'before-load' : '']" :src="imageUrl" :mode="mode" :lazy-load="lazyLoad"            @load="imageLoad" />    </view></template><script>export default {    props: {        /**         * 占位图         * @default /static/images/load-image.png         */        defaultImage: {            type: String,            default: '/static/load-image.png',        },        /**         * 是否使用webp         * @default false         */        useWebp: {            type: Boolean,            default: false,        },        /**         * 图片的显示模式         * @default scaleToFill         */        mode: {            type: String,            default: 'scaleToFill',        },        /**         * 图片加载分辨率-宽度         * @default         */        width: {            type: String,            default: '',        },        /**         * 是否懒加载         * @default true         */        lazyLoad: {            type: Boolean,            default: true,        },        /**         * 图片地址         * @default         */        src: {            type: String,            default: '',        },    },    data() {        return {            isLoading: true,        }    },    methods: {        imageLoad() {            this.isLoading = false        },    },    computed: {        imageUrl() {            let url = this.src + '?'            this.useWebp && (url += 'x-oss-process=image/format,webp')            this.width && (url += '/resize,w_' + this.width)            return url        }    },}</script><style lang="scss" scoped>.loadImage-wrapper {    .before-load {        width: 0;        height: 0;        opacity: 0;    }}</style>

使用方式如下:Y0v28资讯网——每日最新资讯28at.com

<template>    <view class="list">        <load-image v-for="(item, index) in list" :src="item" :lazyLoad="false" useWebp :width="320" :key="index" />    </view></template>

优化后效果对比

我们再来看一下优化前后的加载时间对比:Y0v28资讯网——每日最新资讯28at.com

  • 优化前:

图片图片Y0v28资讯网——每日最新资讯28at.com

  • 优化后:

图片图片Y0v28资讯网——每日最新资讯28at.com

我们用一张图片来做对比:Y0v28资讯网——每日最新资讯28at.com


Y0v28资讯网——每日最新资讯28at.com

图片名称Y0v28资讯网——每日最新资讯28at.com

大小Y0v28资讯网——每日最新资讯28at.com


Y0v28资讯网——每日最新资讯28at.com

加载时间Y0v28资讯网——每日最新资讯28at.com

优化前Y0v28资讯网——每日最新资讯28at.com

wallhaven-we3z86.jpegY0v28资讯网——每日最新资讯28at.com

2.4MBY0v28资讯网——每日最新资讯28at.com

5.27sY0v28资讯网——每日最新资讯28at.com

优化后Y0v28资讯网——每日最新资讯28at.com

wallhaven-we3z86.jpegY0v28资讯网——每日最新资讯28at.com

15.3KBY0v28资讯网——每日最新资讯28at.com

23msY0v28资讯网——每日最新资讯28at.com

可以看到相对体积而言,缩小了99.4%;相对加载时间,缩短了5.25秒,在几乎不影响图片质量的情况下,极大的提升了用户体验。Y0v28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-61000-0.html5.25秒变0.023秒:小程序图片优化全攻略

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 面试官问:synchronized为什么是重量级锁?

下一篇: Windows非分页缓冲池内存使用率较高的问题

标签:
  • 热门焦点
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 小米MIX Fold 3下月亮相:今年唯一无短板的全能折叠屏

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都有新的进展,其中荣耀、三星都已陆续发布了最新的折叠屏旗舰,尤其号荣耀Magi
  • 华为Mate60标准版细节曝光:经典星环相机模组回归

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
  • AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    Tenstorrent是一家由芯片行业资深人士Jim Keller领导的加拿大初创公司,专注于开发人工智能芯片,该公司周三表示,已经从现代汽车集团和三星投资基金等
Top