使用 Service Workers 减少 HTML 负载

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 提供适合您旅程各个阶段的云产品。立即开始使用 $200 免费信用额度!

简而言之:Philip Walton 提出了一种巧妙的思路,使用 Service Workers 缓存 HTML 文件的顶部和底部,从而减少大量网络负载。

详细说明:当您构建一个非常简单的网站时,您可以直接编写原始 HTML 代码。但很快您就会需要比这更抽象的东西。即使您构建一个三页的网站,也需要三个 HTML 文件,程序员的思维会寻求避免代码重复的方法。您可能会找到一种方法来“包含” HTML 顶部和底部的所有内容,并只更改中间的内容。

过去,我倾向于使用 PHP 来实现这种功能(<?php include('header.php); ?>),但现在我更倾向于使用 Jamstack,所以我可能会使用 EleventyNunjucks

或者,您可以选择使用 SPA(单页应用程序)来实现这种基本抽象。 NextNuxt 对于一些包含内容来说可能有点过于强大,但至少它们易于使用,并且最终结果是一个不错的静态网站。这些基于 JavaScript 的 SPA 框架(Gatsby 也属于此类)的特点是它们从静态网站“水合”成 SPA,因为 JavaScript 会加载。这样做的部分原因是速度。浏览器不再需要重新加载并请求整个大型 HTML 页面来渲染;它只需要请求它需要的小量数据,然后动态替换即可。

因此,在某种意义上,您可能会构建一个 SPA,因为您有一个通用的头部和页脚,并且只希望替换主体内容,以提高效率。

以下是 Phil 的观点:

在传统的客户端-服务器设置中,服务器始终需要为每个请求向客户端发送一个完整的 HTML 页面(否则响应将无效)。但仔细想想,这真的很浪费。互联网上的大多数网站在其 HTML 负载中都有大量重复内容,因为它们的页面共享许多公共元素(例如 <head>、导航栏、横幅、边栏、页脚等)。但在理想情况下,您不应该在每次页面请求中都发送如此多的相同 HTML 内容。

使用 Service Workers,我们可以解决这个问题。Service Worker 可以从服务器请求它需要的最少数据(例如 HTML 内容片段、Markdown 文件、JSON 数据等),然后它可以将这些数据编程地转换为完整的 HTML 文档。

因此,与 PHP、Eleventy、JavaScript 框架或任何其他解决方案相比,Phil 的想法是,Service Worker(一种原生浏览器技术)可以保存网站头部和页脚的缓存。然后,服务器请求只需要针对“主体内容”进行,而完整的 HTML 文档则可以动态创建。

这是一个非常巧妙的想法,实现起来并不简单,但对于一些人来说,它可能具有吸引力,因为它只需要更少的工具。在 Phil 的网站上

在本网站过去 30 天中,从 Service Worker 加载页面的网络负载减少了 47.6%,并且中位数 首屏绘制 (FCP) 比没有 Service Worker 加载页面的速度快了 52.3%(416 毫秒 vs. 851 毫秒)。

除了配置 Service Worker 之外,我认为最棘手的部分是配置您的服务器/API 来提供内容的只读版本,或者构建两个所有内容的纯文本版本。

直接链接 →