导航计时 第2级

W3C 工作草案

关于此文档的更多详细信息
此版本:
https://www.w3.org/TR/2025/WD-navigation-timing-2-20250213/
最新发布版本:
https://www.w3.org/TR/navigation-timing-2/
最新编辑草案:
https://w3c.github.io/navigation-timing/
历史记录:
https://www.w3.org/standards/history/navigation-timing-2/
提交历史
测试套件:
https://wpt.fyi/navigation-timing/
编辑者:
Yoav Weiss (谷歌)
(特邀专家)
前任编辑:
Ilya Grigorik (谷歌)
(微软公司) - 截止至
(微软公司) - 截止至
(谷歌公司) - 截止至
反馈:
GitHub w3c/navigation-timing (拉取请求新问题打开的问题)
public-web-perf@w3.org 主题行 [NavigationTiming] (存档)
浏览器支持:
caniuse.com

摘要

本规范定义了一个接口,使网页应用程序能够访问文档导航的完整计时信息。

本文档的状态

本节描述了本文档在发布时的状态。当前 W3C 出版物的列表和本技术报告的最新修订版可以在 W3C 技术报告索引 中找到,网址为 https://www.w3.org/TR/。

导航计时 2 取代了第一版 [NAVIGATION-TIMING] 并包含以下更改:

本文档由网页性能工作组作为工作草案发布,使用 推荐路线

作为工作草案发布并不意味着 W3C 及其成员的认可。

这是一个草案文档,可能随时更新、替换或被其他文档取代。引用此文档作为进展中的工作是不合适的。

本文档由一个在 W3C 专利政策下运营的组织制作。 W3C 维护了一份任何与该组交付成果相关的专利披露的公共列表;该页面还包括披露专利的说明。任何个人若实际知晓包含 必要声明的专利,则必须按照 W3C 专利政策第 6 节披露信息。

本文档受2023年11月3日 W3C流程文件的约束。

1. 介绍

本节为非规范性内容。

准确测量网页应用程序的性能特性是提升网页应用程序速度的重要方面。虽然基于 JavaScript 的机制,如 [JSMEASURE] 中描述的,可以为用户的延迟测量提供全面的工具, 但在许多情况下,它们无法提供完整或详细的端到端延迟情况。例如,以下 JavaScript 展示了一个简单测量页面完全加载时间的尝试:

<html>
<head>
<script type="text/javascript">
var start = new Date().getTime();
function onLoad() {
  var now = new Date().getTime();
  var latency = now - start;
  alert("page loading time: " + latency);
}
</script>
</head>
<body onload="onLoad()">
<!- Main page body goes from here. -->
</body>
</html>

上述脚本计算了在执行 head 中的第一段 JavaScript 后加载页面所需的时间,但它并未提供获取页面所需的时间或页面初始化生命周期的相关信息。

本规范定义了 PerformanceNavigationTiming 接口,该接口参与 [PERFORMANCE-TIMELINE-2] 以存储和检索与文档导航相关的高分辨率性能指标数据。由于 PerformanceNavigationTiming 接口使用 [HR-TIME],所有时间值都是相对于条目的相关设置对象时间原点进行测量的。

例如,如果我们知道响应结束发生在导航开始后的100毫秒,PerformanceNavigationTiming 数据可能如下所示:

startTime:           0.000  // start time of the navigation request
responseEnd:       100.000  // high resolution time of last received byte

以下脚本展示了开发者如何使用 PerformanceNavigationTiming 接口来获取与文档导航相关的准确时间数据:

<script>
function showNavigationDetails() {
  // Get the first entry
  const [entry] = performance.getEntriesByType("navigation");
  // Show it in a nice table in the developer console
  console.table(entry.toJSON());
}
</script>
<body onload="showNavigationDetails()">

2. 术语

构造 "一个 Foo 对象",其中 Foo 实际上是一个接口,有时被用作替代更准确的 "实现接口 Foo 的对象"。

