JS Web API: NetworkInformation 网络状况 API

本文介绍如何使用Web API获取用户的网络状况。重点介绍了NetworkInformation对象及其属性,并提供了代码示例,展示了如何监听网络变化并更新状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JS Web API: NetworkInformation 网络状况 API

正文

0. 基本信息

今天要给大家讲解的是利用浏览器的 WebAPI 来获取当前用户的网络状况,然而实际上浏览器 API 提供的状态还是比较粗浅,而且大多都是估计值,同时兼容性并不是那么好,所以如测速下载等功能实际上还是依赖服务端对前端行为的响应进行检测还是比较准确的

1. 相关 API

网络状况的相关 API 主要集中在 NetworkInformation 对象上(从 Navigator.connection 属性上获得),以及 Window 对象上的 onLine 属性

属性含义类型
Window.online是否连上网络boolean
NetworkInformation.type网络类型string
NetworkInformation.effectiveType网络类型string
NetworkInformation.downlink下载速度number
NetworkInformation.downlinkMax最大下载速度number
NetworkInformation.rtt信号延迟number
NetworkInformation.saveData当前设备是否开启节省流量开关boolean

另外还有三个事件我们可以监听用于更新网络状态

事件
Window.ononline
Window.onoffline
NetworkInformation.onchange

具体 API 细节自己查:传送门:NetworkInformation - MDN

2. 代码实现

接下来我们尝试着写点代码来看看效果

  • /src/components/NetworkConnection.tsx

首先我们先定义接下来要保存的网络状态,除了前面提到的之外,我们另外保留一个最后更新时间

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

接下来写两个方法用于获取状态快照

const getConnection = () => {
  const nav = window.navigator;
  if (!nav) return null;
  // @ts-ignore
  return nav.connection || nav.mozConnection || nav.webkitConnection;
};

const getNetworkState = (): NetworkState => {
  const connection = getConnection();
  if (!connection) {
    return {
      since: new Date(),
      online: navigator.onLine,
    };
  }
  const state: NetworkState = {
    since: new Date(),
    online: navigator.onLine,
    type: connection.type,
    effectiveType: connection.effectiveType,
    downlink: connection.downlink,
    downlinkMax: connection.downlinkMax,
    rtt: connection.rtt,
    saveData: connection.saveData,
  };

  console.table(state);

  return state;
};

最后我们选择在 mount 的时候初始化网络状况并挂载监听函数

  const [state, setState] = useState<NetworkState>({});

  useEffect(() => {
    // init state
    setState(getNetworkState());

    const onStateChange = () => {
      setState(getNetworkState());
    };

    const connection = getConnection();

    window.addEventListener('online', onStateChange);
    window.addEventListener('offline', onStateChange);
    connection?.addEventListener('change', onStateChange);
    return () => {
      window.removeEventListener('online', onStateChange);
      window.removeEventListener('offline', onStateChange);
      connection?.removeEventListener('change', onStateChange);
    };
  }, []);

3. 最终效果

老实说个人觉得效果不太好,可能还是搞个实际的服务端来进行真正的网络交互会更实在,还能从浏览器 http 请求头获取更多信息

其他资源

参考连接

TitleLink
NetworkInformation - MDNhttps://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation
JS中监听网络状况的常用方法https://segmentfault.com/a/1190000023957246

完整代码示例

https://github.com/superfreeeee/Blog-code/tree/main/front_end/javascript/js_network_information

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值