[SCRUM]淘宝首页的性能优化

>>[SCRUM]淘宝首页的性能优化

[SCRUM]淘宝首页的性能优化

上文 《一起来看看淘宝首页的个性化》 中,带大家看了下弥散着个性化味道的新首页,前端面临着:

  • 数据来源是多

  • 串行请求绘制模块

    翼发云敏捷项目管理系统是一个在线的研发项目管理软件,支持多人协同开发,提供移动研发项目管理app,旨在帮助软件研发企业进行更好的研发项目管理、软件开发流程管理,该研发项目管理软件内置了敏捷开发流程和软件开发流程,结合SCRUM思想,满足各种规模的软件开发企业的研发项目管理流程的需要。

  • 操作数据和个性化匹配和管理软件项目管理就用翼发云敏捷项目管理系统。

    数据

  • 数据揭示灾害

等多个问题。本次淘宝首页改版,虽已不再支持 IE6 和 IE7 等低版本的古董浏览器,但是依然存在多个影响首页性能的因素: 翼发云研发管理系统完整实现SCRUM敏捷开发流程

  • 依靠系统太多,要求的数据分为三块,一个是静态资源(如JS、CSS、图像/ iconfont);二是推动CDN的静态数据(填写前端配置信息的操作数据);第三是后端接口,不同的业务不同的模块,而且在页面有很多广告内容,第一屏的接口请求一个页面时加载的8只是粗略估计,滚到底部,有超过20个请求。

  • 不能直接输出第一页的数据。第一个屏幕上的许多数据是通过异步请求获得的。由于系统的限制,这些请求是不可避免的,请求的数量是很大的,这大大影响了第一次屏幕时间。SCRUM研发项目管理就选翼发云。

  • 有太多的

    模块。为了能够在后台填写数据,模块必须精细分割,如下图所示:

淘宝首页性能优化实践

一个简单的模块必须拆分成多个行业小模块,页面中其他位置也是如此,而且这些被拆分出来的模块还不一定会展现出来,需要让算法告诉前端展示哪些模块。

  • 有太多图片和滚下。显然,我们可以看到整个画面的全貌是完整的。有些图片是通过操作填写的。有些图片是由个性化界面提供的,这些图片没有固定的大小。

网络性能指标

网页性能衡量指标有很多,倘若能够把握关键的几个,集中优化,性能自然也就上去了。

FPS

最能反映页面性能的一个指标是 FPS(frame per second),一般系统设定屏幕的刷新率为 60fps,当页面元素动画、滚动或者渐变时绘制速率小于 60,就会不流畅,小于 24 就会卡顿,小于 12 基本认定卡爆了。

1 帧的时长约 16ms,除去系统上下文切换开销,每一帧中只留给我们 10ms 左右的程序处理时间,如果一段脚本的处理时间超过 10ms,那么这一帧就可以被认定为丢失,如果处理时间超过 26ms,可以认定连续两帧丢失,依次类推。我们不能容忍页面中多次出现连续丢失五六帧的情况,也就是说必须想办法分拆执行时间超过 80ms 的代码程序,这个工作并不轻松。

页面在刚开始载入的时候,需要初始化很多程序,也可能有大量耗时的 DOM 操作,所以前 1s 的必要操作会导致帧率很低,我们可以忽略。当然,这是对 PC 而言,Mobile 内容少,无论是 DOM 还是 JS 脚本量都远小于 PC,1s 可能就有点长了。

domcontentloaded和负载

DOM 加载并且解析完成才会触发 DOMContentLoaded 事件,倘若源码输出的内容过多,客户端解析 DOM 的时间也会响应加长,不要小看这里的解析时间,如果 DOM 数量增加 2000 个并且嵌套层级较深,解析时间也会相应增加 50-200ms,这个消耗对大多数页面来说其实是没必要的,保证首屏输出即可,后续的内容只保留钩子,利用 JS 动态渲染。

Load 时间可以用来衡量首屏加载中,客户端接受的信息总量,如果在首屏中充满了大尺寸图片或者客户端与后端建立连接次数较多,Load 时间也会相应被拖长。

流利