术语 当前文档 指的是与 Window 对象的最新 Document 对象关联的文档。

在整个工作中,所有时间值都是从文档导航开始以来以毫秒为单位测量的。例如,文档的导航开始时间为0。术语当前时间是指从文档导航开始到当前时刻所经过的毫秒数。这种时间定义基于 [HR-TIME] 规范。

3. 导航计时

3.1 PerformanceEntry 接口的关系

PerformanceNavigationTiming 接口扩展了 PerformanceEntry 接口的以下属性:

注意

实现 PerformanceNavigationTiming 的用户代理需要在 supportedEntryTypes 中为 窗口上下文包含"navigation"。这使开发人员能够检测导航计时的支持情况。

3.2 PerformanceResourceTiming 接口的关系

PerformanceNavigationTiming 接口扩展了 PerformanceResourceTiming 接口的以下属性:

注意

仅包括 当前文档 资源在性能时间线上;性能时间线上只有一个 PerformanceNavigationTiming 对象。

3.3 PerformanceNavigationTiming 接口

注意

检查并从 HTTP缓存 [RFC7234] 中获取内容是 获取过程 的一部分。它由 requestStartresponseStartresponseEnd 属性涵盖。

WebIDL[Exposed=Window]
interface PerformanceNavigationTiming : PerformanceResourceTiming {
    readonly        attribute DOMHighResTimeStamp  unloadEventStart;
    readonly        attribute DOMHighResTimeStamp  unloadEventEnd;
    readonly        attribute DOMHighResTimeStamp  domInteractive;
    readonly        attribute DOMHighResTimeStamp  domContentLoadedEventStart;
    readonly        attribute DOMHighResTimeStamp  domContentLoadedEventEnd;
    readonly        attribute DOMHighResTimeStamp  domComplete;
    readonly        attribute DOMHighResTimeStamp  loadEventStart;
    readonly        attribute DOMHighResTimeStamp  loadEventEnd;
    readonly        attribute NavigationTimingType type;
    readonly        attribute unsigned short       redirectCount;
    readonly        attribute DOMHighResTimeStamp  criticalCHRestart;
    readonly        attribute NotRestoredReasons?  notRestoredReasons;
    [Default] object toJSON();
};

一个 PerformanceNavigationTiming 有一个关联的 文档加载计时信息 文档加载计时

一个 PerformanceNavigationTiming 有一个关联的 文档卸载计时信息 先前文档卸载计时

一个 PerformanceNavigationTiming 有一个关联的 数字 重定向计数

一个 PerformanceNavigationTiming 有一个关联的 NavigationTimingType 导航类型

一个 PerformanceNavigationTiming 有一个关联的 DOMHighResTimeStamp Critical-CH 重启时间

一个 PerformanceNavigationTiming 有一个关联的 NotRestoredReasons 未恢复原因

一个 PerformanceNavigationTiming 有一个关联的 null 或 服务工作线程计时信息 服务工作线程计时

unloadEventStart getter 步骤是返回 this先前文档卸载计时卸载事件开始时间

注意

如果先前文档和当前文档具有相同的,则此时间戳在用户代理启动先前文档的卸载事件之前立即测量。如果没有先前文档,或者先前文档与当前文档具有不同的,则此属性将返回零。

unloadEventEnd getter 步骤是返回 this先前文档卸载计时卸载事件结束时间

注意

如果先前文档和当前文档具有相同的,则此时间戳在用户代理处理先前文档的卸载事件之后立即测量。如果没有先前文档,或者先前文档与当前文档具有不同的,则此属性将返回零。

domInteractive getter 步骤是返回 this文档加载计时DOM 交互时间

注意

此时间戳在用户代理将当前文档就绪状态设置为“interactive”之前测量。

domContentLoadedEventStart getter 步骤是返回 this文档加载计时DOM 内容加载事件开始时间

注意

此时间戳在用户代理分派 DOMContentLoaded 事件之前测量。

