基于 typescript+vue+websocket 的实时聊天应用

这是一个基于 typescript+vue+websocket 的实时聊天应用,可以作为 typescrpt+vue 结合示例,也可以作为 express+websocket 入门参考

代码在这里

解说的分割线----------

定义模型

实时聊天应用中,前后端最关心的 model 无非两个:message 和 user.这里用 typescript 定义如下

  • user
class User {
  private name: string
  private id: string
  private avatar: string
}
复制代码
  • message
import User from './user'
class Message {
  private from: User;
  private content: string
  private type: string
}
复制代码

这里的 model 前后端可以复用.

前端部分

聊天应用中对 message 和 user 数据的操作比较频繁,所以把这部分相关的代码写在 vuex,再通过mapstatemapmutation注入到 vue 实例中

@Component({
	computed: {
		...mapState(['ws', 'msgList', 'user']),
	},
	methods: {
		...mapMutations(['toggleLogin', 'initWS', 'addMsg', 'sendMsg']),
	},
})
复制代码

websocket 通信方面偷了个懒,如果有新消息直接推到通道内,再监听通道变化,渲染到本地

//推送到websocket
this.sendMsg({
  type: 'addMsg',
  from: user,
  content,
});
/渲染到本地
this.ws.onopen = (e: any) => {
  console.log('connection established');
  this.sendJoin();
};
this.ws.onmessage = (e: any) => {
  const msg = JSON.parse(e.data);
  this.$store.commit('addMsg', msg);
};
复制代码

实际聊天应用中是同时推送到本地和 websocket 通道,只不过对本地推送的消息加个 loading,等消息真正推送到对端把 loading 去掉(猜测......)

后端部分

后端代码相当简单,简单到不好意思说明... 核心代码就两句:

// Broadcast to all.
const broadcast = (data: message) => {
	wss.clients.forEach((client) => {
		if (client.readyState === WebSocket.OPEN) {
			client.send(data);
		}
	});
};

wss.on('connection', (ws) => {
	console.log('connection established');
  //监听消息,广播到所有客户端
	ws.on('message', (data: message) => {
		broadcast(data);
	});
});
复制代码

启动

  • cd client && npm run serve
  • cd server && npm run watch

这样一个简单的实时聊天应用就完成啦~~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值