《响应式Web设计性能优化》一1.1 响应式设计存在的问题

简介:

本节书摘来异步社区《响应式Web设计性能优化》一书中的第2章,第2.1节,作者: 【美】Tom Barker 译者: 余绍亮 , 丁一 , 叶磊 责编: 赵轩,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.1 响应式设计存在的问题

我曾与我的一个团队和产品经理参加了一个产品规划会议,讨论重新设计我们的视频区块,我们的团队主管提出了可以让这个区块具备响应式体验的方案。我们勾勒了这样一张页面,它会去加载默认的HTML5视频播放器,不过会根据用户所使用的设备来调整播放器的大小以及加载不同视频类型的资源与播放列表。这样我们的页面将会非常漂亮,能够适应更多的浏览设备,而且我们的视频就可以面向以前被拒之门外的各种设备的观众了。

这时我们的产品经理皱起鼻子说道:“我们的响应式首页出来之后,我就开始觉得我们的响应式设计思想有些问题。”

这让我甚感诧异。我们的响应式首页问题出在哪里?于是我开始着手做了些研究。

产品团队的印象是页面加载很缓慢。其实当开发人员在自己的笔记本电脑上演示时,一切看起来都很棒,然而当他们在真实设备上向高管们展示时,页面的加载时间实在太长太长了。

我查看了一下主页在智能手机和电脑渲染瀑布图。我所看到的就是我在许多其他站点中注意到的一些东西。

智能手机端在渲染的时候不仅加载了桌面端全部的资源文件,还加载了额外的CSS与sprite文件。图1-1表明相对于桌面端,在手机端的渲染增加了两个额外的HTTP请求,下载量也略微大一些(1.2MB vs 952KB)。


1
图1-1 主页在手机上渲染时的瀑布图

从图1-1中可以看到,共发送了134个HTTP请求,总的传输量是1.2MB。不过这是智能手机版的,通常情况下应该比桌面端的荷载要小。可事实并非如此,如图1-2所示。


2
图1-2 桌面版主页渲染时的瀑布图

可以看到桌面版本总荷载是952KB,来自132个HTTP请求。无疑,手机版除装载所有桌面版同样的内容外,还增加了两个文件。显而易见,这加剧了移动体验中的带宽问题。这完全与我们创建手机页面的初衷背道而驰了。

无独有偶,我在我的笔记本上打开浏览器,同时查看我iPhone上的HTTPWatch,然后访问了alexa.com排名前50的网站,做了一些竞争分析。我发现这些网站中,有30%的手机版的荷载要高于其对应的桌面版——科技公司、银行、零售商均是如此。

除了我自己的研究,许多著名的报告也有相似的结论。The Search Agency(一个全球数字营销代理机构)分析了零售百强以及财富百强公司的站点,做出了下面的报告。

提示

要想访问这些报告,需要将你的E-mail地址提供给The Search Agency,然后The Search Agency会将报告发送给你。

在这些结论中,图1-3展示出使用了(确切地说是滥用)响应式设计的站点比简单、普通的桌面站点平均多耗时1.91秒。更让人诧异的是,它们比手机专用的站点多耗时10.74秒。


3
图1-3 The Search Agency对响应式站点与手机专用以及桌面专用站点的平均加载时间比较

Guy Podjarny——Akamai公司的CTO——在其博客上也发表过一段文章,详细描述了他在运行类似测试实验时的发现。他比较了多种分辨率下的页面大小,发现其间的差别微乎其微。在http://bit.ly/1tBv6cT上可以找到他的文章。

我们都忘记了创建响应式体验的意义了吗?

竞争分析中的发现
我自己在对Alexa排名列表中的页面测试中也得到了一些有趣的数据。其中,我注意到了下面的情况。

在美国的热门网站中,47%仍然使用的是手机专用的“m.”类型的站点。花一分钟时间思考一下这个数字。这些都是互联网上流量最大的站点,可能是各行业的领头羊,包括YouTube、eBay以及Target公司,它们都没有采用响应式站点,而是使用了独立分开的站点。
平均来说,这些手机专用的站点的文件要比响应式站点小55%。使用“m.”的网站子集平均大小是383KB,而响应式站点的平均大小是851KB(见图1-4)。可见“理想很丰满,现实很骨感”。