domContentLoadedEventEnd getter 步骤是返回 this文档加载计时DOM 内容加载事件结束时间

注意

此时间戳在用户代理完成处理 DOMContentLoaded 事件之后测量。

domComplete getter 步骤是返回 this文档加载计时DOM 完成时间

注意

此时间戳在用户代理将当前文档就绪状态设置为“complete”之前测量。有关精确定义,请参见文档就绪状态

loadEventStart getter 步骤是返回 this文档加载计时加载事件开始时间

注意

此时间戳在用户代理为文档分派加载事件之前测量。

loadEventEnd getter 步骤是返回 this文档加载计时加载事件结束时间

注意

此时间戳在用户代理完成处理文档的加载事件之后测量。

type getter 步骤是运行 this导航类型

注意

客户端重定向(例如使用 Refresh pragma 指令的重定向)在本规范中不被视为 HTTP 重定向。在这些情况下,type 属性应该返回适当的值,例如,如果重新加载当前页面,则返回 reload;如果导航到新的 URL,则返回 navigate

redirectCount getter 步骤是返回 this重定向计数

criticalCHRestart getter 步骤是返回 thisCritical-CH 重启时间

注意

如果 criticalCHRestart 不为 0,它将早于除 navigationStartunloadEventStartunloadEventEnd 之外的所有其他时间戳。这是因为它标记了导航的重定向部分重新启动的时刻。

notRestoredReasons getter 步骤是返回 this未恢复原因

toJSON() 方法为 this 运行默认 toJSON 步骤

3.3.1 NavigationTimingType 枚举

WebIDLenum NavigationTimingType {
                    "navigate",
                    "reload",
                    "back_forward",
                    "prerender"
                };

这些值的定义如下:

navigate
导航时 历史处理行为 设置为 "default""replace",并且导航不是由 prerender 提示发起的 [RESOURCE-HINTS]。
reload
可导航对象重新加载的导航。
back_forward
从历史记录中 应用的导航
prerender
通过 prerender 提示发起的导航 [RESOURCE-HINTS]。
注意

上述枚举值的格式与WebIDL 关于枚举值格式的建议不一致。不幸的是,由于已发布的实现存在向后兼容性问题,我们无法更改它。[WebIDL]

4. 处理流程

4.1 处理模型

1 本图说明了 PerformanceNavigationTiming 接口定义的时序属性。括号中的属性表示它们可能在涉及不同 来源 的文档导航时不可用。
导航时序属性

5. 创建导航时序条目

每个文档都有一个关联的导航计时条目,初始未设置。

要为Document document 创建导航计时条目, 给定一个获取计时信息 fetchTiming、一个数字 redirectCount、一个 NavigationTimingType navigationType、 一个 null 或服务工作线程计时信息 serviceWorkerTiming、 一个 DOMString cacheMode、一个DOMHighResTimeStamp criticalCHRestart 以及一个响应体信息 bodyInfo,请执行以下操作:

  1. globaldocument相关全局对象
  2. navigationTimingEntryglobal领域中的一个新 PerformanceNavigationTiming 对象。
  3. 给定 "navigation"、documentURLfetchTimingcacheModebodyInfo,为 navigationTimingEntry 设置资源计时条目
  4. navigationTimingEntry文档加载计时设置为 document加载计时信息
  5. navigationTimingEntry先前文档卸载计时设置为 document先前文档卸载计时
  6. navigationTimingEntry重定向计数设置为 redirectCount
  7. navigationTimingEntry导航类型设置为 navigationType
  8. navigationTimingEntry服务工作线程计时设置为 serviceWorkerTiming
  9. document导航计时条目设置为 navigationTimingEntry
  10. navigationTimingEntryCritical-CH 重启时间设置为 criticalCHRestart
  11. navigationTimingEntry未恢复原因设置为给定 document未恢复原因 创建 NotRestoredReasons 对象的结果。
  12. navigationTimingEntry 添加到 global性能条目缓冲区

