一、什么是webp,它有什么用?

webp是谷歌推出的一种图片格式,它的优点就是同等画面质量下,体积比jpg、png这些少了25%以上。

大家都知道移动互联网时代,页面大小和用户留存息息相关,更快的加载页面才能让更多用户关注到你的内容,而图片一直都是页面体积的大头,拿我们的活动页面来说,图片占据了80%以上的页面大小。所以使用webp的话,可以瞬间让页面大小下降1/4,不得不说是一个极具性价比的优化点。

当然,它也不是没有缺点,浏览器对于webp的解码速度相对于jpg来说会慢一些,不过这和体积减小带来的性能提升,可以忽略不计了。

那么既然webp这么好,为什么没有大范围使用呢?归根结底还是webp是谷歌推出的,目前主流浏览器只有chrome和安卓支持。不过IOS也快支持了,期待ing^ ^。在caniuse上可以查到webp目前的兼容性。

二、使用webp的常规方法以及它们的优劣

首先,我们需要一个工具把图片转成webp格式,这里就使用google的官方工具即可,链接。

这个装好之后,你的控制台就有了一个cwebp命令。运行cwebp -h,成功显示帮助信息就表示安装好了。

通过这个工具就可以生成webp图片了,有了webp图片之后,之后便是如何使用了,常见有两种方案。

方案一:服务器端处理

这是最最最省心的方法了,支持webp图片的浏览器在向服务器发送请求时,会在请求头Accept中带上image/webp。然后服务器就可以根据是否含有这个头信息来决定是否返回webp图片了。

这个方法只需要在web服务器那里做一些操作即可,十分简单方便。

不过这个方案缺点也很明显,首先通过请求头检测,某些设备可能不太准。其次,现在图片等静态资源都会放到CDN服务器上,那么在这个层面加上判断webp的逻辑就有点麻烦了。

方案二:前端检测是否支持webp然后再请求相应格式的图片

这个方法好处是十分稳妥,通过特性检查可以知道用户的浏览器是否支持webp,坏处就是需要在业务代码中加入检测webp的逻辑。

通常做法是在页面加载前先执行一段webp的检测,得出浏览器是否支持webp格式,把结果存入cookie中,在加载图片时,如果是懒加载的图片,那么根据是否支持webp来处理图片路径就好,如果不是懒加载的图片,可以在后端渲染模板时,根据我们设置好的是否支持webp的cookie来判断。

目前这些都是针对页面通过img标签引入图片时兼容webp的方式。如果是css中引入的图片,方案一般就是构建两套css,然后在后端模板中根据cookie判断使用哪一套,或是在css中通过选择器覆盖,比如对于支持webp的浏览器,我们在html根节点上加上webps的类名,然后针对引入的图片,通过这个类名做选择器优先级覆盖,具体的我们在第三部分看着代码细说。

三、我们是如何用上webp的

重点来了,下面来说说我们对webp的实战。

首先说说我们这边现状吧,我们的图片有两种存放方式。对于一些动态图片,比如商品图,这些是存放在我们的图片服务器上,这个服务器支持webp格式,只需要在图片路径后面加上参数t=5即可得到webp格式的图片。

对于css引入的背景图,我们存放在某个CDN上,这部分就麻烦了,不支持生成webp图片,所以只能自己传一份相应的webp图片上去。

而且由于各种原因和限制,我们无法采用上述说的服务器端处理方案,所以只能采用前端代码处理的方式。我想有些公司没使用webp可能也是这些原因,因为纯前端处理确实挺绕的。

结合我们的业务情况,因为是运营活动页,背景图和商品图基本各占一半,甚至背景图更多,所以我们需要把css引入的图片和img标签引入的图片都做webp兼容T T。

针对img标签引入的图片,由于我们的图片服务器支持webp,而且我们的商品图大多是懒加载,那么就简单了,直接修改我们的懒加载插件就可以实现,在替换真实图片路径的时候判断一下是否支持webp,然后替换相应的路径就可以。

针对css引入的图片,我们采取的方案是利用css的优先级覆盖,比如说如果浏览器支持webp,那么我们给html根节点上加上webps的类名。这样比如我们写

span{background-image:url(a.jpg)}

的时候,再写上

.webps span{background-image:url(a.jpg.webp)}

这样,支持webp格式的设备就会自动加载webp的图片了。

当然这里你肯定会有两个疑问

一是每次写代码的时候加上.webps再写一遍工作量也太大了。

二是每张图对应的webp图片是哪里来的?需要自己生成吗?

针对这两个问题,我们找到了相应的解决方法,对于问题一我们使用css预处理器做到了生成对应的webp的代码。

问题二我们使用nodejs写了一个脚本来监控图片文件夹,当图片增加、修改、删除时,它便会生成或删除对应的webp图片。

说了这么多,我们一起来看一看代码实现吧。

