自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

5.25秒變0.023秒:小程序圖片優(yōu)化全攻略

開發(fā) 架構(gòu)
首先我們知道,在小程序中是支持webp?格式的圖片的,所以我們可以將圖片轉(zhuǎn)換為webp?格式,這樣可以減少圖片體積,提升加載速度。 公司使用的阿里云oss?進(jìn)行圖片存儲(chǔ),阿里云oss是支持格式轉(zhuǎn)換的,只需要在圖片url后面加一定的參數(shù)即可,我們可以給圖片后面加上?x-oss-process=image/format,webp即可。

最近在公司寫微信小程序,該小程序主要展示一些高清圖片,所以圖片數(shù)量非常多,而且圖片尺寸也比較大,導(dǎo)致小程序的加載時(shí)間非常長(zhǎng)。所以這里記錄一下如何減少小程序圖片的加載時(shí)間。

優(yōu)化前

這里我挑選了一些項(xiàng)目里面比較大的圖片,還有我之前保存的一些背景圖,共計(jì)12張,上傳到阿里云oss,然后寫了一個(gè)demo去渲染圖片,這里我們先看看加載時(shí)間。

圖片

可以看到,一旦文件大小到了1M以上,加載基本都在1秒以上了,而且加載最慢的一張圖片大小為2.4M;加載耗時(shí)5.27秒。然而在這個(gè)小程序中,有非常多的瀑布流圖片展示,需要加載的圖片也非常多,這對(duì)于這種圖片展示類的小程序來說,簡(jiǎn)直是非常糟糕的體驗(yàn)。下面我們就分析一下,如何提升用戶體驗(yàn),縮短加載時(shí)間。

分析優(yōu)化

這里我總結(jié)了一些常見圖片優(yōu)化策略,方法如下:

圖片圖片

下面我們就根據(jù)總結(jié)的優(yōu)化策略進(jìn)行優(yōu)化,具體如下:

優(yōu)化1:使用webp格式的圖片

首先我們知道,在小程序中是支持webp格式的圖片的,所以我們可以將圖片轉(zhuǎn)換為webp格式,這樣可以減少圖片體積,提升加載速度。 公司使用的阿里云oss進(jìn)行圖片存儲(chǔ),阿里云oss是支持格式轉(zhuǎn)換的,只需要在圖片url后面加一定的參數(shù)即可,我們可以給圖片后面加上?x-oss-process=image/format,webp即可。

// 原本圖片路徑:
let url =' https://lonjin.oss-cn-beijing.aliyuncs.com/weixin-test/3%20%282%2917047050403470042.png'

// 轉(zhuǎn)化為webp格式的圖片路徑:
let url =' https://lonjin.oss-cn-beijing.aliyuncs.com/weixin-test/3%20%282%2917047050403470042.png?x-oss-process=image/format,webp'

清除緩存,刷新頁面,再來看加載時(shí)間:

圖片圖片

可以看到,加載時(shí)間大幅縮短,圖片格式轉(zhuǎn)化后,圖片大小已經(jīng)非常小了,最大的一張圖片僅僅有730kb;隨之加載時(shí)間也大幅縮短,最慢的一張圖片從之前的5.27秒縮短為1.71秒,加載速度提升了3倍!其他的圖片加載基本都在500ms左右,加載速度提升也是比較明顯。

這里我們還需要注意一下webp圖片格式的支持范圍,我這里使用的uni-app做為demo,查了一下文檔,支持范圍如下:

Android4以上(含)、iOS14以上(含)系統(tǒng)內(nèi)置支持webp,此時(shí),不管web、小程序、app,也不管vue/nvue/uvue都可以直接使用webp; iOS14以下,app-vue下,iOS不支持;app-nvue/uvue下,iOS支持;微信小程序2.9.0起,配置屬性webp為true時(shí)iOS支持;

所以如果考慮一些特殊情況,我們可以進(jìn)行一些特殊情況下的處理。

如果文件是直接放在服務(wù)器上的,我們可以借助一些第三方工具來把圖片批量轉(zhuǎn)化為webp格式;比如convertio.co

優(yōu)化2:根據(jù)需求設(shè)置適當(dāng)?shù)姆直媛?/h3>

阿里云oss支持在圖片后面加上參數(shù)來設(shè)置圖片的分辨率,我這里寫的demo中,image標(biāo)簽圖片寬度均為小程序圖片默認(rèn)寬度;即為width: 320px;,所以我們可以給圖片url后面加上/resize,w_320即可,其中w_320表示圖片寬度為320px。

// 原本圖片路徑:
let url =' https://lonjin.oss-cn-beijing.aliyuncs.com/weixin-test/3%20%282%2917047050403470042.png?x-oss-process=image/format,webp'

