Chrome 64 объявляет устаревшим API chrome.loadTimes()

chrome.loadTimes() — это нестандартный API, который предоставляет разработчикам метрики загрузки и информацию о сети, чтобы помочь им лучше понять производительность своего сайта в реальном мире.

Поскольку этот API был реализован в 2009 году, всю полезную информацию, которую он сообщает, можно найти в стандартизированных API, таких как:

Эти стандартизированные API реализуются несколькими поставщиками браузеров. В результате chrome.loadTimes() устарел в Chrome 64.

Устаревший API

Функция chrome.loadTimes() возвращает один объект, содержащий всю информацию о загрузке и сети. Например, следующий объект является результатом вызова chrome.loadTimes() на сайте 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"
}

Стандартизированные замены

Теперь вы можете найти каждое из приведенных выше значений, используя стандартизированные API. В следующей таблице каждое значение соответствует стандартному API, а в разделах ниже показаны примеры кода, показывающие, как получить каждое значение в старом API с современными эквивалентами.

функция chrome.loadTimes() Стандартизированная замена API
requestTime Навигация по времени 2
startLoadTime Навигация по времени 2
commitLoadTime Навигация по времени 2
finishDocumentLoadTime Навигация по времени 2
finishLoadTime Навигация по времени 2
firstPaintTime Время покраски
firstPaintAfterLoadTime Н/Д
navigationType Навигация по времени 2
wasFetchedViaSpdy Навигация по времени 2
wasNpnNegotiated Навигация по времени 2
npnNegotiatedProtocol Навигация по времени 2
wasAlternateProtocolAvailable Н/Д
connectionInfo Навигация по времени 2

Примеры кода ниже возвращают значения, эквивалентные тем, которые возвращает chrome.loadTimes() . Однако для нового кода эти примеры кода не рекомендуются. Причина в том, что chrome.loadTimes() выдает значения времени в эпохе в секундах, тогда как новые API производительности обычно сообщают значения в миллисекундах относительно начала времени страницы, что, как правило, более полезно для анализа производительности.

В некоторых примерах также предпочтение отдается API Performance Timeline 2 (например, performance.getEntriesByType() ), но они предоставляют запасной вариант для более старого API Navigation Timing 1 , поскольку он имеет более широкую поддержку браузеров. В дальнейшем API-интерфейсы Performance Timeline будут предпочтительными и обычно сообщаются с более высокой точностью.

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;
 
}
}

План удаления

API chrome.loadTimes() станет устаревшим в Chrome 64 и будет удален в конце 2018 года. Разработчикам следует перенести свой код как можно скорее, чтобы избежать потери данных.

Намерение прекратить поддержку | Трекер Chromestatus | Ошибка хрома