要为Document document 将导航计时条目加入队列 document导航计时条目加入队列。

6. 隐私考虑

本节为非规范性内容。

6.1 信息泄露

通过使用精心设计的计时攻击,有可能泄露最终用户的浏览和活动历史记录。例如,卸载时间揭示了前一个页面执行其卸载处理程序所需的时间,这可以用来推断用户的登录状态。通过在卸载文档时强制执行同源检查算法,这些攻击已得到缓解,具体细节请参见HTML 规范

放宽的同源策略无法提供足够的保护,防止在跨文档间未经授权的访问。在共享主机环境中,不受信任的第三方可以在同一 IP 地址下但使用不同端口托管 HTTP 服务器。

6.2 跨目录访问

不同页面共享一个主机名,例如用户生成内容网站上由不同作者托管的内容,因没有按路径名限制访问的功能,这些页面被视为同源。页面间的导航允许后续页面访问前一个页面的时序信息,例如重定向和卸载事件的时序。

7. 安全考虑

本节为非规范性内容。

PerformanceNavigationTiming 接口向 当前文档 暴露有关上一文档的时序信息。为了限制对包括上一文档信息的 PerformanceNavigationTiming 属性的访问,上一文档卸载 算法强制执行 同源策略,与上一文档相关的属性将被设置为零。

7.1 检测代理服务器

当在用户代理和网络服务器之间部署了代理时,connectStartconnectEnd 属性之间的时间间隔显示的是用户代理与代理之间的延迟,而不是与网络服务器的延迟。因此,网络服务器可以推断出代理的存在。对于 SOCKS 代理,此时间间隔包括代理身份验证时间和代理连接到网络服务器所花的时间,从而使代理检测变得复杂。在使用 HTTP 代理的情况下,用户代理可能完全不了解代理服务器,因此无法始终有效缓解这种攻击。

8. 过时内容

本节定义了在 [NAVIGATION-TIMING] 第1级中引入的属性和接口,为了向后兼容而保留。作者不应再使用以下接口,并且强烈建议使用新的 PerformanceNavigationTiming 接口——参见更改和改进的总结

8.1 PerformanceTiming 接口

WebIDL[Exposed=Window]
interface PerformanceTiming {
  readonly attribute unsigned long long navigationStart;
  readonly attribute unsigned long long unloadEventStart;
  readonly attribute unsigned long long unloadEventEnd;
  readonly attribute unsigned long long redirectStart;
  readonly attribute unsigned long long redirectEnd;
  readonly attribute unsigned long long fetchStart;
  readonly attribute unsigned long long domainLookupStart;
  readonly attribute unsigned long long domainLookupEnd;
  readonly attribute unsigned long long connectStart;
  readonly attribute unsigned long long connectEnd;
  readonly attribute unsigned long long secureConnectionStart;
  readonly attribute unsigned long long requestStart;
  readonly attribute unsigned long long responseStart;
  readonly attribute unsigned long long responseEnd;
  readonly attribute unsigned long long domLoading;
  readonly attribute unsigned long long domInteractive;
  readonly attribute unsigned long long domContentLoadedEventStart;
  readonly attribute unsigned long long domContentLoadedEventEnd;
  readonly attribute unsigned long long domComplete;
  readonly attribute unsigned long long loadEventStart;
  readonly attribute unsigned long long loadEventEnd;
  [Default] object toJSON();
};
注意

本节定义的所有时间值均以1970年1月1日午夜(UTC)以来的毫秒数来测量。

navigationStart

该属性必须返回用户代理完成提示卸载 前一文档之后的时间。如果没有前一文档,该属性必须返回创建当前文档的时间。

注意

此属性未为 PerformanceNavigationTiming 定义。 相反,作者可以使用 timeOrigin 来获取等效的时间戳。

unloadEventStart

如果前一个文档和当前文档具有相同的来源,则此属性必须返回用户代理开始前一个文档的 卸载事件的时间。如果没有前一个文档,或者前一个文档与当前文档的 来源不同,则此属性必须返回0。