首先,我们需要在页面最开始的部分加入一段webp的检查代码。这段代码的作用就是检查当前浏览器是否支持webp,如果支持,那么给html根节点加上webps的类名,以供css使用。并且在cookie中记录一个名为webps,值为A的cookie,为期一年。这样,之后就可以在css中使用webp类名做兼容处理,img标签引入的图片也可以通过cookie得知浏览器是否支持webp,然后做相应处理,后端也可以通过cookie得知设备对webp的支持情况来做一些差别渲染。

这段代码如下,需要注意的是这段代码要在引入css前就加载,代码的含义可以直接看注释。

(function(doc) {// 给html根节点加上webps类名function addRootTag() {doc.documentElement.className += " webps";}// 判断是否有webps=A这个cookieif (!/(^|;\s?)webps=A/.test(document.cookie)) {var image = new Image();// 图片加载完成时候的操作image.onload = function() {// 图片加载成功且宽度为1,那么就代表支持webp了,因为这张base64图是webp格式。如果不支持会触发image.error方法if (image.width == 1) {// html根节点添加class,并且埋入cookieaddRootTag();document.cookie = "webps=A; max-age=31536000; domain=58.com";}};// 一张支持alpha透明度的webp的图片,使用base64编码image.src = 'data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==';} else {addRootTag();}
}(document));

然后我们处理img标签引入的图片,因为我们的图片服务器支持webp,且用img引入的图片都是通过懒加载来载入的,所以这部分我们处理起来比较简单,在懒加载替换真实路径的时候,判断cookie中是否存在webps=A这个cookie来决定加载的图片的url。

当然,如果你们不是懒加载的引入的图片,那么可以在后端渲染的时候,通过我们写入的cookie,来判断是否使用webp图片,也很方便。这部分代码比较简单,就不贴出来了。

然后是css中引入的图片了,由于css不支持逻辑,我们现在能利用的就是html根节点的.webps的类名了。我们在SCSS中使用了这个mixin来加载图片。代码作用可以看下注释。

/*通过这个函数来引入图片,例如:#wrapper{ @include bg('../img/sample.jpg') }这段代码经过编译后便会生成如下两句代码#wrapper{ background-image:url('../img/sample.jpg'); }.webp #wrapper{ background-image:url('../img/sample.jpg.webp'); }*/
@mixin bg($url) {background-image: url($url);@at-root(with: all) .webps & {background-image: url($url + '.webp');}
}

如果用的是less,可以通过下面这段代码来实现同样的功能。

.mixin(@url) {background-image: url(@url);.webps & {background-image: url('@{url}.webp');}
}

最后就是如何生成webp图片了。对于css引入的图片,由于是放在CDN上,我们需要自己生成对应的webp图片。

如何做到开发的时候自动配套生成webp图片呢,开始我们想的是给我们的构建工具写个插件来实现编译时候生成webp图片,然而我们发现由于各个项目使用的构建工具可能不一样,比如fis3、webpack还有我们自己开发构建工具的,太多了,针对每一个开发成本太高。所以我们决定用nodejs写个小脚本,作用就是监控我们的图片文件夹,随时生成配套的webp图片,当图片有增加、修改、删除时,它会相应的增加、修改、删除对应的webp图片。

工具代码如下。默认监听images文件夹,npm install 安装依赖之后,直接node webp-monitor.js既可。当然,前提是你按照好了第二部分所说的谷歌官方的webp生成工具,或者简单的说你的终端需要有cwebp这个命令才行。

/*webp图片生成运行:npm install && npm start程序依赖谷歌官方webp转换工具cwebpmac下安装 brew install webpwindows下可以去google官方下载安装完成后运行cwebp -h 如果显示了使用帮助则表示安装成功*/const process = require('child_process');
const fs = require('fs');
const chokidar = require('chokidar');const log = console.log.bind(console);
const ignoreFiles = /(^\..+)|(.+[\/\\]\..+)|(.+?\.webp$)/; // 忽略文件.开头和.webp结尾的let quality = 75; // webp图片质量,默认75
let imgDir = 'images'; // 默认图片文件夹// 得到对应的webp格式的文件名,默认为文件名后加上.webp
function getWebpImgName(path) {return `${path}.webp`;
}// 得到shell命令
function getShellCmd(path) {return `cwebp -q ${quality} ${path} -o ${getWebpImgName(path)}`;
}// 监控文件夹
var watcher = chokidar.watch(imgDir, {ignored: path => {return ignoreFiles.test(path);},persistent: true // 保持监听状态
});// 监听增加,修改,删除文件的事件
watcher.on('all', (event, path) => {switch (event) {case 'add':case 'change':generateWebpImg(path, (status) => {log('生成图片' + getWebpImgName(path) + status);});break;case 'unlink':deleteWebpImg(getWebpImgName(path), (status) => {log('删除图片' + getWebpImgName(path) + status);});break;default:break;}
});log('biubiubiu~~~ 监控已经启动');function generateWebpImg(path, cb) {process.exec(getShellCmd(path), err => {if (err !== null) {cb('失败');log('请先运行cwebp -h命令检查cwebp是否安装ok。')log(err);} else {cb('成功');}});
}function deleteWebpImg(path, cb) {fs.unlink(path, (err) => {if (err) {cb('失败');log(err)} else {cb('成功');};});
}

