站点性能优化一个很重要的方向是图片压缩,一方面能提升客户端访问性能,另外一方面因为图片体积变小,能大大减少站点的流量成本,特别是博客,相比文本内容,大量的图片占了流量成本的大头。
而图片压缩后,webp格式通常比其他常见图片格式如jpg,png等体积小(不是100%一定小),所以没有什么理由不用webp。
之前没有使用webp的原因有几点:
● 并非所有浏览器都支持webp格式,如果要兼容所有浏览器,有点麻烦。
● jpg、png图片压缩比还行,已经减少了不少,尚能接受。
不过好几次看到掘金使用了webp格式图片,想想大厂都用,也安排上吧。
打开开发者工具,查看图片使用方式:
掘金访问图片.png图片链接:
https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bcb9c940a37c4f0ab192094c268f0844~tplv-k3u1fbpfcp-jj-mark:3024:0:0:0:q75.awebp#?w=1199&h=367&s=368599&e=jpg&b=0e0e0e
从链接上大概可以猜到一些参数含义:
序号 | 类型 |
---|---|
q75 | 图片压缩质量,满分100 |
awebp | 看起来会用到webp,用不用还要根据客户端请求做判断 |
w | 原图宽度 |
h | 原图高度 |
e=jpg | 原图格式,如果客户端浏览器不支持webp,就显示原图格式,而即便是显示原图格式,也应该是压缩后的 |
使用webp的原因是图片质量尚可,压缩比高于其他图片格式,因此比较一下做到心里有数。
以下图片压缩使用的工具是:tinify[1]
比较结果:
图片 | 原始大小 | 原格式压缩 | webp |
---|---|---|---|
02获取连接.jpg | 50 KB | 30 KB | 35 KB |
03连接池资源.jpg | 23 KB | 12 KB | 10 KB |
06池的动态伸缩.jpg | 14 KB | 9 KB | 11 KB |
06资源不足.jpg | 38 KB | 20 KB | 15 KB |
07状态-state.jpg | 17 KB | 9 KB | 9 KB |
08工作线程.jpg | 32 KB | 18 KB | 24 KB |
evict状态.jpg | 7 KB | 14 KB | 4 KB |
jvmparameter.jpg | 68 KB | 30 KB | 10 KB |
弱引用.jpg | 236 KB | 81 KB | 34 KB |
资源相关类.jpg | 10 KB | 6 KB | 9 KB |
资源状态一.jpg | 9 KB | 6 KB | 9 KB |
累计大小 | 504 KB | 235 KB | 170 KB |
从这个结果可以看到:
webp是谷歌推行的,并有配套的图片转换工具cwebp和gif2webp,参考:谷歌webp使用入门[2]
比较结果:
图片 | 原始大小 | cwebp | tinify |
---|---|---|---|
02获取连接.jpg | 50 KB | 36 KB | 35 KB |
03连接池资源.jpg | 23 KB | 11 KB | 10 KB |
06池的动态伸缩.jpg | 14 KB | 11 KB | 11 KB |
06资源不足.jpg | 38 KB | 16 KB | 15 KB |
07状态-state.jpg | 17 KB | 9 KB | 9 KB |
08工作线程.jpg | 32 KB | 25 KB | 24 KB |
evict状态.jpg | 7 KB | 4 KB | 4 KB |
jvmparameter.jpg | 68 KB | 11 KB | 10 KB |
弱引用.jpg | 236 KB | 35 KB | 34 KB |
资源相关类.jpg | 10 KB | 9 KB | 9 KB |
资源状态一.jpg | 9 KB | 9 KB | 9 KB |
累计大小 | 504 KB | 176 KB | 170 KB |
注:这里cwebp的压缩质量设置和掘金一样,为75,这也是cwebp命令的默认值。
可以看到,cweb的压缩比和tinify的压缩比差不多,再对比实际图片效果,肉眼也难以分辨出来,这么来看,花307.52元买的tinify年费,并不是很划算,好在tinify除了转换webp还能压缩原格式。
webp图片并非所有浏览器都支持,因此要做兼容处理。
客户端可以通过如下方式兼容:
<picture>
<source type="image/webp" srcset="/images/02sourcecode/01hikaricp/webp/02获取连接.webp">
<img src="/images/02sourcecode/01hikaricp/compress/02获取连接.jpg">
</picture>
同时准备两个图片,如果浏览器支持就会显示source中的图片,否则会显示img中的图片。
不过这种方式对于一个图文发布系统,操作不是很友好,因为不太可能让发布者手动去添加这样的内容。
如果是个人博客,就自己一个人去发布文章,那还能接受。
兼容处理流程大致如下:
webp图片优化流程.png
● 存储原始图片
这一步不是必须的,如果使用原始格式压缩图片,原始图片实际可以不要。
● 压缩并存储图片
一般就是压缩为两种格式,原始格式和webp格式。
图片文件存储可以放到类似S3之类的分布式对象存储库中,这样方便分布式部署的web server访问。
● 生成图片链接
这个图片链接需要包含可以推导出最终要访问的图片的相关信息,例如图片格式,图片大小等等。
图片上传流程不是支持webp新引入的技术,具体实现不再展开描述。
● 判断是否支持webp
服务端可以根据客户端请求头中的"Accept"来判断是否支持webp:
代码参考如下:
private boolean isSupportWebp() {
String header_accept = request.getHeader("Accept");
if (header_accept != null && header_accept.indexOf("image/webp") > -1) {
return true;
} else {
return false;
}
}
● 根据图片链接获取对应图片路径
这里仅示例用,图片链接为:
http://10.0.0.8:8042/api/requestImg?imageId=获取连接&sourceImageType=jpg
参数 | 描述 |
---|---|
imageId | 图片标识,用于获取正确的图片 |
sourceImageType | 原始图片类型,如果不支持webp,就使用原始图片类型的压缩图片 |
代码参考,这里仅是简单从服务器classpath获取图片:
private static final String IMG_HOME_PATH = "/static/images/02sourcecode/01hikaricp";
public String getImageFilePath(String imageId, String sourceImageType) {
String filePpath = "";
if (isSupportWebp()) {
filePpath = IMG_HOME_PATH + "/webp/" + imageId + ".webp";
} else {
filePpath = IMG_HOME_PATH + "/compress/" + imageId + "." + sourceImageType;
}
return filePpath;
}
● 返回图片
基本思路是根据请求参数和浏览器请求头信息,设置对应的响应头信息和返回图片,代码参考如下:
@RequestMapping("/api/requestImg")
public void requestImg(@RequestParam("imageId") String imageId, @RequestParam("sourceImageType") String sourceImageType) throws IOException {
// 可以设置缓存,使用这种方式时,需要注意每次重新上传相同图片,链接地址要变化,否则下次还是会使用缓存图片
response.setHeader("Cache-Control", "max-age=3153600");
if (isSupportWebp()) {
response.setContentType("image/webp");
} else {
response.setContentType("image/" + sourceImageType);
}
String filePath = getImageFilePath(imageId, sourceImageType);
ClassPathResource resource = new ClassPathResource(filePath);
try (InputStream in = resource.getInputStream(); OutputStream os = response.getOutputStream()) {
byte[] b = new byte[1024];
while (in.read(b) != -1) {
os.write(b);
}
os.flush();
}
}
● 性能验证
通过以上步骤,看起来已经支持服务端动态返回webp图片,但这种方式是先读取浏览器可支持的图片,然后再将图片以流的方式返回给客户端,虽然能返回webp图片,但是性能和直接访问webp图片链接一样么?
以下是远程网站测试结果:
序号 | 类型 | 性能 |
---|---|---|
第一行 | 原始jpg图片 | 94 ms |
第二行 | 压缩后jpg图片 | 33 ms |
第三行 | 压缩后webp图片 | 43 ms |
第四行 | 动态返回webp图片 | 37 ms |
可以看到基本是图片体积越大越耗时。
需要注意的是:如果网络不稳定会极大影响测试结果,有时候会出现动态返回的webp图片耗时大大超出静态图片耗时,因此以上结果仅供参考。
测试方法:为了避免互相干扰,以上测试结果是通过4个独立页面分别去验证一种获取图片方式,各个页面内容如下:
// 原始图片
<img src="/images/02sourcecode/01hikaricp/02获取连接.jpg">
// 压缩后原格式图片
<img src="/images/02sourcecode/01hikaricp/compress/02获取连接.jpg">
// webp图片
<picture>
<source type="image/webp" srcset="/images/02sourcecode/01hikaricp/webp/02获取连接.webp">
<img src="">
</picture>
// 动态获取webp图片
<img src="http://mysite.com/api/requestImg?imageId=02获取连接&sourceImageType=jpg">
● webp图片格式的体积小于压缩后的主流图片格式,同时图片质量可以满足非高清要求的站点,而图片体积减小对于提升性能和降低流量成本均有很大帮助,值得使用。
● 通过压缩工具对比,说明选择合适工具的重要性,收费工具性价比未必就一定高。
● 通过客户端和服务端兼容方式对比,可以决定什么场景使用哪种方式。
● 以mvp验证了动态获取方式流程能通,生产环境需要考虑图片存储在什么地方,例如使用对象存储数据库S3;另外生产环境要在网络稳定情况下做好性能测试,验证动态获取方式实际是否存在性能问题,避免做无用功。
注意:以上动态获取webp图片方法并非唯一方式,nginx或cdn也都可以实现,可以根据实际情况选择。
本文由微信公众号量子前端原创,哈喽比特收录。
文章来源:https://mp.weixin.qq.com/s/TF_a943HRwvuwtWmVH8E-w
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。