unloadEventEnd

如果前一个文档和当前文档具有相同的相同来源,此属性必须返回用户代理完成前一个文档的 卸载事件后的时间。如果没有前一个文档,或者前一个文档与当前文档的 来源不同,或者卸载尚未完成,则此属性必须返回0。

如果导航过程中有HTTP重定向,并且并非所有重定向都来自相同的 来源,那么 PerformanceTiming.unloadEventStartPerformanceTiming.unloadEventEnd必须返回0。

redirectStart

如果导航过程中有HTTP重定向,并且所有重定向都来自相同的 来源,则此属性必须返回发起重定向的 fetch的起始时间。否则,此属性必须返回0。

redirectEnd

如果导航过程中有HTTP重定向,并且所有重定向都来自相同的 来源,此属性必须返回接收到最后一个重定向响应的最后一个字节后的时间。否则,此属性必须返回0。

fetchStart

如果新的资源是使用"GET" 请求方法获取的, 则fetchStart必须返回用户代理开始检查 HTTP缓存 之前的时间。否则,它必须返回用户代理开始 获取资源的时间。

domainLookupStart

此属性必须返回用户代理开始当前文档的域名查找之前的时间。如果使用了 持久连接 [RFC2616] 或者当前文档从 HTTP缓存 或本地资源中检索,则此属性必须返回与 PerformanceTiming.fetchStart 相同的值。

domainLookupEnd

此属性必须返回用户代理完成当前文档的域名查找后的时间。如果使用了 持久连接 [RFC2616] 或者当前文档从 HTTP缓存 或本地资源中检索,则此属性必须返回与 PerformanceTiming.fetchStart 相同的值。

注释

HTTP缓存 [RFC2616] 检查和检索内容是获取资源过程的一部分。它包括 PerformanceTiming.requestStart, PerformanceTiming.responseStartPerformanceTiming.responseEnd 属性。

注释

如果用户代理已经在缓存中拥有域名信息,domainLookupStart和domainLookupEnd表示用户代理开始和结束从缓存中检索域数据的时间。

connectStart

此属性必须返回用户代理开始建立连接以检索文档之前的时间。如果使用了 持久连接 [RFC2616] 或者当前文档从 HTTP缓存 或本地资源中检索,则此属性必须返回 PerformanceTiming.domainLookupEnd 的值。

connectEnd

此属性必须返回用户代理完成与服务器建立连接以检索当前文档后的时间。如果使用了 持久连接 [RFC2616] 或者当前文档从 HTTP缓存 或本地资源中检索,则此属性必须返回 PerformanceTiming.domainLookupEnd 的值。

如果传输连接失败并且用户代理重新打开连接, PerformanceTiming.connectStartPerformanceTiming.connectEnd 应该返回新连接的相应值。

PerformanceTiming.connectEnd 必须包括建立传输连接的时间间隔以及其他时间间隔,例如SSL握手和SOCKS身份验证。

secureConnectionStart

此属性是可选的。没有此属性的用户代理必须将其设置为undefined。当此属性可用时,如果当前页面的 协议 [URL] 是"HTTPS",此属性必须返回用户代理开始握手过程以安全连接的时间。如果此属性可用但未使用HTTPS,则此属性必须返回0。

requestStart

此属性必须返回用户代理从服务器、HTTP 缓存或本地资源请求当前文档之前的时间。

如果传输连接在请求发送后失败,用户代理重新打开连接并重新发送请求, PerformanceTiming.requestStart 应该返回新请求的相应值。

注意

此接口不包括表示请求完成发送的属性,例如 requestEnd。

  • 从用户代理发送请求的完成时间并不总是指示网络传输中的相应完成时间,这使得拥有此类属性的好处不明显。
  • 一些用户代理由于 HTTP 层的封装而难以确定发送请求的实际完成时间。
responseStart