流畅度是对 FPS 的视觉反馈,FPS 值越高,视觉呈现越流畅。为了保障页面的加载速度,很多内容不会在页面打开的时候全部加载到客户端。这里提到的流畅度是等待过程中的视觉缓冲,如下方是 Google Plus 页面的一个效果图:

淘宝首页性能优化实践

墙内访问 google 的速度不是很快,上面元素中的的很多内容都是通过异步方式加载,而从上图可以看出 Google 并没有让用户产生等待的焦虑感。

淘宝的首页性能优化

由于平台限制,淘宝首页面临一个先天的性能缺陷,首屏的渲染需要从 7 个不同的后端取数据,这些数据请求是难以合并的,如果用户屏幕比较大,则首屏的面积也比较大,对应的后端平台数据接口就更多。数据是个性化内容或者为广告内容,故请求也不能缓存。

关键模块的优先级

不论用户首屏的面积有多大,保证关键模块优先加载。下面代码片段是初始化所有模块的核心部分:

淘宝首页性能优化实践

TMS 输出的模块都会包含一个 .J_Module 钩子,并且会预先加载 js 和 css 文件。

对于无 JS 内容的模块,会预先打上 tb-pass 的标记,初始化的时候跳过此模块;对于首屏模块关键模块,会直接进入懒加载监控:

淘宝首页性能优化实践

除必须立即加载的模块外,关键模块被加到懒加载监控,原因是,部分用户进入页面就可能急速往下拖拽页面,此时,没必要渲染这些首屏模块。

非关键模块统一送到 lazyQueue 队列,没有基于将非关键模块加入到懒加载监控,这里有两个原因:

  • 一旦

    添加到监控程序的轧制要求每个模块进行计算和判断。模块太多了。可能有性能损失

  • ,如果关键的模块没有加载,非关键模块将进入启动窗口的绘制,这将不可避免地影响的关键模块

    渲染。

那么,什么时候开始加载非关键模块呢?

淘宝首页性能优化实践

上面的代码应该十分清晰,两种请求下会开始将非关键模块加入懒加载监控:

  • 当鼠标移动滚动

    MouseDown touchstart touchmove keydown调整会在页面中触发,这表明用户与页面交互,和程序必须开始装货。

  • 如果用户没有互动,但页面已经加载,程序当然不会浪费这个机会的差距,经过测试,借机加载内容;在某些情况下,onload事件不会被触发(原因不明),所以还设置了超时负荷,5s,不管如何加载页面,将关键的模块添加到其余非懒加载监测。

延迟执行、交互执行

如果说上面的优化叫做懒加载,那么这里的优化可以称之为懒执行。

首页上有几个模块是包含交互的,如头条区域的 tab ,便民服务的浮层和主题市场的浮层,部分用户进入页面可能根本不会使用这些功能,所以程序上并没有对这些模块做彻底的初始化,而是等到用户 hover 到这个模块上再执行全部逻辑。

延迟执行,刷新要执行的页面

首屏中有两个次要请求,一个是主题市场的 hot 标,将用户最常逛的三个类目打标;第二个是个人中心的背景,不同的城市会展示不同的背景图片,这里需要请求拿到城市信息。

这两处的渲染策略都是,在程序的 idle(空闲)时期,或者 window.onload 十秒之后去请求,然后将请求的结果缓存到本地,当用户第二次访问淘宝首页时能够看到效果。这是一种更懒的执行,用户刷新页面才看得到.这种优化是产品能够接受,也是技术上合理的优化手段。

图像大小控制和延迟加载

不论图片链接的来源是运营填写还是接口输出,都难以保证图片具备恰当的宽高,加上如今 retina 的屏幕越来越多,对于这种用户也要提供优质的视觉体验,图片这块的处理并不轻松。

淘宝首页性能优化实践

阿里 CDN 是支持对图片尺寸做压缩处理的,如下图为 200×200 尺寸的图片:

淘宝首页性能优化实践

加上 _100x100.jpg 的参数后,会变成小尺寸:

淘宝首页性能优化实践

我们知道 webp 格式的图片比对应的 jpg 要小三分之一,如上图加上 _.webp 参数后:

淘宝首页性能优化实践

(不支持 webp 格式的浏览器展示不出来这张图片)