4
图1-4 手机专用站点与响应式站点平均文件大小对比(单位:KB)

响应式站点的荷载有长尾分布的特性,可达到4MB,而“m.”类型的站点的分布范围都在1MB以内。实际上,“m.”类型的站点大都密集分布在0~200KB以及200~400KB的范围内。我做了一个直方图,来研究下“m.”类型的站点与响应式站点中文件大小的分布情况,见图1-5和图1-6。

5
图1-5 手机专用的站点文件大小分布(单位:KB)


6
图1-6 响应式站点中文件大小的分布(单位:KB)

注意每个直方图中x轴的缩放比例。手机专用站点中有3个离群值接近于1MB;响应式站点中,1MB是第二大分组,且尾部一直延续到4MB。

对于响应式站点,43%的站点在手机体验中与桌面体验中的HTTP请求几乎相同,或是稍多一些。相比之下,专用站点中只有1.5%在手机体验中HTTP请求等同或高于其桌面体验版。图1-7和图1-8描绘了这种差异。

7
图1-7 响应式站点在桌面和手机体验中HTTP请求的分组条状图


8
图1-8 桌面以及手机专用的“m.”站点体验中HTTP请求的分组条状图

在图1-7中的每个分组里,蓝条表示桌面体验中HTTP请求数目,黄条表示同一个页面在手机体验中的HTTP请求数。

同样,在图1-8中的每个分组中,蓝条表示桌面体验中HTTP请求数目,黄条表示手机体验中的HTTP请求数。

显然,我们的响应式设计的实现有问题。并且,提供一个专用体验的站点存在明显的优势,至少在HTTP请求数以及渲染一个页面需要的总传输荷载方面是这样的(不过也要注意,“m.”类型的站点也有其自身的一系列问题,我们后面会简短讨论)。应当注意到,贯穿本书,我的观点以及重复提到的主题自始至终都是响应式设计和专用体验并不是互斥的实现,而是同一理念的多个方面。

除了前面的指标,我还注意到我观察过的那些站点似乎是遵循了一些模式和反模式。

反模式
我在研究Alexa列表上的每个站点时,发现它们都存在一些共同的问题以及它们用到的一些反模式。接下来,我们来找出并研究一下这些反模式。

为所有设备加载同样的内容
这些站点中,有一些会为手机和桌面渲染加载完全一样的资源。它们加载同样的CSS文件,通过媒体查询给不同的分辨率设备提供不同的体验。加载同样的图片,通过缩放来解决不同分辨率下的显示需要。

这种错误做法的后果会在HTTP拥堵时暴露无遗。在不同的显示设备中HTTP请求数目完全一样的那些站点极可能就是用了这种做法。当开始考虑更大分辨率的显示设备如苹果的Retina显示屏以及超高清电视时,这种解决方案就不能很好的扩展显示。

加载额外的资源
虽然为所有设备加载同一组资源忽略了设备间的本质差异,但在手机体验时加载除了通用资源以外的资源,就完全与我们所熟知的移动体验相违背了。这些额外的资源一般都是一些CSS以及sprite文件。

手机体验中比桌面包含更多HTTP请求以及更大荷载的站点常会表现出这种行为。正如前面所提到的,我自己的站点正是用了这种反模式。

加载双倍的图片
最大的错误是,有些站点会为手机版本加载另外一组图片,如此一来图片文件的大小就是桌面版本图片的两倍了。这是常规桌面版图片之外的内容。

加载更大的图片然后再调整大小是为了让图片在小尺寸下显得更清晰。但这种做法的副作用就是会导致手机版站点的荷载比其桌面版大约要大30%。

所有这些问题都有几个共同的哲学思想。

