Javascript “能为工人服务吗?”;内容下载“;是否比实际提取时间长?

Javascript “能为工人服务吗?”;内容下载“;是否比实际提取时间长?,javascript,chromium,service-worker,Javascript,Chromium,Service Worker,我试图了解chromium在为服务人员提供内容时实际上在做什么。但我看到了一种非常奇怪的行为 下面是测试用例:我创建了一个非常简单的应用程序,它公开了一个链接。当用户单击该链接时,它将获取一个2MB javascript文件(该文件以前在service worker安装阶段存储在缓存中)。服务工作者截获获取并使用缓存为文件提供服务 我在主线程中添加了一个console.log,以测量获取响应所需的时间: function fetchScript() { const t = perform

我试图了解chromium在为服务人员提供内容时实际上在做什么。但我看到了一种非常奇怪的行为

下面是测试用例:我创建了一个非常简单的应用程序,它公开了一个链接。当用户单击该链接时,它将获取一个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中的“网络”选项卡进行了比较:

如果我们在“网络”选项卡中打开其中一个请求的详细信息,我们将看到时间花在
内容下载上,而在
中,浏览器正在接收响应


内容下载
操作如何比实际获取时间长?我希望控制台日志显示的时间比网络选项卡中显示的时间长(或至少相等)。有人真的知道在
内容下载过程中发生了什么吗?

因此
内容下载
阶段是指读取响应正文的时间(从标题可用到正文被读取的时间)

Fetch在标头可用时解析,而不是在读取正文时解析。这就是为什么记录的时间可以小于从网络时间下载内容的时间。要将
内容下载
时间包含到控制台记录的时间中,我们需要读取响应:

function fetchScript() {
    const t = performance.now();
    fetch("portal.js")
    .then(response => response.text())
    .then(response => console.log("took", performance.now() - t));
}
(但是,
Content Download
time是一种浏览器度量,它不考虑事件循环,更具体地说,不考虑事件循环处理响应读取后排队的微任务所需的时间:
response=>console.log(“take”,performance.now()-t)
。因此,我们不会测量网络选项卡和console.log之间的相同时间)

function fetchScript() {
    const t = performance.now();
    fetch("portal.js")
    .then(response => response.text())
    .then(response => console.log("took", performance.now() - t));
}