vue-socket.io踩坑实录

背景

最近在研究实时通讯,需要上vue+socket.io,网上有大佬出了一个叫vue-socket.io的插件。

实录1

组件内监听

sockets: {
    connect() {
        console.log('连接')
    }
},

程序结果是输出“连接”,但多次刷新发现,偶尔会出现不输出的情况。

经过调试发现,其实socket连接是异步的。不输出的情况恰是因为连接socket比vue加载组件的速度快,提前触发了connect事件。

这种情况如何调试调试

很简单,我们模拟写一个vue插件。

index.js

import SocketIO from "socket.io-client";
import config from '@/config'
import Mixin from "./mixin";

export default {
    install(Vue) {
        const socket = SocketIO(config.websocket, {
            transports: ['websocket'],
        });
        socket.on('connect', () => {
            console.log('插件内 连接')
        })
        Vue.prototype.$socket = socket;
        Vue.mixin(Mixin);
    }
};

mixin.js

export default {
    beforeCreate() {
        if (!this.sockets) this.sockets = {};
    },
    mounted() {
        if (this.$options.sockets) {
            Object.keys(this.$options.sockets).forEach(event => {
                this.$socket.on(event, this.$options.sockets[event])
            });
        }
    }
}

index.vue

export default {
// ...自己的业务代码
    sockets: {
        connect() {
            console.log('连接')
        }
    },
}

刷新看控制台会发现,'插件内 连接'的输出一直都有,而'连接'的却时有时无。

如何解决这个问题

不要用vue-socket.io,自建插件参考index.js,把有关初始化的事件都做到插件里。其他业务逻辑写入组件即可。

按道理使用vue-socket.io中的.io属性是可以的,但测试后发现也是有问题的。具体原因不得而知。

import VueSocketIO from 'vue-socket.io'

const socket = new VueSocketIO({
    connection: 'ws://192.168.1.***:9501',
    options: {
        transports: ['websocket'],
    }
});

socket.io.on('connect', () => {
    console.log('连接')
})

总结

不能依赖vue-socket.io插件,需要自己写一个简单的插件去封装。而且必要的全局性、初始化类的事件要在插件内实现,因为插件内只会被挂载一次。


vue-socket.io踩坑实录
http://blog.icy8.cn/posts/52507/
作者
icy8
发布于
2021年5月23日
许可协议