它们明显都是着眼于桌面版本,并以此作为基础,在其上修改或新增元素,而不是从最小版本往上开发。
它们都没有利用各个平台的优势,也没有意识到各个平台的限制。
它们都试图仅从客户端来解决问题。
模式
并不是所有Alexa列表中的站点的做法都是错的——有些确实体验很好,为各种设备与分辨率做了优化。我们来看看它们用到的一些设计模式。
**
加载适合相应设备的资源**
一些网站针对手机端加载了相比桌面端一半大小的图片(而不像之前所描述的反模式中加载两倍桌面端大小的图片),图1-9和图1-10展示了一个例子。


9
图1-9 针对手机端体验加载了专门为手机端准备的图片,120×70像素,2KB大小(截图自Chrome开发工具)

可以看到,在图1-9和图1-10中所展示的是同样的图片,它们的区别仅仅在于针对不同的客户端环境进行了不同程度的缩放。


11
图1-10 针对桌面端体验加载了专门为桌面端准备的图片,120×180像素,8.8KB大小(截图自Chrome开发工具)

同样,有些站点使用了设备独有的sprite图和CSS——并不是在桌面程序的基础上为其他设备增加其他资源。这样需要适当考虑网络带宽限制和传输成本。在alexa名单中的大多数站点都是使用专有“m.”网络来完成此功能的。我们同样也可以建立使用此模式的响应式网站,这部分的内容会在第4章中出现。

从后端提供专有的体验
最好的浏览体验就是对于不同的设备提供完全不同的专有体验。有些站点提供了独立的“m.”网站,另外一些网站展示的是从服务端传输过来的基于设备独有布局和功能的页面。这种解决方案我们称之为RESS(响应式设计 + 服务端组件),但是对于我们常用来为预定义的分辨率断点来说,我们真的需要在一个“m.”站点中为每一部分功能传输加载适当的内容的同时,合并相同的业务逻辑。我们将在第4章讨论这种方案的更多细节。

为了更清晰地解释这个解决方案的架构,我们来看看图1-11所展示的这个架构的时序图。


11
图1-11 后端提供基于设备的专有体验的时序图

请注意,这些站点在提供专有体验的同时,保证了最小的荷载和最大限度的加速。这也就是为什么47%的顶尖站点仍然提供专有的网页内容。

前端延迟加载的专有体验
有些站点不仅对图片进行延迟加载,而且对整个内容模块也进行延迟加载,包括上方和下方的折叠部分。通过这种方式,可以有效地避免为每个断点加载内容,智能地加载那些需要的内容,从而适应客户端性能,达到最佳的体验,但是是否延迟加载的决定权在客户端,而不是在服务端,我们将在第5章详细讨论相关细节。

图1-12用时序图展示了这种方法的细节。


12
图1-12 从客户端加载和设备相匹配的资源

我们怎么没有感觉到
本章的前面部分我已经描述了我们是怎么向产品经理展示我们的响应式主页的。经过一个迭代的开发,我们已经可以在我们的笔记本电脑上打开这个页面了,现在我们的桌面屏幕上可以满屏展示这个页面,并且可以自定义我们的浏览器窗口大小来适应不同的屏幕大小场景。虽然看着我们页面可以自适应屏幕大小是一件非常有趣的事情,但是在其他的设备上,它表现得一团糟。

我们在MacBook Pro上,也就是在我们的开发机上通过公司网络展示这个页面,当然看起来一点问题都没有。但是我们不能在我们预定的性能要求底限下工作(例如服务层协议或者SLA)。同时,我们甚至不能在非自己的设备上测试,最重要的是,我们不能违背SLA性能协议,至少我们不能比现有的主页性能低,毕竟在我们的性能监控平台上不能报警。在第3章中我们将详细讨论这个问题。

从最初到响应式设计到现在我们经历了哪些
早在2008年左右,也就是在响应式设计出现之前,我们需要维护两个URL:mysite.com和m.mysite.com(我们的“m.”站点),在同样的Web App中,每一个站点都需要有不同的页面甚至不同的App来适配。它们可能由不同的团队负责,在当时,我们的想法很前卫,也很罕见,并且已经有了手机页面在使用了。

