如何重新创建记录 jQuery AJAX 调用网络请求不同阶段所需时间的 Chrome 瀑布列网络选项卡? 源代码

如何解决如何重新创建记录 jQuery AJAX 调用网络请求不同阶段所需时间的 Chrome 瀑布列网络选项卡? 源代码

question 类似但没有帮助。

为了向用户提供更多反馈,我们想模仿 Chrome 网络选项卡中的瀑布列,它将网络请求分解为不同的阶段和时间。

下面包含一个示例。

具体来说,我们要指出三个阶段:

  • 上传文件时间
  • 在服务器上处理文件的时间
  • 时间下载结果

jQuery AJAX docs 看来,beforeSend 似乎可用于为文件上传计时。服务器上的下载时间和时间如何(屏幕截图中的 TTFB)?

以下是我们实现 AJAX 调用的方法:

async function doRequest() {
    // Set server URL.
    let serverUrl = 'https://test.com/test';

    // Set form data
    let imageFile = imageFile

    // Create request form.
    let formData = new FormData();
    formData.append('imageFile',imageFile);

    // Set request settings.
    let settings = {
        url: serverUrl,method: 'POST',timeout: 0,contentType: false,processData: false,data: formData,xhr: function() {
            let xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function() {
               if (xhr.readyState == 2) {
                    if (xhr.status == 200) {
                      xhr.responseType = 'blob';
                    } else {
                      xhr.responseType = 'text';
                    }
               }
            };
            return xhr;
        },};

    // Make request.
    try {
        let result = await $.ajax(settings);
        // Handle success
    } catch (error) {
        // Handle failure
    }
}

enter image description here

解决方法

资源加载和计时

像往常一样,有人有同样的想法,并提供了一个预编码的解决方案。我发现这些资源是为了帮助您完成这项非常复杂的任务。您可以使用所编写的代码或将其放入书签中。

我找到了一篇详细的文章,描述了如何同时使用 Navigation Timing APIResource Timing API 我遇到的这篇文章的标题是(找​​到):

Assessing Loading Performance in Real Life with Navigation and Resource Timing

该文章提供的两个预构建解决方案采用完全不同的方法来可视化您所寻找的数据。

要毫不费力地使用它们,请为以下每个 URL 创建一个书签:

如前所述,这些是书签。它们包含可以直接在您加载的页面上执行的 JavaScript 代码。要使用它们,

  1. 在 Chrome 中加载您想要性能数据的页面
  2. 打开您的书签并点击此处提供的两个书签之一

结果将是您正在寻找的瀑布图或其他详细数据。

注意:该脚本可以被 content-security-policy 阻止,并且可能不会 适用于所有网站。

源代码

您最初询问的瀑布图可以在以下链接中找到。请注意,我正在托管此文件以供您回答。我不能保证它会永远可用。请下载并托管该文件。 (开放许可)

Waterfall by Andy Davies

在这里可以找到更详细的版本:(MIT 许可证)

Performance-Bookmarklet by Michael Mrowetz

文件上传

您会看到 Resource Timing API 提供此数据。如果您更喜欢使用 XHR API,测量文件上传时间的一种简单方法是使用 xhr.upload 对象,该对象采用事件侦听器来获取进度。正如所指出的,鉴于以前的工具,这不是必需的。

xhr.upload.addEventListener("progress",function(evt){
      // Initialize and finalize a timer here
      if (evt.lengthComputable) {
        console.log(evt.loaded + "/" + evt.total);
      }
    },false);

服务器处理时间

为了实现测量服务器性能并将其报告给客户端的目标,服务器必须参与其中,以便共享您在问题中寻求的内部处理时间。仅凭浏览器无法确定。

我建议使用 Server-Timing 功能,并详细说明其在 PerformanceServerTiming API 中的使用

使用此 API 相当简单。如示例所示(使用 NodeJS 服务器),您的服务器所要做的就是使用包含您希望在浏览器中显示的性能数据的特定 HTTP 标头进行响应:

const headers = {
    'Server-Timing': `
      cache;desc="Cache Read";dur=23.2,db;dur=53,app;dur=47.2
    `.replace(/\n/g,'')
  };

使用客户端上的信息就这么简单(来自 MDN 链接页面):

let entries = performance.getEntriesByType('resource');
console.log(entries[0].serverTiming);
// 0: PerformanceServerTiming {name: "cache",duration: 23.2,description: "Cache Read"}
// 1: PerformanceServerTiming {name: "db",duration: 53,description: ""}
// 2: PerformanceServerTiming {name: "app",duration: 47.2,description: ""}
,
  1. 为了监控上传状态,我认为你需要 XMLHttpRequestUpload request.upload.addEventListener("progress",updateProgress) or request.onprogressonloadend 来检查 loadend 事件。见https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/upload

  2. 我没有看到有特定的 HTTP 状态来确定来自服务器的响应的开始。检查https://developer.mozilla.org/en-US/docs/Web/HTTP/Status。所以从 HTTP API 级别 (XMLHttpRequest) 我不认为你能找到线索。但是浏览器应该可以从 TCP 层面知道。如果检查 devtools 不是您的偏好,您可能需要在响应中指定时间戳。一旦客户端得到响应,客户端就知道响应的开始时间。

  3. 客户端可以轻松获得从服务器收到响应的时间。

所以

Dur_uploading = Time_loadend - Time_requeststarts

Dur_serverprocessing = Time_responsespecified - Time_loadend

Dur_download = Time_responsereceived - Time_resonsespecified

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res