bit-net:一套 API,抹平小游戏平台的网络请求差异

它解决什么问题

同时发微信、支付宝、字节跳动小游戏的项目都知道这个坑:微信用 wx.requestwx.connectSocket,支付宝是 my.requestmy.connectSocket,字节跳动又是另一套命名。同样一次登录请求,要写三份平台判断代码,还要留意各平台在超时、错误码上的细微差异。

bit-net 把这些差异封装掉,业务代码只认 HttpManagerSocket 两个接口,底层跑在哪个平台不用关心。

安装

npm install @gongxh/bit-net

零外部依赖。

HTTP 请求

支持 GET/POST/PUT/HEAD,响应类型可以是 jsontextarraybuffer

import { HttpManager, IHttpEvent } from '@gongxh/bit-net';

const loginEvent: IHttpEvent = {
    name: 'login',
    onComplete: (response) => {
        console.log('登录成功:', response.data);
    },
    onError: (response) => {
        console.log('登录失败:', response.error);
    },
};

HttpManager.post(
    'https://api.example.com/login',
    { username: 'test', password: '123456' },
    'json',
    loginEvent,
);

HttpManager.get('https://api.example.com/userinfo', { userId: 123 }, 'json', loginEvent);

除了给每个请求单独传回调,也可以监听 HttpManager.HttpEvent 这个全局事件,一个地方统一处理所有请求的响应——比较适合想做全局 loading 遮罩或者统一错误提示的场景。

WebSocket

import { Socket } from '@gongxh/bit-net';

const socket = new Socket('wss://game-server.com/ws', {
    binaryType: 'arraybuffer',
    timeout: 5000,
});

socket.onopen = () => console.log('连接成功');
socket.onmessage = (data) => console.log('收到消息:', data);
socket.onclose = (code, reason) => console.log('连接断开:', code, reason);
socket.onerror = (err) => console.log('连接错误:', err);

socket.send('Hello Server');       // 发文本
socket.sendBuffer(buffer);          // 发二进制,常用于 ProtoBuf 协议
socket.close(1000, '正常关闭');

binaryType 设成 arraybuffer 是游戏里最常用的选择,配合 ProtoBuf 做二进制协议传输,比纯文本 JSON 省流量。

避坑提醒

  • 不同平台对同时存在的 WebSocket 连接数、单次请求体大小都有各自的限制(尤其是小游戏平台),压测的时候记得针对目标平台单独验证,不要只在浏览器环境测完就当作所有平台都没问题。
  • HTTP 请求的超时时间要按平台网络状况留够余量,小游戏用户的网络环境普遍比 Web 端差,用桌面浏览器测出来的超时阈值放到小游戏上可能偏紧。
  • IHttpEventonError 和全局 HttpEvent 不是互斥的,两种方式可以同时生效,注意别在两处重复写了同一个错误提示逻辑。

项目信息

热更新模块 bit-hotupdate 下载资源清单和资源包就是用它做底层网络请求的,两者搭配天然契合。