通过JS获取你当前的网络状况?建议大家学一学

开发 前端
我们可以自定义一个hook,用来获取网页当前的网络状态~需要具备以下要素:1、返回的数据所需的ts类、监听网络变化的enum。2、获取网络状态。3、监听网络变化,并实时更新最新的网络状态。

前言

大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心。

检测网速

想要在Web端检测网速,其实很简单,有一个全局的对象——navigation,我们来看看它的身上都有哪些东西:

图片图片

属性

描述

类型

downlink

有效带宽估算(单位:兆比特/秒)

number

effectiveType

effectiveType

slow-2g/2g/3g/4g

rtt

当前连接下评估的往返时延

number

saveData

用户代理是否设置了减少数据使用的选项

boolean

useNetwork

我们可以自定义一个hook,用来获取网页当前的网络状态~需要具备以下要素:

1、返回的数据所需的ts类、监听网络变化的enum

2、获取网络状态

3、监听网络变化,并实时更新最新的网络状态

第一步:所需的ts类型

说说NetworkState的各个参数:

  • since:记录当时检测的时间
  • oline:记录是否有网络
  • rtt:记录时延
  • downlink:记录带宽
  • saveData:记录用户代理是否设置了减少数据使用
  • effectiveType:网络连接类型
// hook返回的值
interface NetworkState {
  since?: Date;
  online?: boolean;
  rtt?: number;
  downlink?: number;
  saveData?: boolean;
  effectiveType?: string;
}

// 监听网络变化的事件名enum
enum NetworkEventType {
  ONLINE = 'online',
  OFFLINE = 'offline',
  CHANGE = 'change',
}

第二步:获取网络状态

function getConnection() {
  const nav = navigator as any;
  if (typeof nav !== 'object') return null;
  return nav.connection || nav.mozConnection || nav.webkitConnection;
}

function getConnectionProperty(): NetworkState {
  const c = getConnection();
  if (!c) return {};
  return {
    rtt: c.rtt,
    saveData: c.saveData,
    downlink: c.downlink,
    effectiveType: c.effectiveType,
  };
}

第三步:实时更新网络状态

unction useNetwork(): NetworkState {
  const [state, setState] = useState(() => {
    return {
      since: undefined,
      online: navigator?.onLine,
      ...getConnectionProperty(),
    };
  });

  useEffect(() => {
    const onOnline = () => {
      setState((prevState) => ({
        ...prevState,
        online: true,
        since: new Date(),
      }));
    };

    const onOffline = () => {
      setState((prevState) => ({
        ...prevState,
        online: false,
        since: new Date(),
      }));
    };

    const onConnectionChange = () => {
      setState((prevState) => ({
        ...prevState,
        ...getConnectionProperty(),
      }));
    };

    window.addEventListener(NetworkEventType.ONLINE, onOnline);
    window.addEventListener(NetworkEventType.OFFLINE, onOffline);

    const connection = getConnection();
    connection?.addEventListener(NetworkEventType.CHANGE, onConnectionChange);

    return () => {
      window.removeEventListener(NetworkEventType.ONLINE, onOnline);
      window.removeEventListener(NetworkEventType.OFFLINE, onOffline);
      connection?.removeEventListener(NetworkEventType.CHANGE, onConnectionChange);
    };
  }, []);

  return state;
}

完整代码

import { useEffect, useState } from 'react';

export interface NetworkState {
  since?: Date;
  online?: boolean;
  rtt?: number;
  downlink?: number;
  saveData?: boolean;
  effectiveType?: string;
}

enum NetworkEventType {
  ONLINE = 'online',
  OFFLINE = 'offline',
  CHANGE = 'change',
}

function getConnection() {
  const nav = navigator as any;
  if (typeof nav !== 'object') return null;
  return nav.connection || nav.mozConnection || nav.webkitConnection;
}

function getConnectionProperty(): NetworkState {
  const c = getConnection();
  if (!c) return {};
  return {
    rtt: c.rtt,
    saveData: c.saveData,
    downlink: c.downlink,
    effectiveType: c.effectiveType,
  };
}

function useNetwork(): NetworkState {
  const [state, setState] = useState(() => {
    return {
      since: undefined,
      online: navigator?.onLine,
      ...getConnectionProperty(),
    };
  });

  useEffect(() => {
    const onOnline = () => {
      setState((prevState) => ({
        ...prevState,
        online: true,
        since: new Date(),
      }));
    };

    const onOffline = () => {
      setState((prevState) => ({
        ...prevState,
        online: false,
        since: new Date(),
      }));
    };

    const onConnectionChange = () => {
      setState((prevState) => ({
        ...prevState,
        ...getConnectionProperty(),
      }));
    };

    window.addEventListener(NetworkEventType.ONLINE, onOnline);
    window.addEventListener(NetworkEventType.OFFLINE, onOffline);

    const connection = getConnection();
    connection?.addEventListener(NetworkEventType.CHANGE, onConnectionChange);

    return () => {
      window.removeEventListener(NetworkEventType.ONLINE, onOnline);
      window.removeEventListener(NetworkEventType.OFFLINE, onOffline);
      connection?.removeEventListener(NetworkEventType.CHANGE, onConnectionChange);
    };
  }, []);

  return state;
}

export default useNetwork;


责任编辑:武晓燕 来源: 前端之神
相关推荐

2017-03-19 22:13:10

WebAssemblyJavaScript编程

2020-04-01 17:50:02

Python编程语言

2011-08-22 16:39:15

iOS内存

2011-05-17 10:05:50

CSS

2013-01-25 13:55:26

Surface RT

2018-10-15 17:31:00

网络安全病毒网络攻击

2021-03-10 09:40:50

Linux命令文件

2021-04-15 09:18:57

鸿蒙HarmonyOS应用

2012-04-20 13:27:17

NFC

2010-06-03 11:39:28

网络性能

2020-05-25 10:05:26

Python 开发程序员

2023-09-04 00:03:08

2011-08-08 17:59:22

UIWebView网络网页

2021-02-03 09:59:02

鸿蒙HarmonyOS应用开发

2022-06-07 09:59:21

网络安全安全漏洞

2021-04-13 08:17:40

中国电信中国移动运营商

2019-03-19 15:28:30

Linux 系统 数据

2020-09-02 15:00:36

Linux命令软件

2023-10-27 11:01:31

网络性能VLAN

2021-05-27 10:07:49

网络安全主管网络安全网络攻击
点赞
收藏

51CTO技术栈公众号