此属性必须返回用户代理从服务器、HTTP 缓存或本地资源接收响应的第一个字节后的时间。

responseEnd

此属性必须返回用户代理接收到当前文档的最后一个字节后的时间,或者在传输连接关闭之前的时间,以先发生者为准。此文档可以是从服务器、HTTP 缓存或本地资源中接收的。

domLoading

此属性必须返回用户代理将当前文档就绪状态设置为 "loading" 之前的时间。

警告

由于现有用户代理在创建 Document 对象时的差异,domLoading 返回的值是实现特定的,不应用于有意义的指标。

domInteractive

此属性必须返回用户代理将当前文档就绪状态设置为 "interactive" 之前的时间。

domContentLoadedEventStart

此属性必须返回用户代理在 DOMContentLoaded 事件Document 上触发之前的时间。

domContentLoadedEventEnd

此属性必须返回文档的 DOMContentLoaded 事件 完成后的时间。

domComplete

此属性必须返回用户代理将 当前文档就绪状态 设置为 "complete" 之前的时间。

如果 当前文档就绪状态 多次变为相同状态, PerformanceTiming.domLoadingPerformanceTiming.domInteractivePerformanceTiming.domContentLoadedEventStartPerformanceTiming.domContentLoadedEventEndPerformanceTiming.domComplete 必须返回相应的 文档就绪状态 变更的第一次出现时间。

loadEventStart

此属性必须返回当前文档的 load 事件触发之前的时间。当 load 事件尚未触发时,必须返回零。

loadEventEnd

此属性必须返回当前文档的 load 事件完成时的时间。当 load 事件尚未触发或未完成时,必须返回零。

toJSON()
this 运行默认 toJSON 步骤

8.2 PerformanceNavigation 接口

WebIDL[Exposed=Window]
interface PerformanceNavigation {
  const unsigned short TYPE_NAVIGATE = 0;
  const unsigned short TYPE_RELOAD = 1;
  const unsigned short TYPE_BACK_FORWARD = 2;
  const unsigned short TYPE_RESERVED = 255;
  readonly attribute unsigned short type;
  readonly attribute unsigned short redirectCount;
  [Default] object toJSON();
};
TYPE_NAVIGATE

导航类型设置为 默认历史处理行为"replace"

TYPE_RELOAD

导航类型设置为 重新加载

TYPE_BACK_FORWARD

导航类型设置为 历史条目更新

TYPE_RESERVED

上述值未定义的任何其他导航类型。

type

此属性必须返回当前浏览上下文中最后一次非重定向导航的类型。它必须具有以下 导航类型 之一。

注意

客户端重定向,如使用 Refresh 说明指令 的重定向,不被此规范视为 HTTP 重定向。在这种情况下, type 属性应返回适当的值,例如在重新加载当前页面时返回 TYPE_RELOAD,或在导航到新 URL 时返回 TYPE_NAVIGATE

redirectCount

此属性必须返回当前浏览上下文中自上次非重定向导航以来的重定向次数。如果没有重定向,或存在与目标文档不同源的重定向,则此属性必须返回零。

toJSON()
this 运行默认 toJSON 步骤

8.3 Performance 接口的扩展

WebIDL[Exposed=Window]
partial interface Performance {
  [SameObject]
  readonly attribute PerformanceTiming timing;
  [SameObject]
  readonly attribute PerformanceNavigation navigation;
};

Performance 接口在 [PERFORMANCE-TIMELINE-2] 中定义。

timing

timing 属性表示自上次非重定向导航以来与浏览上下文相关的计时信息。此属性由 PerformanceTiming 接口定义。

navigation

navigation 属性由 PerformanceNavigation 接口定义。

9. 一致性

除了标记为非规范性的部分外,本规范中的所有作者指南、图表、示例和注释均为非规范性的。除此之外,规范中的其他内容都是规范性的。

本文档中的关键词 SHOULD 应按照 BCP 14 [RFC2119] [RFC8174] 的描述进行解释,并且只有当它们以全大写形式出现时,才按照这里所示的方式进行解释。

