性能优化

构建对象模型

浏览器渲染页面前需要先构建 DOM 和 CSSOM 树。因此,我们需要确保尽快将 HTML 和 CSS 都提供给浏览器。

  • 字节 → 字符 → 令牌 → 节点 → 对象模型。
  • HTML 标记转换成文档对象模型 (DOM);CSS 标记转换成 CSS 对象模型 (CSSOM)。
  • DOM 和 CSSOM 是独立的数据结构。
  • Chrome DevTools Timeline 让我们可以捕获和检查 DOM 和 CSSOM 的构建和处理开销。

渲染树构建、布局及绘制

  • DOM 树与 CSSOM 树合并后形成渲染树。
  • 渲染树只包含渲染网页所需的节点。
  • 布局计算每个对象的精确位置和大小。
  • 最后一步是绘制,使用最终渲染树将像素渲染到屏幕上。
为构建渲染树,浏览器大体上完成了下列工作:
  • 从 DOM 树的根节点开始遍历每个可见节点。
    • 某些节点不可见(例如脚本标记、元标记等),因为它们不会体现在渲染输出中,所以会被忽略。
    • 某些节点通过 CSS 隐藏,因此在渲染树中也会被忽略,例如,上例中的 span 节点—不会出现在渲染树中,—因为有一个显式规则在该节点上设置了“display: none”属性。
  • 对于每个可见节点,为其找到适配的 CSSOM 规则并应用它们。
  • 发射可见节点,连同其内容和计算的样式。

阻塞渲染的 CSS

请注意“阻塞渲染”仅是指浏览器是否需要暂停网页的首次渲染,直至该资源准备就绪。无论哪一种情况,浏览器仍会下载 CSS 资产,只不过不阻塞渲染的资源优先级较低罢了。

  • 默认情况下,CSS 被视为阻塞渲染的资源。
  • 我们可以通过媒体类型和媒体查询将一些 CSS 资源标记为不阻塞渲染。
  • 浏览器会下载所有 CSS 资源,无论阻塞还是不阻塞。

使用 JavaScript 添加交互

JavaScript 允许我们修改网页的方方面面:内容、样式以及它如何响应用户交互。 不过,JavaScript 也会阻止 DOM 构建和延缓网页渲染。 为了实现最佳性能,可以让您的 JavaScript 异步执行,并去除关键渲染路径中任何不必要的 JavaScript。

  • JavaScript 可以查询和修改 DOM 与 CSSOM。
  • JavaScript 执行会阻止 CSSOM。
  • 除非将 JavaScript 显式声明为异步,否则它会阻止构建 DOM。
  • 脚本在文档中的位置很重要。
  • 当浏览器遇到一个 script 标记时,DOM 构建将暂停,直至脚本完成执行。
  • JavaScript 可以查询和修改 DOM 与 CSSOM。
  • JavaScript 执行将暂停,直至 CSSOM 就绪。

评估关键渲染路径

  • Lighthouse 方法会对页面运行一系列自动化测试,然后生成关于页面的 CRP 性能的报告。 这一方法对您的浏览器中加载的特定页面的 CRP 性能提供了快速且简单的高级概览,让您可以快速地测试、循环访问和提高其性能。
  • Navigation Timing API 方法会捕获[真实用户监控 指标。如名称所示,这些指标捕获自真实用户与网站的互动,并为真实的 CRP 性能(您的用户在各种设备和网络状况下的体验)提供了准确的信息。

分析关键渲染路径性能

到目前为止,我们只关注了资源(CSS、JS 或 HTML 文件)可供处理后浏览器中会发生的情况,而忽略了从缓存或从网络获取资源所需的时间。我们作以下假设:

  • 到服务器的网络往返(传播延迟时间)需要 100 毫秒。
  • HTML 文档的服务器响应时间为 100 毫秒,所有其他文件的服务器响应时间均为 10 毫秒。

优化关键渲染路径

为尽快完成首次渲染,我们需要最大限度减小以下三种可变因素:

  • 关键资源的数量。

  • 关键路径长度。

  • 关键字节的数量。
    关键资源是可能阻止网页首次渲染的资源。这些资源越少,浏览器的工作量就越小,对 CPU 以及其他资源的占用也就越少。
    优化关键渲染路径的常规步骤如下:

  • 对关键路径进行分析和特性描述:资源数、字节数、长度。

  • 最大限度减少关键资源的数量:删除它们,延迟它们的下载,将它们标记为异步等。

  • 优化关键字节数以缩短下载时间(往返次数)。

  • 优化其余关键资源的加载顺序:您需要尽早下载所有关键资产,以缩短关键路径长度。

PageSpeed 规则和建议

  • 消除阻塞渲染的 JavaScript 和 CSS
    要以最快速度完成首次渲染,需要最大限度减少网页上关键资源的数量并(尽可能)消除这些资源,最大限度减少下载的关键字节数,以及优化关键路径长度。

  • 优化 JavaScript 的使用

    • 首选使用异步 JavaScript 资源
    • 避免同步服务器调用
    • 延迟解析 JavaScript
    • 避免运行时间长的 JavaScript
  • 优化 CSS 的使用

    • 将 CSS 置于文档 head 标签内
    • 避免使用 CSS import
    • 内联阻塞渲染的 CSS

加载过程是最为耗时的过程,可能会占到总耗时的80%时间,因此是优化的重点

    原文作者:Viaphlyn
    原文地址: https://www.jianshu.com/p/dbc1f3d3dd80
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