算起来已经足足两个半月没有更新文章,这段时间过得比较忙:夜间跑步计划、卖房买房以及工作上各种事情都凑到一块了。实际上,最近也并没有忙到完全抽不出时间写博客这 种地步,根本原因可能还是变懒了,这样不好。
几个月前,我决定开始写一系列有关「移动 WEB 通用优化」的文章,介绍「面向所有主流移动端浏览器(包括各种 APP 嵌入的通用 Webview)」的前端优化策略,本文是这个系列第二篇。
先来回顾下上篇文章最后的结论:
重要的 CSS、JS、JSON 数据直接内联在 HTML 中,头部禁止出现任何外链资源。同时,尽可能减少页面传输体积。
采用了这个策略的页面,理应能让用户在很短时间内看到主体内容,因为头部 CSS 和 JS 都内联了,不会阻塞浏览器渲染页面。在我们的认识里,浏览器会异步加载页面用到的图片,加载图片不会阻塞页面渲染,更不会阻塞 JS 执行。实际情况是这样吗?
本文主要讨论在移动 WEB 中,图片的加载给页面整体性能带来的影响以及优化策略。
我们知道,浏览器的 DOMContentLoaded 事件会在主页面加载并解析完成之后触发,不会等页面样式、图片、iframe 等子资源加载完。以下是 MDN 对它的描述:
The DOMContentLoaded event is fired when the initial HTML document has been completely loaded and parsed, without waiting for stylesheets, images, and subframes to finish loading.
但在实际测试中,移动端完全相同的页面,加载与不加载图片对 DOMContentLoaded 触发时机的影响却很大。以下是我们在某个移动产品中,将图片延迟加载后的 DOMContentLoaded 时间对比,可以看出明显变化:
我们只是将页面所有图片(大约十几张)进行延迟加载,就让 DOMContentLoaded 事件提前 250 毫秒触发。这是我之前没有意料到的,移动设备在网络、CPU、内存等方面的性能与 PC 相比差距很大,很多 PC 上可以忽略的问题,在移动端必须重视起来。
移动 WEB 要做好图片优化,无外乎两点:控制图片大小和控制图片加载。
图片高宽越大,意味着需要越多的网络开销。常见图片格式都经过了高度压缩,尺寸越大的图片还意味着浏览器在解码过程中需要耗费更多 CPU,解码之后的位图需要占用更多内存。在移动端,我们更应该关注图片大小。
根据 DPR(window.devicePixelRatio,设备像素比)选择合适的图片尺寸。现在的手机基本上都是高清屏,如果一味追求让图片更小而使用单倍图也不现实。这一点上,最佳实践是根据产品特性,结合用户 DPR 分布情况来选择合适的尺寸。例如在我们某个产品中:图片加载速度比图片质量更重要;用户 DPR 分布前三是:2、3、1.5。我们最终使用了 1.5 倍图,并且在图床缩放图片时,加了一点点锐化效果。最终图片体积很小,质量也尚可接受。
处理好响应式图片(Responsive Image)。移动上很多图片宽度不是固定像素值,例如通栏 Banner 图片的宽度是跟着设备走的。对于这种场景,使用 JS 获取设备宽度,拼出最适合当前设备的图片尺寸,交给图床进行缩放,无疑能在图片体积和质量上找到最佳平衡点。但这种做法并不可取,移动设备宽度各式各样,如果裁图规格太多,容易降低 CDN 缓存命中率。图床实时处理完图片再分发到 CDN 更耗时,在移动端让图片命中 CDN 缓存也很重要。处理响应式图片的最佳实践是根据用户屏幕尺寸分布,制定出几档裁图规则,页面根据用户设备宽度使用最合适的档位,并对重要的图片(例如头部焦点图)提前预热 CDN。
有一项名为 HTTP Client Hints 的技术,通过新增的 HTTP 请求头部字段,使得图床可以优雅地返回最合适的图片。目前这项技术在移动端尚未普及,详情请查看 HTTP Client Hints 介绍。
使用 WEBP 格式。有一种减少图片体积的灵丹妙药 ---- 使用压缩比例更高的 WEBP 格式。《移动端图片格式调研》这篇文章详细地对比了各种移动端图片格式及各自适用场景。对于 WEBP 的最佳实践是只要浏览器支持就用,虽然 WEBP 解码慢于 JPG,但在同等图片质量下,WEBP 体积通常比 JPG 小很多。
要判断浏览器是否支持 WEBP,可以检查 HTTP 请求头部字段 Accept
的值是否包含 webp
。例如这是 Chrome
给图片请求加的 Accept
:
Accept: image/webp,image/*,*/*;q=0.8
不是所有支持 WEBP 的浏览器都会这样处理,可以针对这种情况使用特性检测:
var webpImg = new Image;
webpImg.onload = function () {
if(webpImg.width == 1){
cookie('env_webp', 1); //cookie 方法需要自己实现
}
};
webpImg.src = 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoBAAEAAgA0JaQAA3AA/vv9UAA=';
这段示意代码的原理是:用 JS 加载 WEBP 图片,如果能触发 onload 并获取到宽度,说明当前浏览器支持 WEBP。
我在《AMP,来自 Google 的移动页面优化方案》一文中写到:「将图片、视频等标签和第三方功能换成 AMP Components 后,AMP Runtime 可以自动处理延迟加载、按需加载等逻辑,确保页面首屏性能」。在移动浏览器打开网页,经常能感觉到明显的卡顿。造成卡顿的原因除了页面 DOM 结构复杂、CSS 过多地触发 Layout/Paint/Composite、存在复杂 JS 逻辑等等,也可能是没有控制图片的加载时机。
通常浏览器会并发加载 6 个同域名图片,如果做了域名散列,那很可能在打开页面后的短短几秒内,几十个图片都在加载。这些连接带来的 TCP、带宽、CPU、内存等开销,很容易让页面卡顿。所以在移动端,我们要让图片加载变得可控。
按需加载图片。在 PC 端,我们基本都会做图片 Lazy Load,这个优化策略在移动端同样适用。由于移动端性能有限、带宽昂贵,Lazy Load 更为重要。实际上不光是图片可以做 Lazy Load,页面所有资源包括 DOM 节点都应该做成按需加载。通常在移动端,我们只加载页面可视区域及其下方一定距离内的资源。
顺序加载图片。在 PC 端,由于硬件性能和带宽足够,并行加载更多的图片通常是最好的选择。而在移动端,人为控制图片加载顺序,例如使其从上到下、从左到右逐个加载,有时可以带来更好的体验。
不要在页面滚定时加载图片。按需加载图片逻辑需要监听页面滚动事件,根据页面当前可视区域决定加载哪些图片。在移动端滚动页面本来就很耗费性能,如果这时候还要加载图片,非常容易造成页面卡顿。在页面滚定停止之后才开始载入图片,能有效减少这种卡顿。
好了,本文先就写这么多。还是老规矩,有任何问题和疑问欢迎留言讨论。Disqus 最近在国内经常无法加载,怎么处理你们都懂的。实在不行也可以给我发邮件,本站「关于」页面有我的邮箱。
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为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 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。