A. 致谢

感谢 Anne Van Kesteren、Arvind Jain、Boris Zbarsky、Jason Weber、Jonas Sicking、James Simonsen、Karen Anderson、Nic Jansma、Philippe Le Hegaret、Steve Souders、Todd Reifsteck、Tony Gentilcore、William Chan 和 Zhiheng Wang 对本工作的贡献。

B. 参考文献

B.1 规范性参考文献

[dom]
DOM 标准。Anne van Kesteren。WHATWG。 现行标准。网址:https://dom.spec.whatwg.org/
[FETCH]
Fetch 标准。Anne van Kesteren。WHATWG。 现行标准。网址:https://fetch.spec.whatwg.org/
[HR-TIME]
高精度时间。Yoav Weiss。W3C。 2024年11月7日。W3C 工作草案。网址:https://www.w3.org/TR/hr-time-3/
[HTML]
HTML 标准。Anne van Kesteren; Domenic Denicola;Dominic Farolino;Ian Hickson;Philip Jägenstedt;Simon Pieters。WHATWG。现行标准。网址:https://html.spec.whatwg.org/multipage/
[NAVIGATION-TIMING]
导航计时。Zhiheng Wang。 W3C。2012年12月17日。W3C 推荐标准。网址:https://www.w3.org/TR/navigation-timing/
[PERFORMANCE-TIMELINE-2]
性能时间轴。Nicolas Pena Moreno。W3C。2024年2月16日。CRD。网址:https://www.w3.org/TR/performance-timeline/
[RESOURCE-HINTS]
资源提示。Ilya Grigorik。W3C。 2023年3月14日。W3C 工作草案。网址:https://www.w3.org/TR/resource-hints/
[RESOURCE-TIMING-2]
资源计时。Yoav Weiss;Noam Rosenthal。W3C。2024年11月4日。CRD。网址:https://www.w3.org/TR/resource-timing/
[RFC2119]
RFC 中用于指示需求级别的关键字。S. Bradner。IETF。1997年3月。最佳实践。网址:https://www.rfc-editor.org/rfc/rfc2119
[RFC2616]
超文本传输协议 -- HTTP/1.1。R. Fielding;J. Gettys;J. Mogul;H. Frystyk;L. Masinter;P. Leach;T. Berners-Lee。IETF。1999年6月。草案标准。网址:https://www.rfc-editor.org/rfc/rfc2616
[RFC7234]
超文本传输协议 (HTTP/1.1):缓存。R. Fielding 编辑;M. Nottingham 编辑;J. Reschke 编辑。IETF。2014年6月。 建议标准。网址:https://httpwg.org/specs/rfc7234.html
[RFC8174]
RFC 2119 关键字中大写与小写的歧义。B. Leiba。IETF。2017年5月。最佳实践。网址:https://www.rfc-editor.org/rfc/rfc8174
[service-workers]
服务工作线程。Jake Archibald; Marijn Kruisselbrink。W3C。2022年7月12日。CRD。网址:https://www.w3.org/TR/service-workers/
[URL]
URL 标准。Anne van Kesteren。WHATWG。 现行标准。网址:https://url.spec.whatwg.org/
[WEBIDL]
Web IDL 标准。Edgar Chen;Timothy Gu。 WHATWG。现行标准。网址:https://webidl.spec.whatwg.org/

B.2 参考性文献

[HR-TIME-2]
High Resolution Time Level 2. Ilya Grigorik. W3C. 2019年11月21日. W3C 推荐标准. URL: https://www.w3.org/TR/hr-time-2/
[JSMEASURE]
Measuring Client-Perceived Response Times on the WWW. Ramakrishnan Rajamony; Mootaz Elnozahy. 2001年3月. 第三届USENIX互联网技术与系统研讨会 (USITS) 论文集. URL: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.69.7329&rep=rep1&type=pdf