JavaScript でネットワーク速度をテストする方法

JavaScript でネットワーク速度をテストする方法

序文

問題はこれです。最近、現在のネットワーク速度を判定し、フロントエンドでのリクエストの範囲を制御して、段階的に大きなファイルをリクエストするライブラリを作成しようとしました。私はまだこれについて 1 行もコードを書いていません。この要件のアイデアが少し非現実的であることに突然気付いただけでなく、フロントエンドはネットワーク速度をどのように決定すればよいのかと突然自問したからです。 ???!

ネットワーク速度のフロントエンド判定原理のまとめ

(注: 以下のネットワーク速度のデフォルトの単位は KB/S です) 関連情報を調べると、アイデアは主に次のカテゴリに分かれていることがわかりました。

1. img を読み込むか Ajax リクエストを開始してネットワーク速度を計算する

サーバーと同じドメインにある画像などのファイルを要求すると、要求の開始と応答の受信の 2 つの時点が Date.now でマークされます。これは、Date.now が 1970 年 1 月 1 日 (UTC) から現在の時刻までのミリ秒数であるためです。そのため、end - start を使用して時間差 (ms) を見つけ、次のように計算します。

ファイルサイズ (KB) * 1000 / (終了 - 開始)

ネットワーク速度(KB/S)を計算できます。

ファイルを要求するには、img 経由で読み込む方法と AJAX 経由で読み込む方法の 2 つがあります。

  • img オブジェクトを作成し、onload リスナー コールバックを設定して src を指定すると、src が指定されると画像リソースがロードされ、完了すると onload コールバックが呼び出されます。タイミングに応じて開始と終了を別々にマークできます。
  • AJAX 経由でリクエスト、つまり XHR オブジェクトを作成します。onreadystatechange コールバックで、readystate = 4 のときに読み込みが完了したと判断し、タイミングに応じてそれぞれ開始と終了をマークします。

2.window.navigator.connection.downlink ネットワーク速度クエリ

また、いくつかの高度な H5 API を通じてこれを実現することもできます。たとえば、ここでは window.navigator.connection.downlink を使用してクエリを実行できますが、ご存知のように、この種の API には独自の特性、つまり古い互換性の問題があるため、通常は予備手段として使用し、機能検出を通じて、使用できる場合は使用し、使用できない場合は他の方法を使用します。なお、ダウンリンクの単位はmbpsであり、これをKB/Sに変換する式は次のようになります。

ナビゲーター接続ダウンリンク * 1024 / 8

1024 を掛けるのはわかりますが、その後になぜ 8 で割る必要があるのでしょうか?これは、mbps の「b」がビットを表し、KB/s の「B」がバイトを表すためです。1 バイト (b) = 8 ビットなので、8 で割る必要があります。

3. 一般的に、ネットワーク速度はファイルのリクエストによって測定されます

1 回のリクエストではエラーが発生する可能性があるため、複数回リクエストして平均を計算することができます。

ネットワーク速度を判断するためのフロントエンド方式とその長所と短所

  • img 読み込み速度テスト: img オブジェクトの読み込みを使用してネットワーク速度を測定します。利点: クロスドメインの問題はありません。デメリット: (1) ファイルサイズを自分で測定し、fileSizeパラメータを提供する必要がある。(2) ファイルは画像でなければならない。(3) ファイルサイズを柔軟に制御できない。
  • Ajax 速度テスト: Ajax を介してネットワーク速度を測定します。 メリット:(1)レスポンスヘッダーから取得できるため、ファイルサイズパラメータが不要。(2)テストファイルは画像である必要はなく、データ量を柔軟に制御できる。デメリット: クロスドメインの問題
  • ダウンリンク速度テスト: navigator.connection.downlink を通じてネットワーク速度を読み取ります。利点: パラメータは必要ありません。デメリット: 1. 互換性が非常に問題となる、2. 帯域幅のクエリはリアルタイムではなく、数分間隔で実行される
  • 包括的な実装: 最初にダウンリンク速度テストを試し、そうでない場合は AJAX 速度テストを複数回使用して平均値を計算します。

画像読み込み速度テスト

関数 getSpeedWithImg(imgUrl, ファイルサイズ) {
    新しい Promise を返します ((resolve, reject) => {
        start = null とします。
        end = null とします。
        img = document.createElement('img'); とします。
        開始 = 新しい Date().getTime();
        img.onload = 関数 (e) {
            end = 新しい Date().getTime();
            定数速度 = ファイルサイズ * 1000 / (終了 - 開始)
            解決(速度);
        }
        テキストファイル img.src
    }).catch(err => { throw err });
}

Ajax スピードテスト

関数 getSpeedWithAjax(url) {
    新しい Promise を返します ((resolve, reject) => {
        start = null とします。
        end = null とします。
        開始 = 新しい Date().getTime();
        const xhr = 新しい XMLHttpRequest();
        xhr.onreadystatechange = 関数 () {
            xhr.readyState === 4の場合{
                end = 新しい Date().getTime();
                定数サイズ = xhr.getResponseHeader('コンテンツの長さ') / 1024;
                定数速度 = サイズ * 1000 / (終了 - 開始)
                解決(速度);
            }
        }
        xhr.open('GET', url);
        xhr.send();
    }).catch(err => { throw err });
}

