当前位置: 首页 > 科技观察

创建高性能移动网站

时间:2023-03-13 05:08:40 科技观察

如果您的网站在3秒内没有响应,人们就会失去兴趣。为了满足这种快速响应的需求,需要一种不同的方法来在移动端进行分析、设计和测试。本文将扩展JohanJohansson于2013年4月发表的“如何让您的网站在移动设备上快速运行”的想法。我们将提出一个论点来确认人们在移动设备上与网站互动的方式与以前不同,特别是设计是基于这个想法。我们的目标不仅是提高网站性能,还包括增加客户收入。我们将重点关注不会很快改变的两个手机特性:小电池和小屏幕。小电池手机是靠无线电通讯的,但是手机的电池很小,所以用电一定要小心,防止没电了。这样,如果收音机不使用,它会很快关闭,从而增加了网页出现的时间。2G和3G无线技术需要2秒来建立HTTP连接。如果我接受“用户在3秒后失去兴趣”的观点,那么我们的网站只有1秒的响应时间。想想这个“黄金秒”。在小屏幕上充分利用这个“黄金时刻”在现实世界中,广告牌和杂志内容是根据媒体的大小和观看距离量身定制的。在数字世界中,典型的中端智能手机屏幕几乎为6平方英寸。15英寸的MacBookPro电脑屏幕尺寸超过100平方英寸。这样,我们不仅可以通过减少发送到移动端的内容来优化网站性能,还可以优化业务流程,提高网站所有者的投资回报率。最大化“黄金秒”网站设计人员和开发人员通常认为用户应该连接到高带宽Wi-Fi和固定线路网络是理所当然的。响应式网页设计(RWD)强制在不同设备(无论好坏)上显示相同的内容、导航和业务流程,限制了创新。确保我们能够轻松进行性能测量、基于不同设备特性的用户行为监控解决方案、低带宽设备网页访问优化,都需要最大限度地利用好这个“黄金秒”。模拟真实网络真实的移动带宽模拟测试是必不可少的移动网络性能测试。许多100美元以下的廉价无线路由器都提供带宽限制功能,测试只涉及局域网内客户端的上行和下行带宽限制功能。如果路由器不支持这个功能,那就尝试使用DD-WRT(DD-WRT是一个开源的升级固件,可以替代目前主流路由器的默认操作系统)来限制带宽。我用DD-WRT升级了LinksysE3000路由器。路由升级的过程非常简单,DD-WRT官网有完整的说明。安装DD-WRT后,转到QoS菜单并启用带宽限制。设置上下行带宽的值,我以前设置下行带宽为256kbps,上行带宽为28kbps来模拟移动网络的平均带宽。在“服务质量”选项中限制带宽现在人为地限制连接到路由器的设备的带宽,无论它们是Wi-Fi还是以太网。我们可以监控带宽的实际使用情况。使用DD-WRT监控带宽利用率虽然这种测试方法不包括随机丢失、可变带宽条件和由信号强度引起的延迟,但它比您在快速、低延迟带宽上进行的其他测试效果更好。在网站开发的早期,这是一种在开发过程中非正式测试Web性能的简单方法,可确保您在正式测试期间不会遇到任何棘手的问题。#p#YouCan'tManageWhatYouCan'tMeasure管理顾问彼得·德鲁克(PeterDrucker)曾经说过一句名言:“如果无法衡量某事,就无法管理它。”随着时间的推移,平均屏幕尺寸会继续增长,根据设备功能(例如无线支持或屏幕尺寸)来监控用户查看的内容,这将帮助您识别手机上的热门内容和服务。也许你看不出有什么不同,但除非你测量,否则你无法确定。示例:“我现在就去吃饭”网站一家全球快餐连锁店需要为其大屏幕Internet网站创建适用于移动设备的优化版本。在创建第一个针对移动设备优化的Internet站点之前,执行分析以确定小屏幕设备用户可以访问大屏幕Internet站点的哪些项目。主菜单、特色菜和商店查询是最受欢迎的,因此创建针对移动设备优化的Internet站点的重点是这些领域。工作不能就此停止。随后的分析表明,商店查询最受欢迎。于是再次修改移动端首页,专注于店铺查询。持续监控显示有多少访问者选择了其他选项,然后不断改进此Internet站点以确保以最简单可行的方式实施最受欢迎的部分。好的日志GoogleAnalytics提供了一些关于设备型号的信息,但它缺少我们根据屏幕尺寸和输入法做出明智决定所需的详细信息。幸运的是,综合设备检测库(DDR)可以将此信息添加到现有日志文件中。可以将以下代码片段添加到.NET网站,引用51degrees.mobi(可通过NuGet获取)以获取屏幕的物理尺寸并输出到一个简单的CSV文件。//写入一个包含当前时间和屏幕的日志文件,String.Format("{0:s},{1},{2},{3}\r\n",DateTime.UtcNow,Request.Path,Request.Browser["ScreenInchesWidth"],Request.Browser["ScreenInchesHeight"]));第一行是处理请求的日期和时间。第二行是请求的页面。最后两行是设备屏幕的宽度和高度。获取足够的数据和平均屏幕尺寸得出下图:比较20个月内的平均设备屏幕尺寸分析可以缩小到特定页面。有关设备、操作系统和浏览器的特征也可以添加到列中。类似的代码可用于PHP、Java、Python和其他环境语言。现有的日志文件有时,现有的网页无法通过上述方式进行修改。在这种情况下,DDR可用于对包含用户代理的日志文本执行离线分析。以下.NET代码是实用命令行程序,它解析以空格分隔的日志文件,然后计算日志所表示的请求的平均屏幕大小(以平方英尺为单位)。第一个参数是日志文件的位置,第二个参数是用户代理所在的日志文件中列的索引。使用系统;使用FiftyOne.Foundation.Mobile.Detection.Binary;使用System.IO;namespaceConsoleApplication{classProgram{staticvoidMain(string[]args){//从日志文件中读取的设备数量。整数=0;//用户代理包含的输入文件中的列。intcolumn=int.Parse(args[1]);//屏幕维度变量。doubletotal=0,宽度,高度,squareInches;//创建一个提供者来确定设备的能力。varprovider=Reader.Create("51Degrees.mobi.dat");//读取参数0中提供的日志文件的每一行。//假设第8列的值是UserAgent字符串。使用(varreader=File.OpenText(args[0])){while(reader.EndOfStream==false){varvalues=reader.ReadLine().Split(new[]{''});if(values.Length>=column){//获取基于用户代理的设备信息。vardevice=provider.GetDeviceInfo(值[column-1].Replace("+",""));if(device!=null){//Determinethescreendimensionsininches.double.TryParse(device.GetFirstPropertyValue("ScreenInchesWidth"),outwidth);double.TryParse(device.GetFirstPropertyValue("ScreenInchesHeight"),outheight);squareInches=width*height;//Ifvalidvaluesareavailable(notadesktop/laptop)//thenaddthevaluestothersults.if(squareInches>0){total+=squareInches;count++;}}}}}Console.WriteLine("Averagescreensize'{0:#.00}'squareinchesfrom'{1}'devices",total/count,count);Console.ReadKey();}}}分析日志文件非常不准确,因为除了User-Agent之外还有其他HTTPheader会影响检测结果。对于OperaMini和Opera移动浏览器尤其如此。在这两个浏览器中,第二个HTTPheader,也是名为Device-Stock-的headerUA通常用于提供标准用户代理中不可用的有关物理硬件的信息。#p#为什么要监控?监控允许我们从主页中删除不需要的内容,以提高更重要的内容或相关内容的性能。已删除的内容应该仍然可以通过二级p访问ages-只是不要在首页,否则它们会消耗宝贵的带宽并降低性能体验。那么,我们如何创建一个独立的性能优化的移动网站呢?分而治之从UI设计的角度来看,我可以理解为什么RWD(响应式网页设计)有意义。对于6"sq"屏幕与10"sq"屏幕,只需要进行更改如果内容、导航和业务流程需要具有完全相同的布局,那就太好了。平均设备屏幕尺寸。但是,有一个单独的移动网站具有特殊的意义。独立的移动网站通常会带来糟糕的用户体验。通过对搜索引擎评级较低的网站进行处罚,谷歌现在为这些常见问题带来了曙光。问题包括将每个桌面页面发送到单独的移动主页、重定向到应用程序下载页面、阻止用户访问具有更大屏幕的站点以及以相同方式对待具有特定操作系统的所有设备。这些糟糕的实现给这些概念留下了不好的印象。这里有一些简单而正确的方法来做到这一点。以下.NETweb.config代码段会将来自智能手机的第一个请求重定向到网站“智能手机”部分中指定的等效页面。跨重定向保留查询字符串和页面名称很重要。在大多数情况下,当重定向到备用页面时,如果用户愿意,他们应该能够返回到原始页面;大屏幕版本更为熟悉。firstRequestOnly属性确保仅重定向来自设备的第一个请求。devicesFile属性用于跟踪不支持cookie的设备。超时属性控制设备被记住多长时间(用于重定向目的)。重定向系统还必须知道哪个页面是为哪个设备设计的。mobilePagesRegex属性应用于请求URL。如果匹配,则不会重定向该页面。这可以防止无限重定向的情况。locations元素允许配置定义不同的地址和关联的规则。此示例将Smartphone目录插入原始URL。跨重定向保留查询字符串和其他URL信息。必须传递所有影响请求上下文的信息,以便用户获得他们所期望的。这种简单的方法产生了一个SEO友好、谷歌兼容、移动优化的网站,具有出色的用户体验和出色的移动性能。此过程的基础是DDR,它可以快速、一致且准确地提供设备信息。对于已将移动浏览器设置更改为桌面模式的用户,将不会发生重定向。警惕云云服务是快速向网站添加功能的一种流行方式。但是他们通过Internet发出的请求会影响性能。忽略处理时间,我们观察到数据传输到AmazonWebService提供的云服务的平均延迟为200毫秒。200毫秒是黄金秒的20%。因此,请仔细考虑您在何处使用云服务并确保它们是异步调用的,以便其他处理可以在等待响应的同时继续进行。他们应该避免在关键路径上进行活动,例如从请求设备识别信息。压缩内容在视频和图像之后,CSS和HTML占据了大部分网络流量。我们需要优化所有这些的方法。视频本身就可以写文章了,等会再说吧。图片一种流行的解决方案是提供同一图片的三个版本,当浏览器呈现页面时,使用JavaScript或CSS选择最适合请求设备的版本。这是一个好的开始,但管理同一图像的不同版本是一件痛苦的事情;图像永远不会完美优化,这种方法将调整图像大小的负担放在CPU和电池电量有限的移动设备上。处理此问题的更好方法是使用图像优化器。52Degrees.mobi的图像优化器可以通过ViusalStudioIDE添加到ASP.NET站点。以下配置将自动添加到web.config中。上面的处理程序告诉互联网信息服务(IIS)图像处理程序应处理对资源P.axd的任何GET请求。在web.config中启用后,以下ASP.NET代码将使用图像优化器从三种可能的资源中确定图像-即240、480和640像素宽的图像。最初显示图像时,服务器会发送一个白色的1x1像素的GIF显示在图像所在的位置。这是生成的HTML:页面加载后,JavaScript用于确定最终显示图像所需的实际尺寸,然后向服务器请求具有明确大小的图像。经过JavaScript处理后,上述HTML被转换为:所以服务器上最合适的图像将被用作调整的初始图像。w查询字符串参数指定请求图像的宽度。所以不需要提供多张图片;一张图片几乎就可以了。这种方法很容易实现,结果是一个大小明确的图像。这样做不仅减少了带宽,还减少了手机CPU的运行周期和功率。HTML整个牛津词典包含171,476个单词。如果一台计算机使用唯一的二进制数字来表示一个单词,而不是字母表中的一个字母,它将使用大约18位(四舍五入为大约3个字节)。这说明压缩算法是非常有效的。然而,HTML并不是很有效,因为它充满了由字符、ID、类、样式和Javascript表示的元素,而没有考虑它是否是人类可读的。压缩可以减少这些,但仍然存在开销。这就是为什么流行的图书馆有人们无法阅读的压缩版本。在服务器将它们发送给浏览器之前,一些与标记相关的词也可以被最小化,而不会丢失这些词的任何含义。看上面显示的图像示例,ASP.NET中标准HTML图像元素的ID属性是ImageBanner。但是,发送到浏览器的代码仅将B.用于单个元素。这样的性能提升是微不足道的,但是对于一个拥有数百个元素的复杂页面来说,交付这样的页面会更快,浏览器也能更快地处理这一切。包含图像示例生成的HTML看起来很奇怪:此ASP.NET代码没有样式,也没有为img元素设置CLASS属性.那么它的风格从何而来?服务器端缩小过程将确定样式信息并为网页创建CSS文件,从而减小HTML的大小。当HTML发生变化时,样式已经缓存在浏览器中,不需要重新下载。CSS片段如下所示:#B{clear:both;width:100%;}如果许多元素共享相同的样式,则向此CSS添加ID属性,以便它们可以共享相同的信息。您还可以使用服务器端样式元素在多个元素和页面之间共享样式信息。以下代码扩展了前面的图像示例以说明共享样式元素。根据设备的能力,可以进一步扩展此元素,以便应用其他样式,并在多个页面上优化样式表。这种技术始终确保只传输必要的CSS,从而提高对同一页面的后续请求的性能,尤其是对于HTML内容仅略有不同的页面。#p#为什么选择.NET?上面显示的用于图像优化和动态缩小HTML和CSS内容的技术和代码示例取决于页面呈现之后和服务器将其发送到浏览器之前发生的变化。这种预处理技术在ASP.NETWebForms等结构中相当容易实现。然而,在像PHP这样基于脚本的架构中实现它们非常复杂。正是出于这个原因,并且为了保持一致性,本文中的示例都在.NET中。我们已经能够将这种技术应用到其他语言中,示例代码可以在朋友的博客中看到。示例EnterprisePublicHealthFoundation实施了本文中提到的技术,并在第一周设法将性能提高了23%。其他以性能为中心的网站,包括24.com(媒体)、ServiceTick(分析)、LettingWeb(房地产)、AdSupply(广告)和KitsapCreditUnion(金融),都使用本文中提到的部分或全部技术来优化其移动设备地点。总结为了真正优化性能,我们需要考虑站点所有者的投资回报。监控设备特性的差异是根本出发点。然后我们可以部署解决方案,例如利用分散的移动站点来分离或更改内容的重点。我们还可以通过收紧缩小图像和HTML、删除jQuery、询问何时单独使用响应式网页设计(RWD)以及其他技术来最大化性能。当然,现有的技术也很关键,比如配置缓存路径、压缩内容等。微调我们的开发环境以模拟真实世界的条件也可以在整个开发过程中更好地了解性能。立即优化为了让您更多地考虑性能,我举办了一场比赛,寻找世界上最重的网站。找到一个在手机上表现不佳的网页并提交给比赛。我们将比较页面的重量,如果它最重,您将赢得1,000美元。同时,实施本篇文章和其他SmashingMagazine文章中提到的技术,以确保您的网站在我们衡量其性能时不会名列前茅!从来没有比现在更好的机会来提高您网站的性能。本文中的代码示例由.NET提供。我在一篇配套文章中展示了如何使用PHP、Java、C和Python实现相同的效果。我将在本文末尾解释为什么选择.NET。