如何用JavaScipt测网速
事情是这样的,最近尝试写一个通过判断当前网速,从而在前端控制范围请求去分步请求一个大型文件的库。这个东东我现在一行代码都还没写,除了突然发现这个需求的思路有些不太实际之外,另一个原因是我突然问自己——
前端尼玛要怎么判断网速啊?? ? !
前端判断网速的原理总结
(注:下面求的网速单位默认为KB/S)
通过查阅相关资料,我发现思路主要是分为以下几种:
1.通过img加载或者发起Ajax请求计算网速
文件大小(KB) * 1000 /( end -start )就可以计算出网速了(KB/S)。
2.window.navigator.connection.downlink 网速查询
navigator.connection.downlink * 1024 / 83. 一般来说,通过请求文件测算网速,单次可能会有误差,所以我们可以请求多次并计算均值。
前端判断网速的方法及其优缺点
img加载测速
function getSpeedWithImg(imgUrl, fileSize) {
return new Promise((resolve, reject) => {
let start = null;
let end = null;
let img = document.createElement('img');
start = new Date().getTime();
img.onload = function (e) {
end = new Date().getTime();
const speed = fileSize * 1000 / (end - start)
resolve(speed);
}
img.src = imgUrl;
}).catch(err => { throw err });
}Ajax测速
function getSpeedWithAjax(url) {
return new Promise((resolve, reject) => {
let start = null;
let end = null;
start = new Date().getTime();
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
end = new Date().getTime();
const size = xhr.getResponseHeader('Content-Length') / 1024;
const speed = size * 1000 / (end - start)
resolve(speed);
}
}
xhr.open('GET', url);
xhr.send();
}).catch(err => { throw err });
}downlink测速
function getSpeedWithDnlink() {
// downlink测算网速
const connection = window.navigator.connection;
if (connection && connection.downlink) {
return connection.downlink * 1024 / 8;
}
}综合测速
function getNetSpeed(url, times) {
// downlink测算网速
const connection = window.navigator.connection;
if (connection && connection.downlink) {
return connection.downlink * 1024 / 8;
}
// 多次测速求平均值
const arr = [];
for (let i = 0; i < times; i++) {
arr.push(getSpeedWithAjax(url));
}
return Promise.all(arr).then(speeds => {
let sum = 0;
speeds.forEach(speed => {
sum += speed;
});
return sum / times;
})
}npm i network-speed-test使用方式
import * from 'network-speed-test';
getSpeedWithImg("https://s2.ax1x.com/2019/08/13/mPJ2iq.jpg", 8.97).then(
speed => {
console.log(speed);
}
)
getSpeedWithAjax('./speed.jpg').then(speed => {
console.log(speed);
});
getNetSpeed('./speed.jpg', 3).then(speed => {
console.log(speed);
});
getSpeedWithDnlink();Github地址:https://github.com/penghuwan/network-speed-test
参考文章:https://juejin.im/post/5b4de6b7e51d45190d55340b
知乎账号:https://www.zhihu.com/people/peng-hu-wan-56/activities
原文链接:https://www.cnblogs.com/penghuwan/p/11366446.html
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!