热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WEB性能优化:对关键请求进行排序

构建一个网站服务看似简单:发送HTML,浏览器识别出接下来需要加载什么资源。然后,我们耐心的等待页面就绪。你不知道的是,这

构建一个网站服务看似简单:发送 HTML,浏览器识别出接下来需要加载什么资源。然后,我们耐心的等待页面就绪。

你不知道的是,这背后发生了很多事情。你有没有想过,浏览器是如何判断哪些资产需要以什么顺序被请求的?

内容概览:

  1. 什么是资产优先级?

  2. Chrome 如何安排资源优先级?

  3. 什么样的请求是关键的?

  4. Lighthouse 审计:避免关键请求的依赖链。

  5. 技术:控制请求优先级。

  6. 技术:图片懒加载。

  7. 技术:font-display

  8. 关键请求检查清单。


什么是资产优先级?

现代浏览器用流式解析器来解析 HTML —— 在完全下载之前,就可以在 HTML 标记之中找到资产。当浏览器找到资产时,就会按照预先确定的优先级把它们加到网络队列中。

图片

可视化的分析一个网站以及它的资源优先级。

预先确定的优先级可能是:Lowest, Low, Medium, High 和 Highest 其中之一。通过优先级分配,浏览器可以知道哪个请求对页面快速加载最关键。

本文以 Chrome 为主,但其他浏览器对请求的优先级排序也是类似的。你可以在 Chrome、Safari、Firefox 或 Edge 开发者工具中,通过右键单击任何表格标题并选择“优先级”来查看请求优先级。

图片

如何在 Chrome 开发者工具中启用“优先级”列来检查请求优先级

请求优先级也可以在Chrome的 Performance 面板中看到:

图片

如何在 Chrome 开发者工具的 Performance 面板中调查资源的时间和优先级

Chrome 如何安排资源优先级?

资源按出现的顺序被添加到网络队列中。然后浏览器会把网络活动投入用于尽快获取到最高优先级的资源。

每种资源类型都有自己的一组规则来决定分配给它的优先级:

资源类型优先级
HTMLHighest
FontsHigh
StylesheetsHighest
通过 @import 加载的 StylesheetsHighest,会被安排在阻塞脚本之后。
Images默认是 Low,在初始视口中渲染时升级为 Medium。
JavascriptsLow, Medium 或 High。查看 Addy Osmani 的 Javascript Loading Priorities in Chrome[1] 来获取更多细节。
Ajax,XHR,或者 fetch() APIHigh

什么样的请求是关键的?

关键请求是指显示在页面初始视口里的资源。

这些资源对 Core Web Vitals[2] 中诸如 Largest Contentful Paint(最大内容绘制)[3] 和 First Contentful Paint[4](首次内容绘制)这些指标有着直接的影响。以这篇文章为例,我们可以直观地识别出视口需要的资产,以便完全渲染。

图片

对浏览者来说至关重要的内容是报头和文章标题

对于这个页面来说,关键的请求是:

  1. HTML

  2. CSS

  3. LOGO

  4. 3 个字权重

  5. 头条图片(Largest Contentful Paint 元素)

这些资源(注意,没有 Javascript)对于初始视口的视觉展示至关重要。他们应该先被加载。

在审计你的页面时,我们推荐:

  • 对页面进行可视化审计,注意视口中的关键元素。

  • 最初的 5 个 HTTP 请求应该是:HTML + 4 个关键请求。

  • 确保关键的请求不要被重定向。

  • 更新你的站点,确保关键资源是优化过、压缩过、有缓存能力且有正确的 HTTP 头的。


Lighthouse 审计:避免关键请求的依赖链

谷歌的 Lighthouse 套件附带了一个名为“避免关键请求的依赖链”的审计,高亮展示了被链接在一起的请求。当浏览器在发出请求是由于另一个请求引用它时(也称为依赖项),我们称之为请求链。

图片

Lighthouse 避免关键请求的依赖链审计的例子

