如何利用 webp 进行小程序图片加载速度的优化 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 小程序相关 >

如何利用 webp 进行小程序图片加载速度的优化

发表时间:2020-9-28

发布人:葵宇科技

浏览次数:136

导语

最近很长一段时间没有更新博客,一方面是自己最近参与了小程序的开发,另一方面也是自己略有些怠惰,给自己记个过~那么现在既然回到学校那么还是要分享一些知识的。

前一阵子参与微信小程序开发时遇到了一个小问题,就是图片的加载速度不理想。即使我们对于图像的大小一缩再缩,但后台服务器中200-300KB的图片在小程序里往往需要等待数十秒才能加载完毕(仅在安卓机上测试过,苹果应该优化得好一些),这个图片加载的速度导致我们的小程序体验比较糟糕。我经过搜索发现webp这种图片格式可能可以为我们提供一个可行的替代方案。

知识补充

WebP(发音:weppy)是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,派生自影像编码格式VP8,被认为是WebM多媒体格式的姊妹项目,是由Google在购买On2 Technologies后发展出来,以BSD授权条款发布。
WebP最初在2010年发布,目标是减少文件大小,但达到和JPEG格式相同的图片质量,希望能够减少图片档在网络上的发送时间。根据Google较早的测试,WebP的无损压缩比网络上找到的PNG档少了45%的文件大小,即使这些PNG档在使用pngcrush和PNGOUT处理过,WebP还是可以减少28%的文件大小。

维基百科

说人话?好。webp就是谷歌发布的一款可以在保证图片质量较为完整的情况下压缩率较高的网络图片格式。

这么一看,webp岂不是无敌?实际上对于我们的项目它目前还是有局限性的:iOS端的微信小程序是不支持webp的。

但是方法总是有的,既然iOS有它自己的优化方法,那么我就不让它搭上webp这班车了,我们可以判断设备的类型,然后针对安卓的手机进行优化。

教程

作案工具

  • vscode
  • 微信小程序开发工具

手段

首先我们需要定义一个全局变量作为判断是否为苹果设备的依据。所有的全局变量均在app.js里定义,在app.js中加入全局变量iOS,并用wx.getSystemInfo获取设备信息进行判断:

App({
 >: function () {
    var that = this;
    wx.getSystemInfo({
      success: (res) => {
        console.log(res);                           //res是一个对象,包含设备信息。其中res.system的内容则是设备系统的版本
        if (res.system.indexOf("iOS") != -1) {      //如果系统版本中有iOS三个字母,则判定为苹果设备
          that.globalData.iOS = true;
        }
      },
    });
  globalData: {
    iOS: false,                                     //默认iOS的值为false
  },
})

到这里我们做好了设备类型的判断,接下来我们就要在独立的页面中进行链接替换。打个比方,如果这台设备是苹果,那么图片链接就使用 …/a.png ;如果是安卓,那么链接就换成 …/a.webp 。

给出一个示例页面:

html:

<!--简单的页面,一个view标签,一张图,图片链接用js传入数据-->
<view class="container">
    <image src = '{{img1}}' />
</view>

javascript:

Page({                                              //传入页面的数据
  data: {
    img1:"../a.png",
  },
})

这时我们在js中加入链接替换的内容:

const app = getApp();                               //这行代码很重要,用来从app.js中获取全局变量

Page({
  data: {
    img1:"../a.png",
  },
  //事件处理函数,onLoad指在页面加载中的操作
 >: function () {
    if (!app.globalData.iOS) {                      //app.globalData.iOS即为上面定义的全局变量,如果iOS为假,则替换链接
      this.setData({
        img1:"../a.webp",
      });
    }
  },
})

这样就完成了webp的替换,还是挺容易的,没有想象中的那么复杂。唯一的问题是页面多了以后替换起来会比较麻烦,不过如果都把图片的数据写在js里的话,替换起来会快很多。

相关案例查看更多