参考:https://www.cnblogs.com/yanguhung/p/10446068.html

webp图片介绍及用法总结相关推荐

  1. HTML中的图片如何自适应屏幕?这篇文章有图片的自适应用法介绍

    首先我们看看HTML中的图片是如何自适应屏幕的: 让图片自适应屏幕大小最简单的方法,保证管用,你把那个图片写在div里面的背景里,也就是background:url(../img/1.jpg) cen ...

  2. WebP图片格式处理和兼容使用

    WebP图片格式处理和兼容使用 用了这么久的WebP图片,最近在项目中发现对其了解得还是很不够,便以此文整理记录WebP相关知识点. (github:https://github.com/Michea ...

  3. iOS 客户端基于 WebP 图片格式的流量优化(下)

    在iOS 客户端基于 WebP 图片格式的流量优化(上)这篇文章中,已经介绍了WebP格式图片的下载使用,仅仅只有这样还远远不够,还需要对已经下载的图片数据进行缓存. 曾经有句名言『计算机世界有两大难 ...

  4. 如何让Ubuntu系统支持WebP图片格式

    如何让Ubuntu系统支持WebP图片格式 本文主要向大家介绍如何让 Ubuntu 系统支持查看 WebP 图片格式,以及如何将 WebP 转为 JPEG 或 PNG 图片格式的方法. 什么是WebP ...

  5. 【Android 安装包优化】WebP 图片转换 ( 使用 iSparta 转换 WebP 图片格式 | Google 提供的 libwebp 库 )

    文章目录 一.使用 iSparta 转换 WebP 图片格式 二.Google 提供的 libwebp 库 三.参考资料 一.使用 iSparta 转换 WebP 图片格式 isparta 工具已经停 ...

  6. 图片服务 - thumbor用法

    图片服务 - thumbor用法 使用拇指是非常简单的.thumbor提供一个用于检索图像的端点和一个非常相似的端点来检索元数据. 图像端点 http://*thumbor-server*/hmac/ ...

  7. chrome介绍与用法

    chrome介绍与用法 chrome介绍与用法 1. 认识devTools Elements 面板 console控制面板 Sources 资源面板 chrome介绍与用法 1. 认识devTools ...

  8. 前端性能优化之WebP图片

    前言 前端性能涉及方方面面, 根据优化角度切入点的不同可以分为页面工程优化和代码细节优化两大方向. 页面工程优化: 从页面请求开始, 涉及网络协议. 资源配置. 浏览器性能. 缓存等: 代码细节优化: ...

  9. 什么是WebP图片格式?如何在线把Webp格式转换为JPEG格式?

    我们有时候从互联网上下载图片会发现图片是WebP格式而不是常见的JPEG或者是PNG格式,用自带的图片处理软件无法打开,那么什么是WebP格式呢?我们该如何打开WebP格式的图片文件?需要进行图片处理 ...

  10. 实战技术:提升网站用户体验—WebP 图片的高效使用

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 一.WebP 的由来 现代图像压缩技术对我们的生活方式影响很大.数码相机能将上千张高质量图片存储到一张内存卡里.智能手机可以与邻近设 ...

最新文章

  1. 源码安装tensorflow
  2. Dalvik指令集 (smali汇编)
  3. cmd命令重定向到剪切板
  4. “Info.plist” couldn’t be removed
  5. java 头像 微信群_java怎么生成带用户微信头像的图片,并把这张图片发送给用户。...
  6. Linux内核奔溃分析
  7. 生活中的数学(为生活建模)(三)—— 代数
  8. 报童模型仿真,运行不出来,哪儿出问题了
  9. PHP之阿里云短信接口接入
  10. JTT808协议解析数据相关问题 python
  11. 工业相机基本参数以及选型
  12. word添加目录和更新
  13. 玉米社:百度竞价推广否词什么意思?在哪里查看?怎么添加?【全】
  14. 了解前沿信息科技 做好学习就业规划
  15. 开发板与PC直连还是交叉,关于直连网线交叉网线做法
  16. 《Vision based autonomous driving - A survey of recent methods》读书笔记
  17. Spring Cloud微服务:Loadbalancer 实战
  18. 机动车号牌查询, 在线查询, api 查询
  19. 解决Android Studio等开发软件出现更新TKK失败的两种方案
  20. python实现中考倒计时

热门文章

  1. SQL Server安装和修改身份验证方式
  2. Ubuntu下观看B站视频
  3. PostMan中文设置
  4. python 以图搜图百度_基于opencv的图片检索(模仿百度的以图搜图功能)
  5. 计算机不能识别华为手机,华为手机链接电脑无法识别是为什么?
  6. 二元二次方程例题_二元二次方程组 解法 例题
  7. 如何正确跟踪广告转化数据,优化广告投放效果?
  8. web前端期末大作业 基于HTML+CSS家乡主题毕业设计源码
  9. unity 实验演示 教程_Unity的演示团队– Unity最出色的视觉效果背后的创造者
  10. 中国 省市区 code码