关键请求链最常见的一个例子是,比如某些样式表内部加载了在初始页面视口显示的字体或背景图像。

@font-face {font-family: 'Calibre';font-weight: 400;font-display: swap;src: url('/Calibre-Regular.woff2') format('woff2'), url('/Calibre-Regular.woff')format('woff');}.carousel-bg {background-image: url('/images/main-masthead-bg.png');}

你可以使用 Lighthouse 的“避免关键请求的依赖链”的审计来诊断和识别出页面中的资源依赖。

减少关键请求链的整体数量,有助于更快的 Largest Contentful Paint(最大内容绘制) 和即时的用户体验。

为了减少关键请求链的影响,请使用以下 Web 性能策略:

  • 减少请求的数量

  • 使用压缩和最小化来减少资源的大小

  • 将非关键脚本标记为异步

  • 考虑将@font-face声明直接内联到 HTML 中

  • 避免使用 CSS 背景图片或@import

  • 使用预加载提前获取关键资源

  • 使用 bundlephobia[5] 寻找该库的更小替代品


技术:控制请求优先级

请求优先级会被 preload[6] 的使用所影响。预加载的资源会被分配为高优先级,并且在页面的初始加载中优先被请求。


图片

优先级排序前后的 webfont 资产。排序后,以 High 优先级请求字体

使用 preload,相当于告诉浏览器:“你可能还不知道它是什么,但我们需要它。”

预加载有助于优化关键请求,但也不要滥用!如果预加载了过多的资源,页面性能会劣化[7]。

预加载会影响 Largest Contentful Paint(最大内容绘制) 和 Cumulative Layout Shift[8](累积布局偏移)。在某些情况下,影响可能是负面的。我们建议使用预加载请求进行试验,但一定要前后仔细测试。

技术:图片懒加载

默认情况下,浏览器会加载 HTML中指定的所有图片,哪怕用户实际上永远不会看见的那些。懒加载允许你指定某些图片只有当用户滚动页面到它们附近时才去请求。如果用户不滚动页面,浏览器就不会加载这些图片。

使用这种方法,您可以提高整体渲染速度,并节省不必要的数据传输。懒加载是提高 Largest Contentful Paint(最大内容绘制)的有效方法。

过去,我们使用第三方库或手写脚本实现懒加载。如今,它已内置在浏览器中[9]。

使用方法如下:

  • 在已经知道会出现在视口下方的  元素上加上 loading="lazy" 属性。

  • 当页面滚动时,懒加载的图片已经加载完成,准备好展示了。

图片

累积布局偏移(CLS)标识用户交互期间的页面布局偏移。请确保设置图像的 width 和 height 属性,以避免懒加载的图像在渲染时,页面重新布局。

就是这样!懒加载的实现方法并不复杂,但是对加速渲染非常有帮助。一定要尽可能用上。

技术:font-display

根据 HTTP Archive 中的统计,69% 的站点使用 web 字体[10]。不幸的是,不幸的是,在大多数情况下,它们提供的体验都低于标准。

每个人都目睹过字体出现,然后消失,改变了粗细,页面仿佛被震动了一样。这些移位现在会被累积布局移位(CLS)指标所测量。

我们已经证实了用  控制字体请求的优先级对渲染速度有惊人的影响。所以显而易见,我们在大部分情况下都应该提高字体请求的优先级。

我们可以用 CSS font-display[11] 进一步提高渲染速度。这个 CSS 属性允许你控制字体在请求和加载后如何展示。

你可以用 font-display 来优化 Largest Contentful Paint[12](最大内容绘制)和 Cumulative Layout Shift[13](累积布局偏移)

有五个 font-display 选项[14]供您选择。我们推荐使用 swap 选项,它可以先立即呈现文本,然后在加载网络字体后立即替换。

给定这样的字体栈:

body {font-family: Calibre, Helvetica, Arial;
}

浏览器会先用 Helvetica 字体展示(或者 Arial,如果你的系统里没有安装 Helvetica)直到 Calibre 字体加载完成。