// 設(shè)置寬度后的圖片路徑:
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'

清除緩存,刷新頁面,再來看加載時(shí)間:

圖片圖片

圖片大小大幅度減少,最大的一張圖片僅僅有15.4 kB;隨之加載時(shí)間也大幅縮短,最慢的一張圖片從之前的1.71秒縮短為316毫秒,加載速度提升了5倍!這時(shí)候所有圖片的加載速度全部沒有超過1秒,最大不超過350ms;基本上算是質(zhì)的飛躍了。不過需要注意的是,圖片分辨率還是需要結(jié)合業(yè)務(wù)需求進(jìn)行調(diào)整的,如果要求必須高清,不建議設(shè)置太小的分辨率。不過我們可以寫一個(gè)檢測(cè)用戶網(wǎng)絡(luò)狀態(tài)的方法,在不同的網(wǎng)絡(luò)環(huán)境下加載不同分辨率的圖片;后面我會(huì)專門來寫一篇文章來實(shí)現(xiàn)這個(gè)功能。

優(yōu)化3:使用雪碧圖

雪碧圖,也叫Sprite,是將多個(gè)小圖片合并成一張大圖,然后在頁面中使用background-image和background-position屬性來顯示其中的某一張圖片。這樣可以減少圖片的加載次數(shù),減少圖片的大小,同時(shí)減少圖片的加載時(shí)間。在項(xiàng)目中難免會(huì)有很多小圖標(biāo),我們就可以使用雪碧圖的方式來使用,減少請(qǐng)求次數(shù)。這里我就不做展示了。

優(yōu)化4:合理使用占位圖片

通常情況下,為了內(nèi)容的動(dòng)態(tài)展示,需要通過網(wǎng)絡(luò)請(qǐng)求從接口中獲取圖片的url。如果在網(wǎng)絡(luò)慢的情況下,image加載圖片的過程可能會(huì)非常慢,在請(qǐng)求完成之前頁面都會(huì)因?yàn)闆]有數(shù)據(jù)而呈現(xiàn)一片空白,這是非常差的用戶體驗(yàn),這里我們可以借助小程序image標(biāo)簽上的@error 和@load事件來實(shí)現(xiàn)占位圖片的展示。我們可以根據(jù)需求去封裝一個(gè)LoadImage組件統(tǒng)一處理,上面提到的優(yōu)化1、優(yōu)化2也可以通過定義參數(shù)實(shí)現(xiàn)批量添加,同時(shí)我們也可以給組件加上lazyLoad,減輕小程序加載壓力。

組件具體代碼如下:

<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>

使用方式如下:

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

優(yōu)化后效果對(duì)比

我們?cè)賮砜匆幌聝?yōu)化前后的加載時(shí)間對(duì)比:

  • 優(yōu)化前:

圖片圖片

  • 優(yōu)化后:

圖片圖片

我們用一張圖片來做對(duì)比:


圖片名稱

大小


加載時(shí)間

優(yōu)化前

wallhaven-we3z86.jpeg

2.4MB

5.27s

優(yōu)化后

wallhaven-we3z86.jpeg

15.3KB

23ms

可以看到相對(duì)體積而言,縮小了99.4%;相對(duì)加載時(shí)間,縮短了5.25秒,在幾乎不影響圖片質(zhì)量的情況下,極大的提升了用戶體驗(yàn)。

責(zé)任編輯:武曉燕 來源: 趣談前端
相關(guān)推薦

2015-03-04 13:53:33

MySQL數(shù)據(jù)庫優(yōu)化SQL優(yōu)化

2009-02-10 09:47:00

應(yīng)用程序訪問權(quán)限

2010-03-03 13:51:54

2013-06-08 11:13:00

Android開發(fā)XML解析

2013-04-15 10:48:16

Xcode ARC詳解iOS ARC使用

2024-05-07 09:01:21

Queue 模塊Python線程安全隊(duì)列

2011-11-17 14:05:47

筆記本常見問題

2010-04-23 14:04:23

Oracle日期操作

2015-08-14 10:27:53

跳槽程序員讀書摘要

2019-06-07 09:33:14

WiFi路由器網(wǎng)絡(luò)

2018-03-23 13:29:29

程序員跳槽薪資

2009-08-18 09:21:54

Windows 7效率提高系統(tǒng)優(yōu)化

2014-03-19 17:22:33

2009-12-14 14:32:38

動(dòng)態(tài)路由配置

2009-10-19 15:20:01

家庭綜合布線

2009-02-20 11:43:22

UNIXfish全攻略

2009-12-17 16:15:00

CCNA640-810

2010-08-25 14:36:02

DHCP服務(wù)器

2019-06-27 11:47:21

Wordpress容器化HTTPS

2024-10-25 15:25:42

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)