然后,在2011年,Boston Globe项目重新启动,响应式设计和渐进增强的想法已经成为了每次发布的博客和头脑风暴会议的主题了。我们阅读了关于如何创建自适应用户设备的响应式页面的文章。而且我们都被这些概念和想法深深地迷住了。从2000年以来,那些利用相对高度和宽度创建流式布局的的忠实拥
趸,一开始并没有感觉什么不同,但是当他们看到字体大小和图片同样可以被缩放的时候,他们也被这种新的想法深深地吸引了。

业界关于这方面的探讨也如火如荼地开展起来,有很多书出版了,演讲会也开展了起来,每个人都开始制作响应式网站。我们也开始讨论和使用媒体查询来封装不同尺寸屏幕的样式,而且尝试使用多种方法缩放图片。

当我们在真实项目中运用这些新的想法时,都应该从最小的屏幕尺寸开始,并且在打下坚实的基础后,逐步提高。事实上,我们的老板只想看到最终完整的版本(比如桌面版),这样,他们就可以向公司领导层邀功了。所以设计团队首先开工了,我们所有人都为实现这个版本而努力。但是我们可以巧妙地使用媒体查询来控制CSS来达到降低视觉体验的差异,看起来一切都可以解决的,对吧?

我们基于CSS和JavaScript来完成桌面版(最多只有几百KB的大小),然后加载到智能手机和平板电脑上,通过前端的功能我们可以确定客户端的详细信息。当一切都完成以后,我们可以向我们的老板展示,我们的老板也会向公司高层汇报,在一切就绪以后,项目就可以发布上线了。不可避免地,这样开发多少会造成代码的问题,以至于我们不得不花一些时间来进行重构。因为我们的CSS是基于桌面版的,是的,我们的所有link都最终连接到我们的桌面版代码中。然而,我们不能讳疾忌医,我们必须持续重构。因为我们产品的迭代速度非常快,我们需要资源来进行培训。

项目已经在运行中,但是现在的问题是,我们只关注前端样式是不是好看,页面是不是美观。媒体查询和图片自动缩放看起来很酷,但是,如果只关注这些表面的东西,我们就会从本质上错过了根据用户当前的设备来进行整体体验优化的机会,这不能被称作真正的响应式。我们不仅仅关注前端页面是怎么展现的,我们还把我们所有的判断逻辑都放置于前端。仅仅依赖于媒体查询来实现不同设备上的解决方案,或者通过JavaScript来测试前端,意味着我们向客户端传送了额外的文件。这种反模式的方法是我们已经察觉到的,如图1-13所示。


13
图1-13 反模式的时序图

不同设备之间的差异性,包括处理器能力、电池寿命和内存大小都会在我们将注意力集中在前端或者页面样式的时候被忽视。在实际项目中,这些都是我们需要在响应中应该注意的因素。这就是现在网络上主要的门户仍然维护着专有“m.”站点的原因。

为什么不使用“m.”专有站点
到目前为止,我们都在讨论“m.”站点的好处,那你也许要问了,既然它这么好,我们没有理由不用它啊。这里需要申明的一点是:我并不认同“m.”。它当前的确在人们使用响应式设计的时候带来显著的性能提升。但是它同时也有一些缺点。

资源开销
早在2000年的时候,当我创建我的第一个“m.”网站的时候,我必须让一个全新的工程师团队来开发和维护它。这主要是因为我们的产品团队并不想在建立主站的时候,影响移动设备的体验,这还因为移动站点是一项极其复杂和耗费精力的工作,我们不仅需要在主流的iOS和Android设备上支持它,还需要在其他操作系统的手机上支持它,这些手机都有不同大小的屏幕和特定的属性。包括对JavaScript甚至JavaScript的基本功能都支持的限制。

即使你不会使用一个单独的团队来维护,你仍然需要把你主站的相关工作,也就是“m.”网站,作为一个单独的项目来持续维护,事实上,某些功能在某些类型的手机上压根就不支持。