视觉效果并没有什么折扣,但是图片体积缩小了三分之一,图片越大,节省的越明显。显然,淘宝首页的所有图片都做了如上的限制,针对坑位大小对图片做压缩处理,只是这里需要注意的是,运营填写的图片可能已经是压缩过的,如:

淘宝首页性能优化实践

上面这种情况,图片是不会正确展示的。首页对所有的图片的懒加载都做了统一的函数处理:

淘宝首页性能优化实践

模块去钩子,走配置

TMS 的模块在输出的时候会将数据的 id 放在钩子上:

淘宝首页性能优化实践

如果模块是异步展示的,可以通过 tms-datakey 找到模块数据,而首页的个性化是从几十上百个模块中通过算法选出几个,如果把这些模块钩子全部输出来,虽说取数据方便了很多,却存在大量的冗余,对此的优化策略是:将数据格式相同的模块单独拿出来,新建页面作为数据页。所以可以在源码中看到好几段这样的配置信息:

淘宝首页性能优化实践

减少了大量的源码以及对 DOM 的解析。

低频修改模块,缓存请求

有一些模块数据是很少被修改的,比如接口的兜底数据、阿里 APP 模块数据等,可以通过调整参数,设置模块的缓存时间,如:

淘宝首页性能优化实践

Math.floor(new Date / (1000 * 60)) 这个数值在一分钟内是不会发生变化的,也就是说将这个请求在本地缓存一分钟,对于低频修改模块,缓存时间可以设置为一天,即:

淘宝首页性能优化实践

当然,我们也可以采用本地储存的方式缓存这个模块数据:

淘宝首页性能优化实践

缓存过期时间设置为 1 天,淘宝首页主要采用本地缓存的方式。

用慢效应减少等待焦虑

这方面的优化不是很多,但是也有一点效果,很多模块的展示并不是干巴巴的 .show(),而是通过动画效果,缓动呈现,这方面的优化推荐使用 CSS3 属性去控制,性能消耗会少很多。

优化的思维视角

上文 《一起来看看淘宝首页的个性化》 中提到几个黄金法则:

  • 第一屏幕必须快速

  • 滚屏必须光滑

  • 不加载

    之前

    可以加载

  • 不能执行

    执行前

  • 逐步展开并显示

性能优化的切入角度不仅仅是上几个方面,对照 Chrome 的 Timeline 柱状图和折线图,我们可以找到几个优化的点:

淘宝首页性能优化实践

  • 有一幅画在

    阻断1.0、可能因为该模块的尺寸太大,在同一时间被显示,

  • 可以从FPS的直方图,有一些渲染和JavaScript的丢帧

    之间1.5s-2.0s

  • 可以从多个红点看到页面该数也可以定位到代码的堆栈

在优化的过程中需要更多地思考,如何让阻塞的脚本分批执行,如何将长时间执行的脚本均匀地分配到时间线上。这些优化都体现在代码的细节上,宏观上的处理难以有明显的效果。当然,在宏观上,淘宝首页也有一个明显的优化:

淘宝首页性能优化实践

这段代码基本保证每个模块的初始化都是在浏览器空闲时期,减少了很多不必要的丢帧。这个优化也可以被应用到每个模块的细节代码之中,不过优化难度会更高。

总结

代码的性能优化是一个精细活,如果你要在一个庞大的未经优化的页面上做性能优化,可能会面临一次重构代码。本文从淘宝首页个性化引出的问题出发,从微观到宏观讲述了页面的优化实践,提出了几条可以借鉴的「黄金法则」,希望对你有所启发,后续会继续给大家带来淘宝首页稳定性保障的分享。

本文为转载文章,作者:小胡子哥(@Barret李靖)网址:http://www.barretlee.com/blog/2016/04/01/optimization-in-taobao-homepage/,如有侵权请第一时间联系公众号:数通畅联或QQ群:299719834。

文章从互联网整理而来,旨在传播SCRUM、研发项目管理、敏捷开发管理工具的知识与应用,帮助软件开发企业真正了解SCRUM的价值和意义,如果本文侵犯了您的权益或者您需要具体了解更多国内做研发项目管理系统的公司翼发云敏捷项目管理系统的相关信息,欢迎和我们联络:

【网址】www.effapp.com

2018-04-27T08:23:49+08:002018-04-27 08:23:49|Categories: scrum项目管理|