Chrome 64 wycofa interfejs chrome.loadTimes() API

chrome.loadTimes() to niestandardowy interfejs API, który udostępnia wskaźniki wczytywania i informacje o sieci, aby pomóc deweloperom lepiej poznać skuteczność ich witryn w rzeczywistych warunkach.

Od czasu wdrożenia tego interfejsu API w 2009 roku wszystkie przydatne informacje, które on przekazuje, można znaleźć w ustandaryzowanych interfejsach API, takich jak:

Standardowe interfejsy API są wdrażane przez wielu dostawców przeglądarek. W związku z tym w Chrome 64 chrome.loadTimes() zostaje wycofany.

Wycofany interfejs API

Funkcja chrome.loadTimes() zwraca 1 obiekt zawierający wszystkie informacje o wczytywaniu i sieci. Na przykład następujący obiekt jest wynikiem wywołania chrome.loadTimes() na stronie www.google.com:

{
  "requestTime": 1513186741.847,
  "startLoadTime": 1513186741.847,
  "commitLoadTime": 1513186742.637,
  "finishDocumentLoadTime": 1513186742.842,
  "finishLoadTime": 1513186743.582,
  "firstPaintTime": 1513186742.829,
  "firstPaintAfterLoadTime": 0,
  "navigationType": "Reload",
  "wasFetchedViaSpdy": true,
  "wasNpnNegotiated": true,
  "npnNegotiatedProtocol": "h2",
  "wasAlternateProtocolAvailable": false,
  "connectionInfo": "h2"
}

Ustandaryzowane zamienniki

Każdą z powyższych wartości znajdziesz teraz, korzystając ze standardowych interfejsów API. W tabeli poniżej każda wartość jest dopasowywana do standardowego interfejsu API, a w sekcjach poniżej znajdziesz przykłady kodu, które pokazują, jak uzyskać każdą wartość w starym interfejsie API z nowymi odpowiednikami.

chrome.loadTimes() funkcja Standardowa wymiana interfejsu API
requestTime Czas trwania nawigacji 2
startLoadTime Czas trwania nawigacji 2
commitLoadTime Czas trwania nawigacji 2
finishDocumentLoadTime Czas trwania nawigacji 2
finishLoadTime Czas trwania nawigacji 2
firstPaintTime Czas malowania
firstPaintAfterLoadTime Nie dotyczy
navigationType Czas trwania nawigacji 2
wasFetchedViaSpdy Czas trwania nawigacji 2
wasNpnNegotiated Czas trwania nawigacji 2
npnNegotiatedProtocol Czas trwania nawigacji 2
wasAlternateProtocolAvailable Nie dotyczy
connectionInfo Czas trwania nawigacji 2

Przykłady kodu poniżej zwracają wartości równoważne tym zwracanym przez funkcję chrome.loadTimes(). Nie zalecamy jednak stosowania tych przykładów kodu w przypadku nowego kodu. Dzieje się tak, ponieważ chrome.loadTimes() zwraca wartości czasu w czasie epochy w sekundach, a nowe interfejsy API dotyczące wydajności zwykle podają wartości w milisekundach w stosunku do początku czasu strony, co jest zwykle bardziej przydatne do analizy wydajności.

W kilku przykładach faworyzowane są też interfejsy API Performance Timeline 2 (np. performance.getEntriesByType()), ale dają one dostęp do starszej wersji interfejsu Navigation Timing 1 API, ponieważ ma ona większą obsługę przeglądarek. Od tej pory preferowane są interfejsy API osi czasu wydajności i zwykle są one zgłaszane z większą precyzją.

requestTime

function requestTime() {
  // If the browser supports the Navigation Timing 2 and HR Time APIs, use
  // them, otherwise fall back to the Navigation Timing 1 API.
  if (window.PerformanceNavigationTiming && performance.timeOrigin) {
    const ntEntry = performance.getEntriesByType('navigation')[0];
    return (ntEntry.startTime + performance.timeOrigin) / 1000;
  } else {
    return performance.timing.navigationStart / 1000;
  }
}

startLoadTime

function startLoadTime() {
  // If the browser supports the Navigation Timing 2 and HR Time APIs, use
  // them, otherwise fall back to the Navigation Timing 1 API.
  if (window.PerformanceNavigationTiming && performance.timeOrigin) {
    const ntEntry = performance.getEntriesByType('navigation')[0];
    return (ntEntry.startTime + performance.timeOrigin) / 1000;
  } else {
    return performance.timing.navigationStart / 1000;
  }
}

