通过 PRPL 模式应用即时加载

PRPL 是首字母缩写词,描述了一种模式,该模式用于使网页加载并变得具有互动性,并且速度更快:

  • 预加载较晚发现的资源。
  • 尽快渲染初始路由。
  • 预缓存剩余的资产。
  • 延迟加载其他路由和非关键资产。

在本指南中,您将了解这些方法如何搭配使用,但仍可单独使用来取得理想的成效。

使用 Lighthouse 审核您的网页

运行 Lighthouse 以发现符合 PRPL 技术的改进机会:

  1. 按 `Control+Shift+J`(在 Mac 上为 `Command+Option+J`)打开 DevTools。
  2. 点击 Lighthouse 标签页。
  3. 选中效果渐进式 Web 应用复选框。
  4. 点击运行审核以生成报告。

如需了解详情,请参阅使用 Lighthouse 发现性能改进机会

预加载关键资源

如果某个资源的解析和提取延迟,Lighthouse 会显示以下审核失败消息:

Lighthouse:预加载关键请求审核

预加载是一种声明式提取请求,会告知浏览器请求原本无法通过其预加载扫描器发现的资源,例如 background-image 属性引用的图片。通过在 HTML 文档的标头中添加带有 rel="preload"<link> 标记,预加载延迟发现的资源:

<link rel="preload" as="image" href="hero-image.jpg">

添加 <link rel="preload"> 指令会发出对该资源的请求,并将其存储在缓存中。这样,浏览器便可以在需要时检索该数据。

如需详细了解如何预加载关键资源,请参阅预加载关键素材资源指南。

尽快渲染初始路由

如果有资源延迟了首次绘制(即网站将像素渲染到屏幕上的时间),Lighthouse 会发出警告:

Lighthouse:移除阻塞渲染的资源审核

为了缩短首次绘制时间,Lighthouse 建议内嵌关键的 JavaScript 并使用 async 推迟其余 JavaScript,同时内嵌可见区域上方使用的关键 CSS。这样可以避免为提取会阻塞渲染的资源而进行往返服务器的操作,从而提高性能。不过,从开发的角度来看,内嵌代码维护起来更困难,而且浏览器无法单独缓存内联代码。

改进 First Paint 的另一种方法是在服务器端渲染网页的初始 HTML。这样,当脚本仍在获取、解析和执行时,系统会立即向用户显示内容。不过,这可能会大幅增加 HTML 文件的载荷,从而影响可交互时间,即应用变为可交互并能够响应用户输入所需的时间。

没有单一的正确解决方案可以缩短应用中的首次绘制时间,并且您只有在应用的优势大于权衡时,才应考虑内嵌样式和服务器端渲染。您可以通过以下资源详细了解这两种概念。

使用 Service Worker 的请求/响应

预缓存资源

通过充当代理,服务工作器可以在用户重访时直接从缓存(而不是服务器)提取资源。这样一来,用户不仅可以在离线状态下使用您的应用,而且重复访问时页面加载速度也会更快。

请使用第三方库来简化 Service Worker 的生成过程,除非您的缓存要求比库无法提供的复杂程度更高。例如,Workbox 提供了一组工具,可让您创建和维护 Service Worker 以缓存资源。如需详细了解服务工件和离线可靠性,请参阅可靠性学习路径中的服务工件指南

延迟加载

如果您通过网络发送过多数据,Lighthouse 会显示失败的审核。

Lighthouse:具有庞大的网络载荷审核

这包括所有资源类型,但由于浏览器需要花费时间来解析和编译大型 JavaScript 载荷,因此大型 JavaScript 载荷的开销尤其高。Lighthouse 还会在适当情况下提供相关警告。

Lighthouse:JavaScript 启动时间审核

如需发送较小的 JavaScript 载荷(仅包含用户初次加载应用时所需的代码),请拆分整个软件包,并按需延迟加载分块。

成功拆分软件包后,请预加载更重要的分块(请参阅预加载关键素材资源指南)。预加载可确保浏览器更快地提取和下载更重要的资源。

除了按需拆分和加载不同的 JavaScript 分块之外,Lighthouse 还提供用于延迟加载非关键图片的审核。

Lighthouse:推迟屏幕外图片审核

如果您在网页上加载了许多图片,请在网页加载时延迟加载折叠线下方或设备视口之外的所有图片(请参阅使用 lazysizes 延迟加载图片)。

后续步骤

现在,您已经了解了 PRPL 模式背后的一些基本概念,请继续阅读本部分中的下一个指南,了解更多信息。请务必注意,并非所有这些方法都需要同时应用。采取以下任何措施都会显著提升性能。

  • 预加载关键资源。
  • 尽快渲染初始路由。
  • 预缓存剩余的资产。
  • 延迟加载其他路由和非关键资源。

您可以详细了解 PRPL 模式。