ダウンリンク速度テスト

関数 getSpeedWithDnlink() {
    // ダウンリンクはネットワーク速度を計算します const connection = window.navigator.connection;
    if (接続 && connection.downlink) {
        connection.downlink * 1024 / 8 を返します。
    }
}

総合的な速度テスト

関数 getNetSpeed(url, times) {
    // ダウンリンクはネットワーク速度を計算します const connection = window.navigator.connection;
    if (接続 && connection.downlink) {
        connection.downlink * 1024 / 8 を返します。
    }
    //速度を複数回測定して平均値を求めます。const arr = [];
    (i = 0 とします; i < 回; i++) {
        arr.push(getSpeedWithAjax(url));
    }
    Promise.all(arr).then(speeds => { を返します。
        合計を 0 とします。
        速度.forEach(速度 => {
            合計 += 速度;
        });
        合計/回数を返します。
    })
}

上記のコードのnpmパッケージを公開しました。ダウンロードはこちらから。

npm i ネットワーク速度テスト

使い方

'network-speed-test' から * をインポートします。
getSpeedWithImg("upload/2022/web/mPJ2iq.jpg", 8.97) を実行してから(
    速度 => {
        console.log(速度);
    }
)

getSpeedWithAjax('./speed.jpg').then(speed => {
    console.log(速度);
});

getNetSpeed('./speed.jpg', 3).then(speed => {
    console.log(速度);
});

スピードリンクを取得します。

npm パッケージ アドレス

https://www.npmjs.com/package/network-speed-test

Githubアドレス

https://github.com/penghuwan/ネットワークスピードテスト

上記は、JavaScript を使用してネットワーク速度を測定する方法の詳細です。JavaScript を使用してネットワーク速度を測定する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • js シンプルなネットワーク速度テスト方法の完全な例
  • Baidu と Google のスピードテストの JavaScript コードにアクセスする
  • JS 非同期コードユニットテストの魔法 Promise
  • ネイティブ js はフォームの定期的な検証を実装します (検証後にのみ送信)
  • JS での Reduce Fold Unfold の使用法の詳細な説明
  • JS WebSocketを使用して簡単なチャットを実装する方法
  • エレガントなJSコードの書き方
  • Vue での weixin-js-sdk の一般的な使用方法の詳細な説明
  • JSホモロジー戦略とCSRFの詳細な説明

<<:  Ubuntu システムログで /var/log/messages を設定する方法

>>:  MySQL サーバー コミュニティ バージョン MySQL 5.7.22 winx64 を win10 にインストールする方法

推薦する

MySQL スロークエリログの詳細な理解

目次スロークエリログとは何ですか?スロークエリを有効にする方法ログ分析ツール mysqldumpsh...

MySQLデータ移行の概要

目次序文: 1. データ移行について2. 移行計画と留意点要約:序文:日常業務では、テーブル、データ...

vue.config.js パッケージ最適化構成

Baiduの情報は多様すぎて目が回ります。心配しないでください。私はあなたのためにそれを体験しました...

Red Hat Enterprise Linux 8 をベースにした CentOS 8 が正式にリリースされました

CentOS プロジェクトは、Red Hat の再配布要件に完全に準拠した、Red Hat Ente...

Linux ユーザー グループと権限の概要

ユーザーグループLinux では、すべてのユーザーはグループに属する必要があり、Linux には次の...

MySQL 8.0.15 で MGR シングル マスターと複数スレーブを構成する方法

1. はじめにMySQL グループ レプリケーション (略して MGR) は文字通り MySQL グ...

CSS3+JavaScript を使用したクールな呼吸効果のサンプル コード

CSS3 アニメーションで実現したシンプルでクールな効果。最終的な効果は次のようになります。 ページ...

Nginx インストール エラーの解決方法

1. nginx-1.8.1.tar.gzを解凍する2. fastdfs-nginx-module-...

Apache ソースコードのインストールと仮想ホストの設定に関する詳細なチュートリアル

ソースからApacheをインストールする1. Apacheソースコードをアップロードして必要なソフト...

CSS3はテキストのレリーフ効果、彫刻効果、炎のテキストを実現します

この効果を実現するには、まず CSS のプロパティを知っておく必要があります。 text-shado...

HTMLハイパーリンクaタグのhrefジャンプとonclick間の実行順序の例

HTMLハイパーリンクaタグのhrefジャンプとonclickの実行関係htmlのaタグのhrefは...

HTML の ReadOnly と Enabled の違い

ReadOnly 属性を持つ TextBox は、クライアント上で次のマークアップとして表示されます...

phpstudy から Linux への MySQL の移行に関するチュートリアル

プロジェクトの目的元のWindows環境でphpstudyを使用して構築されたMySQL 5.5.5...

CentOSはローカルyumソース/Alibaba Cloud yumソース/163yuanソースを設定し、yumソースの優先順位を設定します。

1. Centosイメージを使用してローカルのyumソースをビルドするCentOS をインストール...

CSSリンクと@importの違いの詳細な説明

HTML に CSS を追加するにはどうすればいいですか? HTML で CSS を設定する方法は ...