分散的代码
维护一个单独的网站也就意味着你需要维护一个单独的Web App和单独的一份代码。保持代码之间的同步是一个由来已久的问题,当前最主要的解决方法就是个人的自觉性和流程上保证,也就是说,最终它会变得混乱不堪和杂乱无章,当我们的代码没有办法进行同步,我们就失去了对代码的控制,我们最后很可能看到的是两个不同的网站,将来我们会花费更多的精力在更新上。

分段独立的URL
使用一个单独的“m.”网站也就意味着你需要创建和维护一个单独的URL,这和我们将一个资源作为一个统一的管理的整体思想相违背。对网站来说,一个“m.”就是第二个站点,此外,如果这样的话,我们的“m.”站点的未来将何去何从?它的底线在哪里呢?你会把它放到功能手机里面吗?或者智能手机?又或者平板电脑?那么平板电脑会遇到什么情况呢?它们都会进入到同一个“m.”站点吗?或者你能为不同的尺寸和特性分别维护一个单独的网站?你很快会发现,这种分割很快就会让你疲于应付、苦不堪言。

毫无意义的重定向
使用一个完全独立的URL也就意味着客户端进入网站的时候需要进行重定向。额外增加一个重定向也就增加了不必要的延迟体验,因为服务器需要向客户端返回302或者304状态码,然后客户端必须重新向一个新的地址发送新的请求,就像图1-14展现的那样。


q1
图1-14 在手机站点上引入HTTP重定向的单独URL

可扩展性带来的问题
到目前为止,我们主要都在讨论智能手机和桌面的体验问题,和平板一起,构成我们现在所知道的主要设备类型。但是工业的发展日新月异,在过去的几年里,我们看到过非常多的新设备和它们特有的功能,包括网络基础设施和客户端的一系列的特色。

举个例子,当苹果公司发布了Retina屏幕的时候,我们必须和设计团队一起创建独特的图片,让它们在Retina屏上也有不俗的视觉效果。随着Web开发在电视指南和App中显山露水,以及分辨率为4K和8K的超高清电视机的屏幕不断增大,这一趋势仍将持续。

