chrome.loadTimes()
— это нестандартный API, который предоставляет разработчикам метрики загрузки и информацию о сети, чтобы помочь им лучше понять производительность своего сайта в реальном мире.
Поскольку этот API был реализован в 2009 году, всю полезную информацию, которую он сообщает, можно найти в стандартизированных API, таких как:
- Навигация по времени 2
- Время покраски
- Дополнение
nextHopProtocol
к Navigation Timing 2 и Resource Timing 2 .
Эти стандартизированные 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;
}
navigationType
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 | Ошибка хрома