更新记录
0.0.5(2021-12-22)
- 调整了文档中新版的构造函数说明,必须要添加url或options(同官方)
0.0.4(2021-12-22)
- websocket的构造函数不再集成url,需要用户提供,使用更加方便
0.0.3(2021-11-04)
- 优化send方法的处理,当连接成功时直接发送,若未成功则等待连接成功再发送
平台兼容性
Vue2 | Vue3 |
---|---|
√ | × |
App | 快应用 | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节小程序 | QQ小程序 |
---|---|---|---|---|---|---|
HBuilderX 3.1.0 app-vue | × | √ | × | × | × | √ |
钉钉小程序 | 快手小程序 | 飞书小程序 | 京东小程序 |
---|---|---|---|
× | × | × | × |
H5-Safari | Android Browser | 微信浏览器(Android) | QQ浏览器(Android) | Chrome | IE | Edge | Firefox | PC-Safari |
---|---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | × | √ | √ | √ |
wxy-lib 介绍
原创和收集优秀的js提供给项目使用
封装类
1、websocket
来源
websocket是支持H5,APP和小程序,可惜官方文档还是Hello示例中都只是浅尝辄止介绍下,对于我来说存在以下疑惑:
- uni.connectSocket创建多个连接时如何覆盖的?
- socketTask多连接是怎么使用?
- 在renderjs中如何使用websocket?还支持uni官方的API?
为了解答上面的疑惑,对uni官方的websocket api和html5的websocket进行了测试,得出以下结论:
目前uniapp官方提供了两种方式,一种是以uni开头的,暂称为WebSocket方式,另一种是SocketTask,类似于Html5中WebSocket,暂称为SocketTask方式
- WebSocket方式只支持一个连接,更换另一个时必须要先调用关闭后再连接,否则新的连接不生效
- SocketTask支持多个连接,相互之间独立,用法类似于Html5中WebSocket
- 两种方式在发送数据前都要确认连接是成功的,否则将报错,因为二者实质都是Promise返回
- renderjs中,上面uniapp官方的websocket的API无效,只能使用原生WebSocket,而且是支持多连接的
封装的想法来源于colorUI-IM和yiqun 打造跨平台即时通讯软件,但二者的socket的封装关联太多,什么帐号登录啊,什么服务客户连接啊 感觉考虑太多,反而把websocket封装的独立性破坏了,我的目标就是封装一个websocket库,自动识别环境,在逻辑层时使用uniapp官方的websocket,在视图层renderjs时使用Html5的WebSocket,默认是多连接的,可以自定义
使用
文件说明:
wxy-lib/plugins/websocket.js
是源文件wxy-lib/plugins/websocket.min.js
是压缩文件,压缩工具是UglifyJS,命令是uglifyjs websocket.js -m -c -o websocket.min.js(移除, 压缩后条件编译无效)- 默认库文件引用了项目下/config/base.js的配置文件,自己可填加,若自己修改源码再压缩
使用案例:
在逻辑层中使用时:
- 在main.js中import socket from './uni_modules/wxy-lib/plugins/websocket.js'
- 加入全局变量:
- vue2时:Vue.prototype.$socket=new socket(url);
- vue3时:app.config.globalProperties.$socket=new socket(url);
- this.$socket.send(message); 调用方法有send发送消息,message接收消息,close关闭消息,sync同步消息
在视图层中使用时:
- import Socket from '../../uni_modules/wxy-lib/plugins/websocket.js';
- let socket=new Socket(url);
- socket.send(message);
这里顺便说下renderjs的注意事项:
-
封装的代码在renderjs中运行时切记不能用新的语法,估计只支持ES2016语法,后面都不支持,如可选链(?.)或空值合并运算符(??),否则报错
[1635755742168][0ms][renderjs]:"431a0485 not found" at uni-app-view.umd.js:2 Uncaught SyntaxError: Unexpected token . at app-renderjs.js:128
-
this.$ownerInstance.callMethod
调用逻辑层方法时要求Vue是2,不能是3,否则报callMethod未定义错误,尽管我的项目是支持Vue3的 -
Vue2版支持renderjs全面,Vue3不全面支持renderjs,如callMethod不支持,示例代码在Vue2正常,在Vue3提醒callMethod未定义