另外一个例子就是谷歌眼镜现在变得越来越普及,所以我们也要考虑我们的站点在眼镜上的体检。现在Google提供了一套名叫Mirror的API,从而使得客户端库和Mirror API可以整合到一起(http://bit.ly/lrXkSpb)。

这些只是一些处于科技前沿的便携设备,越来越多的新科技将会涌现。如果我们继续把响应式设计看作一个前端的工具的话,那么我们将会发现页面臃肿的问题会越来越严重,也许我们会看到越来越多的公司将重新回归到“m.”站点中去。

相关文章
|
9天前
|
编解码 前端开发 JavaScript
构建高效响应式Web界面:现代前端框架的比较
【4月更文挑战第9天】在移动设备和多样屏幕尺寸盛行的时代,构建能够适应不同视口的响应式Web界面变得至关重要。本文深入探讨了几种流行的前端框架——Bootstrap、Foundation和Tailwind CSS,分析它们在创建响应式设计中的优势与局限。通过对比这些框架的栅格系统、组件库和定制化能力,开发者可以更好地理解如何选择合适的工具来优化前端开发流程,并最终实现高性能、跨平台兼容的用户界面。
|
1月前
|
前端开发 开发者 UED
构建响应式Web界面:Flexbox的力量
【2月更文挑战第25天】 在现代网页设计中,创建能够适应不同屏幕尺寸的布局是至关重要的。Flexbox,一种CSS布局模式,提供了强大的工具来轻松地设计和调整灵活的响应式界面。本文将深入探讨Flexbox的核心概念,并通过实例展示如何使用它来构建美观、灵活且易于维护的响应式Web界面。
|
1月前
|
Web App开发 前端开发 JavaScript
构建响应式Web界面:现代前端开发的最佳实践
【2月更文挑战第15天】 在多设备浏览时代,响应式Web设计成为前端开发者的必备技能。本文将深入探讨实现响应式界面的核心概念、技术栈以及工具,帮助读者掌握从布局到交互的全方位解决方案。通过灵活运用CSS框架、媒体查询及JavaScript,开发者可以创建出适应不同屏幕尺寸和分辨率的网站。文章不仅涵盖理论分析,还包含实际案例,确保读者能够将知识应用于实际项目中。
|
3天前
|
缓存 监控 数据库
Flask性能优化:打造高性能Web应用
【4月更文挑战第16天】本文介绍了提升Flask应用性能的七大策略:优化代码逻辑,减少数据库查询,使用WSGI服务器(如Gunicorn、uWSGI),启用缓存(如Flask-Caching),优化数据库操作,采用异步处理与并发(如Celery、Sanic),以及持续监控与调优。通过这些手段,开发者能有效优化Flask应用,适应大型或高并发场景,打造高性能的Web服务。
|
15天前
|
编解码 前端开发 开发者
构建响应式Web界面:Flexbox与Grid布局的深度对比
【4月更文挑战第4天】 在现代前端开发中,构建灵活且响应式的用户界面是至关重要的。随着移动设备浏览量的增加,能够适应不同屏幕尺寸和分辨率的布局技术变得必不可少。Flexbox和Grid是CSS提供的两种强大的布局机制,它们各自以独特的方式解决了响应式设计的挑战。本文将深入探讨Flexbox和Grid的核心概念、使用场景和性能考量,为开发者提供在面对不同布局需求时做出明智选择的依据。
|
1月前
|
前端开发 开发者 UED
构建响应式Web界面:Flexbox与Grid布局的深度解析
【2月更文挑战第28天】 在现代前端开发中,打造灵活且适应不同屏幕尺寸的用户界面是至关重要的。随着移动设备的普及,响应式设计已经成为网页制作不可或缺的一部分。本文将深入探讨两种强大的CSS布局模块——Flexbox和Grid,它们如何简化布局创建过程,并赋予设计师更大的灵活性去构建动态和流畅的响应式界面。通过对这两种技术的比较、使用场景分析以及代码示例,读者将能够更好地理解何时以及如何使用这些工具来提升前端项目的质量和效率。
16 0
|
1月前
|
开发框架 Dart 前端开发
构建响应式Web界面:Flutter的跨界前端技术
【2月更文挑战第23天】随着移动互联网的飞速发展,响应式Web设计成为现代前端开发的重要趋势。在众多框架中,Google推出的Flutter以其高效的渲染性能、跨平台能力及丰富的组件生态,为前端开发者带来了新的选择。本文将深入探讨如何利用Flutter进行高效、美观的响应式界面构建,同时剖析其与传统前端技术的差异和优势。
|
1月前
|
前端开发 开发者 容器
构建响应式Web界面:Flexbox的力量
【2月更文挑战第22天】 在当今多变的互联网景观中,创建一个能够适应不同屏幕尺寸和设备类型的响应式Web界面已成为前端开发者的核心任务。本文将深入探讨Flexbox——一个强大的CSS布局模式,它为构建灵活且易于管理的响应式设计提供了坚实的基础。通过详细解读Flexbox的关键特性及其在实际项目中的应用,我们将揭示如何有效地使用这一工具来提升用户界面的质量和性能。
|
1月前
|
Web App开发 编解码 前端开发
构建响应式Web界面:现代前端开发的实用指南
【2月更文挑战第22天】 随着移动互联网的兴起,响应式网页设计已成为前端开发者必须掌握的核心技能之一。本文将深入探讨如何通过灵活运用HTML5、CSS3和JavaScript等技术,构建出能够适应不同屏幕尺寸和设备的Web界面。文章不仅涉及理论概念,还包含具体实践案例,旨在帮助读者理解并应用响应式设计的核心原则,从而提升网站的用户体验和访问效率。
|
1月前
|
安全 中间件 Go
Go语言Web服务性能优化与安全实践
【2月更文挑战第21天】本文将深入探讨Go语言在Web服务性能优化与安全实践方面的应用。通过介绍性能优化策略、并发编程模型以及安全加固措施,帮助读者理解并提升Go语言Web服务的性能表现与安全防护能力。