【问题标题】:Why is first paint happening before HTML starts downloading?为什么在 HTML 开始下载之前发生第一次绘制?
【发布时间】:2018-01-31 19:33:36
【问题描述】:

我正在使用 Navigation Timing API 收集数据。

具体来说,这四个指标:

// Time spent during redirection
var redirectTime = performance.timing.redirectEnd - performance.timing.redirectStart;

// DNS query time
var lookupDomainTime = performance.timing.domainLookupEnd - performance.timing.domainLookupStart;

// TCP connection time
var connectTime = performance.timing.connectEnd - performance.timing.connectStart;

// Time to first paint, in milliseconds.
var firstPaintTime = window.chrome.loadTimes().firstPaintTime * 1000 - performance.timing.navigationStart;

我经常发现 redirectTime + lookupDomainTime + connectTime > firstPaintTime。如果 Chrome 的第一次绘制指标是从 navigationStart 计算的,那么这意味着第一次绘制发生在在任何 HTML 下载之前。这似乎是不可能的。

如果 firstPaintTime 不是从 window.performance.timing.navigationStart 计算出来的,它是从什么点开始计算的?

【问题讨论】:

  • @joshuamiller 我看了这个答案。可以想象,浏览器在 HTML 完全下载之前获得了页面的第一次绘制(这与 DOMContentLoaded 是否已触发是一个单独的问题)。但我觉得不太可能。更重要的是,我发现 firstPaintTime 永远发生,因为没有下载任何内容来绘制。
  • 你的问题问为什么?我不确定这个答案是否令人满意,但答案是,因为他们可以,或者更确切地说,为什么不可以。尽快绘画可以改善感知的加载时间,所以他们这样做了。相反,您的问题是如何,甚至何时?因为为什么看起来很明显。您应该编辑您的问题,以一个非常清晰明确的主题问题结束。现在似乎有很多观察结果。
  • @Goose 为清楚起见进行了编辑。我的问题是 1)如何在下载任何 HTML 之前进行绘制,以及 2)如果不能,Chrome 从什么时候开始计算它的第一次绘制时间?
  • 在这种情况下,我认为建议的副本在回答您的问题方面做得不错。 Chrome 用现有的东西创建了一个不完整的树,然后开始绘制。就我理解的那么深。

标签: javascript google-chrome navigation-timing-api rum


【解决方案1】:

这样做是为了让最后一页/标签的主题颜色或背景颜色保持不变,直到新页面找出它需要的颜色。

这可以防止白色闪烁从深色页面转到深色页面。

您可以在此处阅读有关去年初始涂装变化的更多信息: https://bugs.chromium.org/p/chromium/issues/detail?id=470669 有一个门票和漏洞的兔子洞,所以您可能需要探索才能获得完整的照片。

【讨论】:

  • 有趣...所以第一次绘制可能只是前一页的清除,甚至在收到任何 HTML 之前?我想这将是一个强烈的动机来改变第一有意义的绘画,虽然我发现这个指标保守了。
  • 是的,他们必须画一些东西,以防止最后一页/标签在准备加载页面时挂起。之前它只是白色,但现在他们在最初的 firstpaint 之前做了一些事情,比如查找主题颜色,这就是为什么它也不匹配 window.performance.timing.navigationStart
猜你喜欢
  • 2018-03-04
  • 2011-04-01
  • 1970-01-01
相关资源
最近更新 更多