没有 font-display

文字在 HTML、CSS 和网络字体加载完后才展示:

图片

没有 font-display,文本在 2.44 秒显示。

加上 font-display: swap

文字在 HTML 下载并且处理后立刻显示了,取得 1.6 秒的进步:

图片

使用 font-display,文本在 835 毫秒显示。

font-display 在主流现代浏览器里支持的不错[15],你可以从今天开始使用它了。

关键请求检查清单

有了这些知识,您现在应该能够为您的站点选择最关键的资产,并相应地对它们进行优先级排序。如果你想进一步推进优先级和速度的优化,请遵循以下清单:

  • 启用Chrome开发者工具的 Priority 列。

  • 尽可能减少所需的关键请求的数量。

  • 检查哪些请求必须在用户看到完整渲染的页面之前发出。使用  对这些关键请求进行优先处理。

  • 使用 link prefetching[16],优化可能在下一个导航中使用的资源。

  • 使用 Link Preload HTTP headers[17] 声明要在 HTML 完全交付之前预加载的资源。

  • 确保图像尺寸正确的提前写好。

  • 使用内联 SVG 展示 Logo 和图标。

  • 使用更好的图像格式,如 AVIF 或 WEBP。

  • 使用 font-display: swap 在初始渲染中展示文本。

  • 使用压缩的字体格式,如 WOFF2 或 variable fonts(可变形字体)。

  • 在 Chrome://net-internals/#events 中查看 Chrome 的网络事件。

  • 记住:最快的请求,是从未发出的请求。

祝你优化快乐!

参考资料

[1]Javascript Loading Priorities in Chrome: https://tech.bytedance.net/articles/7025506101156118536#:~:text=Javascript%20Loading%20Priorities%20in%20Chrome

[2]Core Web Vitals: https://tech.bytedance.net/articles/7025506101156118536#:~:text=%E8%BF%99%E4%BA%9B%E8%B5%84%E6%BA%90%E5%AF%B9-,Core%20Web%20Vitals,-%E4%B8%AD%E8%AF%B8%E5%A6%82%20Largest

[3]Largest Contentful Paint(最大内容绘制): https://web.dev/lcp/

[4]First Contentful Paint: https://tech.bytedance.net/articles/7025506101156118536#:~:text=First%20Contentful%20Paint

[5]使用 bundlephobia: https://bundlephobia.com/package/moment@2.29.1

[6]preload: https://tech.bytedance.net/articles/7025506101156118536#:~:text=%E4%BC%98%E5%85%88%E7%BA%A7%E4%BC%9A%E8%A2%AB-,preload,-%E7%9A%84%E4%BD%BF%E7%94%A8%E6%89%80

[7]页面性能会劣化: https://tech.bytedance.net/articles/7025506101156118536#:~:text=%E8%BF%87%E5%A4%9A%E7%9A%84%E8%B5%84%E6%BA%90%EF%BC%8C-,%E9%A1%B5%E9%9D%A2%E6%80%A7%E8%83%BD%E4%BC%9A%E5%8A%A3%E5%8C%96,-%E3%80%82

[8]Cumulative Layout Shift: https://web.dev/cls/

[9]内置在浏览器中: https://caniuse.com/?search=lazy

[10]69% 的站点使用 web 字体: https://httparchive.org/reports/state-of-the-web?start=latest#fonts

[11]CSS font-display: https://css-tricks.com/almanac/properties/f/font-display/

[12]Largest Contentful Paint: https://web.dev/lcp

[13]Cumulative Layout Shift: https://web.dev/cls/

[14]五个 font-display 选项: https://css-tricks.com/almanac/properties/f/font-display/

[15]支持的不错: https://caniuse.com/mdn-api_fontface_display

[16]link prefetching: https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ

[17]Link Preload HTTP headers: https://www.w3.org/TR/preload/


推荐阅读
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
author-avatar
Miany_201314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有