networkInformation.downlink测网速

在现代的web应用程序中,网速已经成为一个非常重要的指标。在保证用户体验的前提下,最大限度地提升页面加载速度和可靠性已经成为了每一个前端开发者必须考虑的问题。而测量用户的网络带宽则是实现这些目标的关键之一。

Navigator API

Navigator API是Web API的一部分,提供了浏览器信息和浏览器设置的访问方式。其中,包括Connection接口允许我们查询设备当前连接的网络类型(例如:wifi, 4G等)、NetworkInformation接口提供连通性下载速度等有用信息以及其他许多可用于网络相关操作的API。本文主要使用NetworkInformation接口以及其中的downlink属性,该属性表示2秒内取得的传输位元(bps)的平均值 。

测量用户网速的方法

  1. 获取用户网络信息

首先我们需要获取用户的网络信息,在 Navigator 对象中可以访问该接口,并且通过调用networkInformation.downlink方法来获取网络带宽。

const networkInformation = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
let downloadSpeedMbps = (networkInformation.downlink / 1024).toFixed(2);

此代码查询设备进行网络连接的连接类型,然后返回适当的连接速度(按兆字节/秒计算)。如果设备不支持Connection API,那么我们应该使用其他方法来估计网络速度。

  1. 完全随机的下载请求

获取网络带宽的另一个方法是使用HTTP GET请求。基本思路如下:创建一个完全随机的URL,这样应该避免了浏览器缓存策略的影响,并立即将其下载。

function testSpeed(randomValueKB) {
  return new Promise(resolve => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', `data:text/plain;charset=utf-8,${Math.random()*parseFloat(randomValueKB)*1024}`, true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.onreadystatechange = function () { 
      if (xhr.readyState == XMLHttpRequest.DONE) {
        const sizeMB = randomValueKB / 1024;
        const timeInSeconds = parseFloat(xhr.getResponseHeader("X-Timer"));
        const speedMbps = (sizeMB / timeInSeconds).toFixed(2);
        resolve(speedMbps);
      }
    };
    xhr.send(null);
  })
}

上面的代码将随机文件大小作为参数传递给testSpeed函数,仅用于这种目的的生成静态内容。该函数返回一个Promise,该Promise将在XHR 200返回后解析并包含以Mb表示的下载速度。请注意,服务器必须在响应中包括自定义首部(X-Timer),以便从JavaScript计算请求的多长时间并计算出定量结果。

  1. 获取平均值

一旦我们测量出下载速度,我们需要对每次请求进行平均。这就需要调用testSpeed多次,并将结果添加到数组中:

function average(results) {
  if (results.length === 0) return 0;

  const sum = results.reduce((acc, curr) => acc + curr);
  return (sum / results.length).toFixed(2);
}

const speeds = [];
for (let i=0; i < 5; i++) {  // 进行5个请求
   testSpeed(550).then(speedMbps => speeds.push(speedMbps));
}
const avgSpeed = average(speeds);
console.log(avgSpeed);        // 打印结果

在上述代码中,我们使用一个循环来执行5个测试。最终,我们将所有结果传递给average函数,并且该函数将返回多个结果的平均值。

说明

需要注意的是上述方法仅提供了一个大致的网速估计。由于网络状况是相对不确定的因素(例如,即使用户的wifi信号强度一定,网络流量仍然可能有高峰)所以如果使用类似5次平均值的方法,则测量效果更好。

另外,测量过程使用了网络资源,应在用户处于闲置状态下、或者避免同时产生意想不到的影响。从性能和隐私的角度考虑,建议采用合理的方式使用这个功能或编写类似的组件。

总的来说,通过利用Navigator API中的NetworkInformation接口来获取downlink属性,我们可以比较简单地测量用户的带宽,便于我们在前端应用程序中提高性能和用户体验。

原文链接:https://juejin.cn/post/7229193250904129596 作者:不裁_caiii

(0)
上一篇 2023年5月5日 上午10:57
下一篇 2023年5月5日 上午11:07

相关推荐

发表评论

登录后才能评论