javascript - 服务工作者“内容下载”可以比实际获取时间长吗?
问题描述
我试图了解铬在从服务人员提供内容时实际上在做什么。但我看到了一个非常奇怪的行为。
这是测试用例:我创建了一个非常简单的应用程序,它公开了一个链接。当用户点击链接时,它会获取一个 2MB 的 javascript 文件(之前在 service worker 安装阶段存储在缓存中)。服务工作者拦截获取并使用缓存提供文件。
我在主线程中添加了一个 console.log 来测量获取响应需要多长时间:
function fetchScript() {
const t = performance.now();
fetch("portal.js")
.then((response) => console.log("took", performance.now() - t, response.text()));
}
我将此与 devtools 中的 Network 选项卡进行了比较:
如果我们在网络选项卡中打开其中一个请求的详细信息,我们将看到时间花费在 上Content Download
,在官方规范中指的是The browser is receiving the response
。
如何Content Download
操作可以比实际 fetch 更长?我期望控制台日志显示的时间比网络选项卡中的时间长(或至少相等)。有人真的知道期间发生了什么Content Download
吗?
解决方案
因此,阶段似乎是Content Download
指读取响应正文的时间(从标头可用到正文已被读取)
function fetchScript() {
const t = performance.now();
fetch("portal.js")
.then((response) => console.log("took", performance.now() - t,
response.text()));
}
获取在标头可用时解决,而不是在读取正文时解决。这就是为什么记录的时间可以小于Content Download
网络时间的时间。要将Content Download
时间包含在控制台记录的时间中,我们需要读取响应:
function fetchScript() {
const t = performance.now();
fetch("portal.js")
.then(response => response.text())
.then(response => console.log("took", performance.now() - t));
}
(然而,Content Download
时间是一种浏览器度量,它没有考虑事件循环,更具体地说,事件循环处理在读取响应后排队的微任务所花费的时间:response => console.log("took", performance.now() - t)
。因此,我们赢了' t 测量网络选项卡和 console.log 之间的相同时间)
推荐阅读
- architecture - 软件架构:服务层和业务层有自己的模型吗
- python - os.path.isfile() 仅当文件在目录中时才返回 true
- excel - 如何访问非活动工作表中的活动单元格?
- laravel-routing - 未定义变量:posts(查看:C:\xampp\htdocs\fpog\resources\views\pages\index.blade.php)
- ios - 将 iOS SwiftUI TextField 的键盘保持在屏幕上,直到用户输入正确的输入
- c++ - 使用模板在 C++ 中生成随机数的高斯分布
- html - 输入字段没有响应显示 flex
- java - 使用没有 Spring/CDI 的普通 Java Servlet 创建一个新的 Vaadin Flow 16/17 项目
- python-3.x - Python为每个新请求运行新任务或循环
- python-3.x - Python套接字未连接