HTML 默认情况下快速且易于访问。作为开发者,我们的工作是在创建或编辑 HTML 代码时确保保持这两个特性。例如当嵌入的 文件大小过大,或者 JavaScript 解析阻塞了关键页面元素的渲染时,情况可能会比较复杂。本文将引导你了解关键的 HTML 性能特性,以大幅提高网页质量。
前提: | 基本的计算机知识, 已安装基本软件,以及基本的客户端 Web 技术知识。 |
---|---|
目标: | 学习了解 HTML 对网站性能的影响,以及如何优化 HTML 以提高性能。 |
咨询热线
18888889999HTML 默认情况下快速且易于访问。作为开发者,我们的工作是在创建或编辑 HTML 代码时确保保持这两个特性。例如当嵌入的 文件大小过大,或者 JavaScript 解析阻塞了关键页面元素的渲染时,情况可能会比较复杂。本文将引导你了解关键的 HTML 性能特性,以大幅提高网页质量。
前提: | 基本的计算机知识, 已安装基本软件,以及基本的客户端 Web 技术知识。 |
---|---|
目标: | 学习了解 HTML 对网站性能的影响,以及如何优化 HTML 以提高性能。 |
就性能而言,HTML 非常简单,它主要是文本,文本大小较小,因此下载和渲染速度通常很快。影响网页性能的关键问题包括:
备注: 简化 HTML 结构和对源代码进行缩小化可以加快渲染和下载速度是有道理的。然而,与图像和视频相比,HTML 文件大小微不足道,而且现代浏览器的渲染速度非常快。如果你的 HTML 源代码非常庞大且复杂,导致渲染和下载性能受到影响,那么你可能存在更大的问题,并且应该考虑简化和拆分内容。
响应式设计彻底改变了在不同设备上处理网页内容布局的方式。它的一个关键优势是可以动态切换根据不同的屏幕尺寸优化后的布局,例如宽屏布局与窄屏(移动设备)布局之间的切换。它还可以根据其他设备属性,如分辨率或亮色或暗色配色方案的偏好,来处理内容的动态切换。
所谓的“移动优先”技术可以确保默认布局适用于小屏幕设备,因此移动设备只需下载适合其屏幕的图像,无需下载更大的桌面图像,以此提高性能。然而,由于这是通过 CSS 中的媒体查询来控制的,因此它只能对在 CSS 中加载的图像的性能产生积极影响。
在下面的小节中,我们将总结如何实现响应式的替代元素。你可以在视频和音频内容和响应式图像指南中找到更多关于这些实现的详细信息。
要根据设备的分辨率和视口大小提供相同图像的不同分辨率版本,你可以利用 和 这两个属性。
以下示例为不同屏幕宽度提供了不同尺寸的图像:
提供源图像的固有尺寸以及它们的文件名,而 在每种情况下提供媒体查询和需要填充的图像槽宽度。然后,浏览器根据每个槽位决定加载哪些图像。例如,如果屏幕宽度小于等于 ,那么 为真,因此需要填充的槽位是 。在这种情况下,浏览器很可能选择加载 480w.jpg 文件(480px 宽的图像)。这有助于性能提升,因为浏览器不会加载比所需更大的图像。
以下示例为不同屏幕分辨率提供了不同分辨率的图像:
、 等是相对分辨率指示器。如果图像的样式设置为 320px 宽(例如在 CSS 中使用 ),则如果设备分辨率较低(每个 CSS 像素对应一个设备像素),浏览器将加载 ,如果设备分辨率较高(每个 CSS 像素对应两个或更多设备像素),则加载 。
在这两种情况下, 属性在浏览器不支持 / 的情况下提供了默认图像。
元素基于传统的 元素,允许你为不同的情况提供多个不同的源。例如,如果布局是宽的,你可能希望有一个宽的图像,如果是窄的,你将希望有一个在该上下文中仍然有效的较窄的图像。
当然,在移动设备上,这也有助于通过提供较小的信息下载来提高性能。
下面是一个示例:
元素在 属性中包含媒体查询。如果媒体查询返回 true,则加载其 元素的 属性中引用的图像。在上面的示例中,如果视口宽度为 或更小,则加载 图像。还要注意 元素包含了一个 元素,在不支持 的浏览器中提供了默认图像加载。
请注意,在此示例中使用了 属性。如前一节所示,你可以为每个图像源提供不同的分辨率。
元素在提供不同来源方面的工作方式类似:
然而,提供图像和视频的源之间存在一些关键差异:
提高性能的一个非常有用的技术是懒加载。这指的是在 HTML 渲染时不立即加载所有图像,而是仅在它们实际对用户可见(或即将可见)时加载它们。这意味着立即可见/可用的内容更快地准备就绪,而随后的内容只有在滚动到时才会渲染其图像,并且浏览器不会浪费带宽加载用户永远看不到的图像。
懒加载通常使用 JavaScript 处理,但现在浏览器有一个可用的 属性,可以指示浏览器自动进行图像的懒加载:
详细信息请参见 web.dev 上的浏览器级 web 图像懒加载。
你还可以使用 属性来对视频内容进行延迟加载。例如:
将 的值设置为 告诉浏览器在用户决定播放视频之前不要预加载任何视频数据,这对性能显然是有益的。相反,它只会显示由 属性指示的图像。不同的浏览器具有不同的默认视频加载行为,因此最好明确指定。
详细信息请参见 web.dev 上的视频懒加载。
在网页中嵌入来自其他来源的内容非常常见。这通常在网站上显示广告以产生收入时使用,广告通常由第三方公司生成并嵌入到你的页面中。其他用途可能包括:
嵌入内容最常用的方式是使用 元素,尽管还存在其他不太常用的嵌入元素,如 和 。在本节中,我们将重点关注 。
使用 方面的最重要也是最关键的建议是:“除非非常必要,否则不要使用嵌入式 ”。如果你要创建一个包含多个不同信息窗格的页面,你可能会觉得把它们分成单独的页面并加载到不同的 中是有组织性的。但是,这样做会带来一些性能和其他方面的问题:
建议将内容放在单个页面中。如果你想在页面更改时动态获取新内容,仍然比将其放入 中更好,这样可以提高性能。例如,你可以使用 方法获取新数据,然后使用一些 DOM 脚本将其插入到页面中。更多信息,请参见从服务器获取数据和操作文档。
备注: 如果你掌控内容并且内容相对简单,你可以考虑使用在 属性中以 base-64 编码的内容填充 ,甚至可以将原始 HTML 插入到 属性中(有关更多信息,请参见 Iframe 性能第二部分:好消息)。
如果必须使用 ,请保持谨慎。
与 元素一样,你还可以使用 属性指示浏览器对最初屏幕外的 内容进行懒加载,从而提高性能:
详情请参阅是时候延迟加载屏外 iframe 了!。
资源加载的顺序对于最大化感知和实际性能非常重要。当加载网页时:
备注: 这只是一个非常简单的叙述,但可以让你了解发生的事情。
多种 HTML 特性允许你修改资源加载方式以提高性能。现在我们将探讨其中一些功能。
解析和执行 JavaScript 会阻塞后续 DOM 内容的解析。这就增加了页面渲染和用户要使用该内容所需等待的时间。一个小的脚本不会有太大影响,但考虑到现代 Web 应用程序通常非常依赖 JavaScript,这一点很重要。
默认的 JavaScript 解析行为的另一个副作用是,如果正在渲染的脚本依赖于页面后面出现的 DOM 内容,将会出现错误。
例如,想象一个页面上简单的段落:
现在想象一个包含以下代码的 JavaScript 文件:
我们可以通过在 元素中引用它来将此脚本应用于页面:
如果我们将这个 元素放在 元素之前(例如,在 元素中),页面会抛出错误(例如,Chrome 报告到控制台上的错误为“Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')”)。这是因为脚本依赖于 元素才能正常工作,但在解析脚本时, 元素在页面上并不存在。它尚未被渲染。
要解决上述问题,可以将 元素放在 元素之后(例如放在文档主体的末尾),或者在适当的事件处理程序中运行代码(例如,在 上运行,其在 DOM 完全解析后触发)。
然而,这并不能解决等待脚本加载的问题。可以通过在 元素中添加 属性来实现更好的性能:
这会使脚本获取与 DOM 解析并行进行,因此它会在相同的时间准备好,不会阻塞渲染,从而提高性能。
备注: 还有另一个属性 ,它会使脚本在文档解析完成之后、 事件触发之前执行。这与 有类似的效果。
处理 JavaScript 加载的另一个技巧是将脚本拆分为代码模块,并在需要时加载每个部分,而不是将所有代码放入一个巨大的脚本并在开头加载。这可以通过使用 JavaScript 模块来实现。阅读链接的文章以获取详细指南。
从 HTML、CSS 和 JavaScript 中链接到的其他资源(如图像、视频或字体文件)的获取也可能导致性能问题,阻塞代码的执行并减慢体验速度。一种缓解此类问题的方法是使用 将 元素转换为预加载器。例如:
遇到 链接时,浏览器将尽快获取所引用的资源,并使其在浏览器缓存中可用,以便在后续代码中引用时更快地准备好。预加载用户在页面浏览早期会遇到的高优先级资源非常有用,这样可以让用户获得尽可能流畅的体验。
有关使用 的详细信息,请参阅以下文章:
备注: 你还可以使用 预加载 CSS 和 JavaScript 文件。