你有没有设置Brotli或Zopfli压缩,OCSP装订和HPACK压缩?此外,如何对资源的提示,提示客户和CSS遏制-更不用说IPv6的HTTP / 2及服务工作?
早在一天,业绩往往是一个单纯的事后。经常推迟,直到该项目的最后,它会归结为微小,串联,资产优化和潜在的一些微调,在服务器上的config
文件。现在回过头来看,事情似乎已经相当显著的变化。
性能不仅仅是一个技术的关注:它很重要,并烘烤到工作流程时,设计决策必须根据其性能问题的通知。性能被测量,监控和不断细化,和网络的日益复杂构成,使得它难以跟踪的度量的新的挑战,因为指标会取决于设备,浏览器,协议,网络类型和等待时间显著变化(的CDN,互联网服务供应商,高速缓存,代理服务器,防火墙,负载均衡和服务器都发挥性能的作用)。
所以,如果我们创造了我们所提高性能时要记住的事情的概况-从过程的一开始,直到该网站的最终版本-将这个列表是什么样子?下面你会发现一个(希望偏见和客观的)前端性能检查表2017年 -你可能需要考虑的问题的概述,以确保您的响应时间快和你的网站顺利。
(你也可以下载PDF格式的清单(0.129 MB)或苹果下载页面清单(0.236 MB)。快乐优化!)
前端性能清单2017年链接
微优化是为保持对轨道的表现,但它的关键心里有明确的目标 – 这将影响到整个过程中所做的任何决定可衡量的目标。有几个不同的模式,并在下面讨论的那些都相当自以为是 – 只要确保在初期设定自己的优先级。
准备和设置的目标链接
- 比你的竞争对手的最快速度快20%。
根据心理学的研究,如果你希望用户觉得你的网站比其他任何网站更快,你需要更快至少20%。全页面加载时间并不如指标,如开始渲染时间有关,在第一个有意义的涂料(即一个页面来显示其主要内容所需的时间)和时间互动(时间在哪个页面-和主要是一个单页的应用-似乎是足够准备用户可与其交互)。测量开始渲染(带WebPagetest)和第一个有意义的油漆倍(与灯塔上的摩托G,)中档三星的设备和良好的中间的路线的设备,如一个的Nexus 4,最好在打开设备的实验室 -定期3G,4G和Wi-Fi连接。看看你的分析,看看你的用户是什么。然后,您可以模仿90个百分点的测试经验。收集数据,建立了一个电子表格,剃掉20%,并成立了自己的目标(即绩效预算)这种方式。现在,你有什么可衡量的测试反对。如果你牢记预算,并试图出货仅下跌最小的脚本来得到一个快速的时间到交互的价值,那么你是一个合理的路径上。
分享与同事的清单。确保清单是熟悉你的团队的每一个成员,以避免误解的路线。每一个决定会对性能产生影响,该项目会从巨大的时候概念,UX和视觉设计都决定了前端开发人员正在积极参与中受益。地图设计决策对绩效预算,并在核对表确定的优先事项。
- 100毫秒的响应时间,每秒60帧。
在轨性能模型给你健康的目标:尽最大努力在初始输入后不到100毫秒提供反馈。要允许<100毫秒的响应,该页面必须在每次<50毫秒后产生控制权返回给主线程在最新的。对于高压力点喜欢动漫,最好什么都不要做,在这里你可以和绝对最低,你不能。此外,动画的每一帧应小于16毫秒内完成,从而实现每秒(1秒÷60 = 16.6毫秒),60帧-最好是在10毫秒。因为浏览器需要时间来绘制新的帧到屏幕上的代码要完成击球16.6毫秒大关之前执行。乐观和明智地利用空闲时间。显然,这些指标适用于运行时的性能,而不是加载性能。 - 下1.25秒第一个有意义的油漆,SpeedIndex 1000下
虽然它可能是很难实现的,你的最终目标应该是小于1秒开始渲染时间和SpeedIndex 1000下的值(快速连接)。对于第一个有意义的油漆,顶多指望1250毫秒。对于移动,在3秒3G开始渲染时间在移动设备上是可以接受的。依据略高于是好的,但推获得尽可能低这些值。
定义环境链接
- 选择并设置您的构建工具。
不要太注意什么所谓冷却这些天。坚持你的环境,用于构建,无论是兽人,咕嘟咕嘟,WebPACK中,PostCSS或工具的组合。只要你是快速得到结果,你有没有问题,维护您的构建过程中,你做的很好。 - 逐步增强。
保持渐进增强作为前端的架构和部署的指导原则是一个安全的赌注。设计首先打造核心经验,然后加强与高级功能兼容的浏览器体验,创造弹性的经验。如果您的网站运行速度快一慢的机器上,在次优网络上的浏览器差一个贫穷的屏幕,那么它只会一个体面的网络上的一个很好的浏览器上运行一个快速的机器上更快。 - 角,反应过来,灰烬和合作。
赞成框架,使服务器端渲染。确保安定在一个框架之前测量在移动设备上的服务器端和客户端渲染模式的启动时间(因为改变这事后,由于性能问题,可能会非常硬)。如果你使用一个JavaScript框架,请确保您的选择通知和深思熟虑。不同的框架会对性能有不同的影响,并且需要优化不同的策略,所以你必须要了解清楚所有你可以依靠框架的螺母和螺栓。当建立一个Web应用程序,看看到PRPL模式和应用壳结构的。
- AMP或Instant文章?
根据不同的优先级和您的组织的策略,你可能要考虑使用谷歌的AMP或Facebook的即时文章。您可以取得良好的业绩没有他们,但AMP确实提供了免费的内容分发网络(CDN)表现稳健框架,同时即时文章将提升Facebook上的性能。你可以建立渐进的网络抗菌肽了。 - 选择你的CDN明智。
这取决于你有多少的动态数据有,你也许可以“外包”的内容的一些部分对静态站点生成器,它推到一个CDN,并从它提供静态版本,从而避免数据库请求。你甚至可以选择静态主机平台基于CDN的,交互式组件增强(丰富你的网页JAMStack)。注意的CDN服务可以(和卸载)动态内容呢?因此,限制你的CDN静态资产,是没有必要的。仔细检查您的CDN是否执行内容压缩和转换,智能HTTP / 2,配送,边端包含,其组装的在CDN的边缘页面静态和动态的部分(即最靠近用户服务器)和其他任务。
构建优化链接
- 设置你的优先级平直。
它知道你是在处理第一个好主意。运行所有的资产(JavaScript,图片,字体,第三方脚本和页面上的“贵”的模块,如旋转木马,复杂的信息图形和多媒体内容)的清单,并打破他们成群。设置一个电子表格。定义的基本核心的传统浏览器的体验(即完全无障碍的核心内容)时,增强了功能的浏览器体验(即丰富,充分的经验)和额外那些不是绝对必需的,可以是延迟加载,如(资产网页字体,风格不必要的,旋转木马脚本,视频播放器,社交媒体按键,大图像)。我们发表了“的文章提高碎杂志的性能 ”,它详细描述了这种方法。 - 使用“切割的芥末”技术。
使用切割的芥末技术派的核心体验到传统浏览器和增强的体验到现代的浏览器。在加载您的资产严格:立即加载的核心经验,对增强DomContentLoaded
和对群众演员load
的事件。需要注意的是该技术的浏览器版本,而不再是我们可以做的这些日子演绎设备能力。例如,便宜的Android手机在发展中国家大多是运行Chrome和将削减榨菜尽管他们有限的内存和CPU能力。要注意的是,虽然我们真的没有替代方案,该技术的使用已经成为最近的限制。 - 考虑微的优化和进步的引导。
在某些应用程序,可能需要一些时间来初始化应用程序可以渲染页面之前。显示骨架的屏幕,而不是装载的指标。查找模块和技术,以加快初始呈现时间(例如,树摇动和代码分割),因为大部分的性能问题来自初始解析时间来引导该应用。此外,使用一个超前-的即时编译器以卸载一些客户端呈现的给服务器很快,因此,输出可用的结果。最后,可以考虑使用Optimize.js更快的初始加载通过包装热切调用的函数(它可能没有必要再,虽然)。客户端呈现或服务器端渲染?在这两种情况下,我们的目标应该是建立逐步启动:使用服务器端渲染得到一个快速的第一个有意义的漆,但也包括一些最起码的JavaScript保持时间到交互的接近第一个有意义的油漆。然后,我们可以,按需或时间允许,应用程序启动的非必要部分。不幸的是,保罗·刘易斯注意到,框架通常没有优先的概念,可浮出水面给开发商,从而逐步引导,很难与大多数库和框架来实现。如果你有时间和资源,使用这种策略,最终提高性能。
- 包括HTTP缓存头设置是否正确?
仔细检查expires
,cache-control
,max-age
和其他HTTP缓存头已正确设置。在一般情况下,资源应该是很短的时间缓存或者(如果它们可能会改变)或无限期地(如果它们是静态的) -在需要时可以改变其版本中的URL。如果可能的话,使用Cache-control: immutable
,专为指纹的静态资源,避免再确认(截至2016年12月,仅支持在Firefox上https://
交易)。您可以使用Heroku的引物对HTTP缓存头,杰克阿奇博尔德的“ 缓存最佳实践 ”和伊利亚Grigorik的HTTP缓存底漆作为指导。 - 限制第三方库,以及异步加载的JavaScript。
当用户请求一网页时,浏览器取出的HTML和构建DOM中,然后取CSS和构造CSSOM,然后由DOM和CSSOM匹配生成渲染树。如果任何JavaScript需要解决,直到它得到解决,从而延缓渲染的浏览器将无法启动渲染页面。作为开发人员,我们必须明确地告诉浏览器不要等待,并开始渲染页面。为脚本做到这一点的方法是使用defer
和async
在HTML属性。在实践中,事实证明,我们应该更喜欢defer
到async
(以成本的Internet Explorer的用户直至并包括版本9,因为你很可能会打破脚本它们)。此外,限制第三方库和脚本的影响,特别是社交分享按钮和<iframe>
嵌入功能(如地图)。您可以使用静态的社会化分享按钮(如SSBG)和静态链接到交互式地图来代替。 - 图像被适当优化?
尽可能使用响应图像与srcset
,sizes
和<picture>
元素。当你在它,你也可以利用的的WebP格式由在职的WebP与图像<picture>
元素和JPEG回退(见安德烈亚斯Bovens’ 的代码片段)或使用内容协商(使用Accept
头)。素描本身支持的WebP和的WebP图像可以从Photoshop中使用导出为Photoshop的WebP插件。其他选项了。您也可以使用客户端提示,目前已获得浏览器的支持。没有足够的资源在复杂的标记为响应图像烤?使用响应图像断点发生器或服务,如Cloudinary自动图像优化。此外,在许多情况下,使用并独自将获得显著的好处。在碎杂志,我们使用后缀为图像名称-例如,; 每当映像包含后缀,每个人都对球队都知道,它已经进行了优化。
srcset
sizes
-opt
brotli-compression-opt.png
- 以图像优化到一个新的水平。
当你是一个目标网页上工作,它是至关重要的特定图像加载速度极快,确保JPEG文件是进步和压缩mozJPEG(其中通过操纵扫描的水平提高了开始渲染时间),Pingo的为PNG,有损GIF为GIF和SVGOMG为SVG。从模糊图像的不需要的部分(通过应用高斯模糊滤镜给他们),以减少文件大小,最终你甚至可以开始删除颜色或使图片黑色和白色,以进一步减小尺寸。对于背景图片,从Photoshop用0〜10%的质量导出照片可以绝对可以接受的为好。还不够好?好了,你也可以提高与图像感知性能多个背景图像的技术。 - 是Web字体进行了优化?
机会是很高,你所服务的网页字体字形包括和未使用额外的功能。你可以问你的类型代工子集网页字体或自己子集他们,如果你使用的是开源字体(例如,只包括拉美一些特殊的口音字形),以尽量减少他们的文件大小。WOFF2支持是伟大的,你可以使用WOFF和OTF作为回退为不支持它的浏览器。此外,从扎克莱特曼的策略之一“ 综合指南字体,加载策略 ”,并使用服务工作者缓存来持续缓存字体。需要一个快速的胜利?像素Ambacht有一个快速教程和案例分析,让您的字体秩序。如果不能满足您的服务器的字体和依靠第三方主机,确保使用的Web字体装载机。FOUT比FOIT更好 ; 开始渲染中的后备文字向右走,和异步加载的字体-你也可以使用loadCSS了点。你也许能逃脱本地安装的操作系统的字体为好。
- 迅速推向关键的CSS。
若要确保浏览器开始尽可能快地渲染你的网页,它已经成为一个普遍的做法,收集所有开始渲染页面(第一个可见的部分被称为“关键的CSS”或“需要的CSS以上的倍CSS “)和内嵌添加的<head>
页面,从而减少往返次数。由于在慢启动阶段交换包的大小限制,您的预算用于关键CSS大约是14 KB。如果点到为止,浏览器将需要另外往返获取更多的风格。CriticalCSS和关键使您能够做到这一点。您可能需要为你做它正在使用的每个模板。如果可能的话,请考虑使用条件内联的方式由长丝组使用。使用HTTP / 2,临界的CSS可以存储在一个单独的CSS文件和经由服务器推而不腹胀在HTML交付。美中不足的是,服务器推不一贯支持并具有一定的缓存问题(见幻灯片114起的Hooman贝赫什提的介绍)。效果可以,实际上是负的和膨胀的网络缓冲区,防止真正帧在文件中被递送。服务器推得多更有效的在温暖的连接,由于TCP慢启动。所以,你可能需要创建一个缓存意识HTTP / 2服务器推送机制。请记住,虽然,新的cache-digest
规范将否定需要手动构建这些“缓存意识”的服务器。 - 使用树摇晃和代码分裂,以减少有效载荷。
树晃动是仅包括实际生产中使用的代码来清理你的构建过程中的一种方式。您可以使用WebPACK中2删除未使用的出口,并UnCSS或氦气从CSS中删除未使用的样式。此外,你可能要考虑学习如何写出高效的CSS选择器以及如何避免臃肿和昂贵的风格。代码分裂是另一个WebPACK中的功能,将您的代码库成按需加载“块”。一旦你在你的代码中定义的分割点,WebPACK中需要照顾的依赖关系和输出文件。基本上,它使你保持最初的下载小,按需索取代码,当应用程序请求。请注意,汇总显示出比Browserify出口显著更好的结果。虽然我们在这,你可能想看看Rollupify,其中的ECMAScript 2015模块转换成一个大CommonJS的模块-因为小模块可以有一个令人惊讶的高性能成本取决于您选择的打捆和模块系统。 - 提高渲染性能。
隔离昂贵的组件与CSS遏制 -例如,以限制关断帆布导航,或第三方部件布局和油漆工作的浏览器的样式的范围。确保不存在滞后滚动时的页面或当元素的动画,并且您持续达到每秒60帧。如果这是不可能的,那么至少使每秒一致的框架最好到15.使用CSS混合范围内的60“ 通知,其中的元素和属性将改变浏览器。will-change
此外,测量的运行时的渲染性能(例如,在DevTools)。要开始使用,请保罗·刘易斯的“免费浏览器的渲染优化Udacity课程。我们也有由谢尔盖·Chikuyonok如何律“的文章让GPU的动画权。 - 预热加快交货的连接。
使用骨架屏幕,延迟加载所有昂贵的组件,如字体,JavaScript的,旋转木马,视频和iframe中。利用资源的提示,以节省时间(其在后台执行DNS查找), (其询问浏览器开始在后台连接握手(DNS,TCP TLS)), (其中询问浏览器来请求资源) ,(它要求的浏览器来呈现在背景指定页)和(其中预取资源,而无需执行它们,除其他事项外)。需要注意的是在实践中,根据浏览器的支持,你会更喜欢到,你会用谨慎和-如果你是在哪里,用户将在下一个去(比如非常有信心,后者只应使用,在购买渠道)。dns-prefetch
preconnect
prefetch
prerender
preload
preconnect
dns-prefetch
prefetch
prerender
HTTP / 2 链接
- 准备好HTTP / 2。
随着谷歌向更加安全的网络移动 Chrome浏览器的所有HTTP网页和最终处理为“不安全”,你需要对是否继续投注HTTP / 1.1或设置一个决定HTTP / 2的环境。HTTP / 2 支持的非常好 ; 它不会去任何地方; 在大多数情况下,你用它更好。这项投资将是相当显著,但你需要移动到HTTP / 2迟早的事。最重要的是,你可以得到一个重大的性能提升与服务工作及服务器推送(至少长期)。的缺点是,你必须迁移到HTTPS,并根据您的HTTP / 1.1的用户群有多大(即在旧版操作系统或对旧版浏览器的用户),你必须发送不同的版本,其中需要你去适应一个不同的构建过程。当心:设置迁移和新的构建过程可能会非常棘手和耗时。对于本文的其余部分,我假设你要么切换到或已经切换到HTTP / 2。
- 正确部署HTTP / 2。
再次,通过HTTP / 2服务资产需要如何到目前为止一直在服务资产大修。你需要找到打包模块和并行装载许多小模块之间的平衡。在一方面,你可能要完全避免串联的资产,而不是打破你的整个界面分成许多小模块,压缩它们作为构建过程的一部分,通过引用它们的“侦察兵”的做法,并在并行加载它们。在一个文件中的变化不会要求整个样式表或JavaScript被重新下载。在另一方面,包装仍然重要,因为有与发送许多小的JavaScript文件到浏览器的问题。首先,压缩将受到影响。一大包的压缩将受益于字典重用,而小单独的包不会。还有,以解决该标准的工作,但它远现在。其次,浏览器都尚未得到优化这种工作流程。例如,Chrome将触发进程间通信(IPC的)线性资源的数量,因此包括数百资源将有浏览器的运行成本。不过,你可以尝试逐步加载CSS。显然,这样做,你都在积极惩罚HTTP / 1.1的用户,所以你可能需要生成并服务于不同的构建,以不同的浏览器为您的部署过程,这就是事情变得稍微复杂的一部分。你可以摆脱HTTP / 2连接凝聚,它允许您使用域分片而来自HTTP / 2中受益,但实现这在实践中是困难的。
该怎么办?如果你正在运行在HTTP / 2,发送关于10包似乎是一个体面的妥协(及是不是太糟糕了传统浏览器)。实验并测量找到您的网站的正确的平衡。
- 确保你的服务器上的安全性是防弹。
HTTP / 2碾过TLS的所有浏览器实现,所以你可能会希望避免安全警告或某些元素在页面上不工作。仔细检查您的安全头被正确设置,消除已知的漏洞,并检查您的证书。有没有迁移到HTTPS了吗?检查的HTTPS的唯一标准了深入讲解。此外,确保所有外部插件和跟踪脚本是通过HTTPS加载,跨站点脚本是不可能的,这两个HTTP严格传输安全标题和内容安全策略的头设置正确。 - 难道你的服务器和的CDN支持HTTP / 2?
不同的服务器和的CDN可能会支持HTTP / 2是不同的。使用是TLS快尚?检查你的选项,或者快速查找你的服务器是如何执行的功能,以及你可以期望得到支持。
- 是Brotli或Zopfli压缩用?
去年,谷歌推出了Brotli,一个新的开源无损数据格式,这是目前广泛的支持在Chrome,Firefox和Opera。在实践中,Brotli似乎是更有效的比gzip和deflate。它可能是缓慢的,以压缩,取决于设置,并慢压缩最终将导致更高的压缩率。尽管如此,它解压缩速度快。因为算法来自谷歌,这并不奇怪,浏览器将接受它只有当用户访问一个网站通过HTTPS -是的,也有对技术方面的原因,以及。美中不足的是,Brotli不会预装在大多数服务器都过来了,这是不容易建立无自NGINX编译或Ubuntu。但是,您可以甚至在不支持它的CDN使Brotli(有服务人员)还没有。或者,您可以考虑使用Zopfli的压缩算法,编码数据放气,gzip和zlib的格式。任何常规gzip压缩的资源将受益于Zopfli的提高deflate编码,因为这些文件会比的Zlib的最大压缩小3到8%。美中不足的是,文件将花费大约80倍的时间来压缩。这就是为什么它是在不发生大的变化的资源,也被设计为一次压缩,下载多少次文件使用Zopfli一个好主意。 - 是否启用OCSP装订?
通过使您的服务器上OCSP装订,可以加快你的TLS握手。在线证书状态协议(OCSP)被作为替代证书吊销列表(CRL)协议创建。这两个协议都用来检查SSL证书是否已被吊销。然而,在OCSP协议不需要浏览器要花费时间下载,然后证书信息搜索的列表,因此减少了握手所需的时间。 - 你有没有采用IPv6的了吗?
因为我们用完了在IPv4空间和主要移动网络正在迅速采用IPv6的(美国已经达到 50%的采用IPv6阈值),这是一个好主意,更新DNS到IPv6留防弹的未来。只要确保双栈支持通过网络提供的-它允许IPv6和IPv4到对方一起同时运行。毕竟IPv6是不向后兼容。此外,研究表明 IPv6的提出这些网站10〜15%的速度,由于邻居发现(NDP)和路由优化。 - 是HPACK压缩在使用?
如果您使用HTTP / 2,仔细检查你的服务器实现HPACK压缩的HTTP响应头,以减少不必要的开销。由于HTTP / 2服务器是比较新的,他们可能不完全支持的规范,具有HPACK就是一个例子。H2spec是一个伟大的(如果非常详细的技术)工具来检查。HPACK工作。
- 用于高速缓存和网络回退劳务工?
在网络上没有性能优化可能比用户的计算机上本地存储的缓存速度更快。如果你的网站是运行在HTTPS,用“ 实用主义指南服务工作者 ”,在服务工作者缓存到缓存静态资产和存储离线回退(甚至脱机页),并从用户的计算机进行检索,而不是去网络。此外,检查杰克的脱机食谱和自由Udacity课程“ 离线Web应用程序。”浏览器的支持?它到达那里,和回退是网络呢。
测试和监控链接
- 监控混合内容的警告。
如果您最近从HTTP迁移到HTTPS,确保监测主动和被动混合内容的警告,用工具如Report-URI.io。您还可以使用混合内容扫描到扫描启用HTTPS的网站为混合内容。 - 在DevTools您的开发工作流程进行了优化?
选择一个调试工具,点击每一个按钮。请确保您了解如何分析渲染性能和控制台输出,以及如何调试JavaScript和编辑CSS样式。奥马尔汉莎最近准备一个(巨大)slidedeck和谈话涉及几十个不起眼的技巧和技术要知道调试和测试DevTools时。 - 您在代理的浏览器和传统的浏览器测试?在Chrome和Firefox测试是不够的。看看你的网站以代理的浏览器和旧版浏览器是如何工作的。UC浏览器和Opera Mini的,例如,有一个在亚洲显著的市场份额(在亚洲高达35%)。测量平均上网速度在你感兴趣的国家,以避免大的意外的道路。与网络限制测试和模拟高DPI设备。BrowserStack是太棒了,但在实际设备上测试也是如此。
- 被连续监测设置?
具有私有实例WebPagetest始终是快速和无限的测试是有益的。设置具有自动提醒性能预算连续监测。设置自己的用户正时标记来衡量和监测具体业务指标。考虑使用SpeedCurve监视性能随时间的变化,和/或New Relic的得到的见解,WebPagetest无法提供。此外,考虑SpeedTracker,灯塔和口径。
速赢链接
这份名单是相当全面的,并完成所有的优化可能需要相当长一段时间。所以,如果你有仅1小时就搞定显著的改善,你会怎么做?让我们熬一切归因于10唾手可得的果实。显然,然后再开始,一旦你完成,评估结果,包括在3G和电缆连接的开始渲染时间和SpeedIndex。
- 你的目标是一个开始下电缆1秒,下3G3秒渲染时间,并且在1000优化一个SpeedIndex值开始渲染时间和时间到交互。
- 准备关键的CSS你的主模板,并将其包含在
<head>
页面的。(您的预算是14 KB)。 - 延迟和延迟加载尽可能多的脚本越好,您自己和第三方脚本 – 尤其是社会媒体按钮,视频播放器和昂贵的JavaScript。
- 添加资源的提示,以加快交付速度更快
dns-lookup
,preconnect
,prefetch
,preload
和prerender
。 - 子网页字体并加载它们异步(或只需切换到系统的字体代替)。
- 优化的图像,并考虑使用的WebP关键页面(如登陆页面)。
- 检查HTTP缓存头和保安头设置正确。
- 在服务器上启用Brotli或Zopfli压缩。(如果那是不可能的,不要忘了启用Gzip压缩。)
- 如果HTTP / 2是可用的,使HPACK压缩和开始监测混合内容的警告。如果你正在运行在LTS,也使OCSP装订。
- 如果可能的话,缓存的资产,如字体,样式,JavaScript和图像 – 实际上,尽可能地! – 在服务工人缓存。