Подтвердить что ты не робот

Могу ли я использовать API-интерфейс навигации навигации для событий Ajax в приложениях с одной страницей? Если нет, то какой хороший инструмент?

У нас есть одностраничное приложение, построенное с помощью Knockout и Backbone, которое делает Ajax-вызовы на сервер и выполняет сложное кэширование данных и рендеринг DOM. Нам очень нравится измерять производительность (и регистрировать ее обратно на сервер), как видно пользователю. Кажется, я не могу придумать, будет ли браузером API навигационного тайминга для этого или нет. Из того, что я вижу в примерах, API синхронизации навигации привязан к window.performance, и это ограничивается загрузкой страницы и не подходит для мониторинга поведения Ajax. Правда или ложь? Если false, что еще я могу использовать?

Я хотел бы установить специальные контрольные точки, между которыми можно измерить время, например. для вызова Ajax, который выполняет некоторую рендеринг DOM с результатом сервера.

4b9b3361

Ответ 1

1 - True, window.performance привязан к загрузке страницы. См. Пример ниже, который показывает это:

    <button id='searchButton'>Look up Cities</button>
    <br>
    Timing info is same? <span id='results'></span>
    <script type="text/javascript" src="//code.jquery.com/jquery-1.9.1.min.js"></script>
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>
    <script type="text/javascript">
        jQuery('#searchButton').on('click', function(e){
            // deep copy the timing info
            var perf1 = jQuery.extend(true, {}, performance.timing);             
            // do something async
            jQuery.getJSON('http://ws.geonames.org/searchJSON?featureClass=P&style=full&maxRows=10&name_startsWith=Denv', function() {
                // get another copy of timing info
                var perf2 = jQuery.extend(true, {}, performance.timing);
                // show if timing information has changed
                jQuery('#results').text( _.isEqual( perf1, perf2 ) );
            });
            return false;
        });
    </script>

Кроме того, даже если вы его заработали, у вас не будет данных из старых браузеров, которые не поддерживают этот объект.

2 - Проект Boomerang, похоже, выходит за рамки API веб-синхронизации, а также поддерживает более старые браузеры. Существует беседа с слайдами и образцом кода текущего сопровождающего, перечисленных в этой конференции. Нет прямой ссылки.

Ответ 2

Кажется, что существует некоторая поддержка window.performance.getEntries(), которая даст вам подробную информацию о всех ресурсах, загруженных на страницу вместе с их URL-адресами. Я использую этот API для запросов jsonp (не XMLHttpRequest) в AzurePing.info для браузеров, которые его поддерживают, возвращается к new Date().getTime() для тех, кто нет.

В момент написания IE 10 и Chrome поддерживают getEntries, но Firefox этого не делает. К сожалению, не все временные свойства установлены - даже в Chrome и IE. Все, на что я мог положиться, это fetchStart, responseEnd и duration.

Источник примера находится на GitHub.

Ответ 3

Теперь вы можете использовать User Timing API (Рекомендация W3C от 12 декабря 2013 года), которая обеспечивает способ, с помощью которого вы можете вставлять вызовы API на разных части вашего Javascript, а затем извлекать подробные данные синхронизации.

Вы используете это с помощью mark(), это позволяет вам определить, сколько времени вам понадобилось, чтобы вы отметили эту метку в своем веб-приложении, а затем measure(), чтобы вычислить время, прошедшее между вашими отметками.

В вашем конкретном случае вы можете иметь что-то вроде этого:

app.render = function(content){
  myEl.innerHTML = content;
  window.performance.mark('end_render');
  window.performance.measure('measure_render', 'start_xhr', 'end_render');
};


var req = new XMLHttpRequest();
req.open('GET', url, true);
req.onload = function(e) {
  window.performance.mark('end_xhr');
  window.performance.measure('measure_xhr', 'start_xhr', 'end_xhr');
  app.render(e.responseText);
}
window.performance.mark('start_xhr');
myReq.send();

Ответ 4

API синхронизации навигации, на мой взгляд, не очень полезен, когда дело касается измерения производительности одного веб-сайта.

Наряду с уже упомянутым API-интерфейсом пользовательского времени API Resource Timing API гораздо полезнее. Этот API предоставляет функциональные возможности для получения таймингов для всех запросов, сделанных в пользовательском сеансе (фактически все, что вы видите на вкладках сети инструментов разработчика в большинстве браузеров). Эти тайминги включают время разворота, а также время поиска DNS и т.д.

К сожалению, это относительно новая спецификация и пока не реализована во всех браузерах. Chrome и IE > 10 обеспечивают реализацию (хотя еще не завершена). Удивительно, но IE, похоже, сейчас реализовал большинство unitl...

Ответ 5

Есть два способа сделать это

Позволяет увидеть различия между ними.

1. API-интерфейс ресурса

Браузеры недавно добавили опоры для API синхронизации ресурсов. API-интерфейс ресурса имеет в основном временную информацию о каждом ресурсе, загруженном из приложения. Это могут быть запросы css, javascript или AJAX. Вы можете получить список сведений о ресурсах как

  performance.getEntriesByType('resource');

Он вернет массив объекта, где вы можете найти запросы AJAX initiatorType, который равен xmlhttprequest. Но есть некоторые ограничения.

  • По умолчанию максимальный размер ресурса - 150. В приведенном выше массиве должно быть не более 150 ресурсов. Если вы хотите больше, вы можете увеличить размер буфера как performance.setResourceTimingBufferSize(500).
  • Вы не получите информацию о том, успешно ли выполняются запросы AJAX или не удались.

2. Обтекание XMLHTTPRequest

Если вы можете обернуть свой XMLHTTPRequest API, вы получите всю необходимую информацию по времени, статусу и размеру байта. Но вы должны написать много тестов кода и теста, теста и теста.

[Отказ от ответственности] Я работаю для atatus.com, где мы помогаем вам измерять время загрузки страницы, AJAX времени и пользовательских транзакций. Также вы можете увидеть следы сеансов о том, как работают каждый ресурс.