commitLoadTime

function commitLoadTime() {
  // If the browser supports the Navigation Timing 2 and HR Time APIs, use
  // them, otherwise fall back to the Navigation Timing 1 API.
  if (window.PerformanceNavigationTiming && performance.timeOrigin) {
    const ntEntry = performance.getEntriesByType('navigation')[0];
    return (ntEntry.responseStart + performance.timeOrigin) / 1000;
  } else {
    return performance.timing.responseStart / 1000;
  }
}

finishDocumentLoadTime

function finishDocumentLoadTime() {
  // If the browser supports the Navigation Timing 2 and HR Time APIs, use
  // them, otherwise fall back to the Navigation Timing 1 API.
  if (window.PerformanceNavigationTiming && performance.timeOrigin) {
    const ntEntry = performance.getEntriesByType('navigation')[0];
    return (ntEntry.domContentLoadedEventEnd + performance.timeOrigin) / 1000;
  } else {
    return performance.timing.domContentLoadedEventEnd / 1000;
  }
}

finishLoadTime

function finishLoadTime() {
  // If the browser supports the Navigation Timing 2 and HR Time APIs, use
  // them, otherwise fall back to the Navigation Timing 1 API.
  if (window.PerformanceNavigationTiming && performance.timeOrigin) {
    const ntEntry = performance.getEntriesByType('navigation')[0];
    return (ntEntry.loadEventEnd + performance.timeOrigin) / 1000;
  } else {
    return performance.timing.loadEventEnd / 1000;
  }
}

firstPaintTime

function firstPaintTime() {
  if (window.PerformancePaintTiming) {
    const fpEntry = performance.getEntriesByType('paint')[0];
    return (fpEntry.startTime + performance.timeOrigin) / 1000;
  }
}

firstPaintAfterLoadTime

function firstPaintTimeAfterLoad() {
  // This was never actually implemented and always returns 0.
  return 0;
}
function navigationType() {
  if (window.PerformanceNavigationTiming) {
    const ntEntry = performance.getEntriesByType('navigation')[0];
    return ntEntry.type;
  }
}

wasFetchedViaSpdy

function wasFetchedViaSpdy() {
  // SPDY is deprecated in favor of HTTP/2, but this implementation returns
  // true for HTTP/2 or HTTP2+QUIC/39 as well.
  if (window.PerformanceNavigationTiming) {
    const ntEntry = performance.getEntriesByType('navigation')[0];
    return ['h2', 'hq'].includes(ntEntry.nextHopProtocol);
  }
}

wasNpnNegotiated

function wasNpnNegotiated() {
  // NPN is deprecated in favor of ALPN, but this implementation returns true
  // for HTTP/2 or HTTP2+QUIC/39 requests negotiated via ALPN.
  if (window.PerformanceNavigationTiming) {
    const ntEntry = performance.getEntriesByType('navigation')[0];
    return ['h2', 'hq'].includes(ntEntry.nextHopProtocol);
  }
}

npnNegotiatedProtocol

function npnNegotiatedProtocol() {
  // NPN is deprecated in favor of ALPN, but this implementation returns the
  // HTTP/2 or HTTP2+QUIC/39 requests negotiated via ALPN.
  if (window.PerformanceNavigationTiming) {
    const ntEntry = performance.getEntriesByType('navigation')[0];
    return ['h2', 'hq'].includes(ntEntry.nextHopProtocol) ?
        ntEntry.nextHopProtocol : 'unknown';
  }
}

wasAlternateProtocolAvailable

function wasAlternateProtocolAvailable() {
  // The Alternate-Protocol header is deprecated in favor of Alt-Svc
  // (https://www.mnot.net/blog/2016/03/09/alt-svc), so technically this
  // should always return false.
  return false;
}

connectionInfo

function connectionInfo() {
  if (window.PerformanceNavigationTiming) {
    const ntEntry = performance.getEntriesByType('navigation')[0];
    return ntEntry.nextHopProtocol;
  }
}

Plan usuwania

Interfejs API chrome.loadTimes() zostanie wycofany w Chrome 64 i planowo zostanie usunięty pod koniec 2018 roku. Aby uniknąć utraty danych, deweloperzy powinni jak najszybciej przenieść kod.

Zamiar wycofania | Narzędzie do śledzenia stanu Chrome | Błąd w Chromium