教你用Vue渐进式搭建聊天室,从JavaScript=TypeScript

news/2024/7/1 3:06:58

前言

Vue+Socket.io这个轮子已经有很多人造过了,为了不重复造轮子,我将本项目以三阶段实现(大家可以在github中的Releases查看):

  • 纯前端(Vuex)
  • 后端+前端(JavaScript)
  • 后端+前端(TypeScript)

希望能给大家一个渐进学习的经验。
本项目地址:https://github.com/spiritree/...
欢迎Star&Fork

Vue-cli创建工程

npm install -g vue-cli

vue init webpack my-project

vue init ElemeFE/webpack-typescript my-project(感谢饿了么分享的TypeScript的模板)

这样就在当前目录下创建了完整的工程模板

Socket.io

在Server端(Express)

import * as socketIo from 'socket.io'this.io.on('connection', (socket: any) => {socket.on('sendMessage', (data: any) => {this.io.emit('boardcastMessage', data)
})

在Client端(Vue)

<script lang="ts">
/// <reference path="../../socket.io.d.ts" />
export default Vue.extend({mounted() {socket.on('boardcastMessage', (data: any) => {this.$store.dispatch('sendMessage', { data })})}
})

Server端常用API:

socket.emit():向建立该连接的客户端发送消息

socket.on():监听客户端发送信息

io.sockets.emit():向所有客户端广播

Client端常用API:

socket.emit():向服务端发送消息

socket.on():监听服务端发来的信息

TypeScript教程

关于TypeScript的基本知识,可以直接看xcatliu整理的教程,简单易懂,有Java/C#基础就可快速上手。
TypeScript 入门教程

webpack+TypeScript(前端)

Vue + TypeScript 尝鲜体验

也可用官方插件vue-class-component

**本项目参考
vue init ElemeFE/webpack-typescript my-project**

先添加声明文件(Vue全家桶自带就不需要了)
本项目用到Express和Socket.io

npm install typescript --save-dev

npm i ts-loader --save-dev

在webpack.base.conf.js中添加

{module: {rules: [{test: /\.tsx?$/,loader: 'ts-loader',exclude: /node_modules/,options: {appendTsSuffixTo: [/\.vue$/],}},],}
}

在根目录添加声明文件

socket.io.d.ts(为了编译通过)

declare namespace socket {var on: any;var emit: any;var data: any;
}

在每个Vue文件中添加

图片描述

Gulp+TypeScript(后端)

npm install gulp --save-dev

npm install gulp-typescript --save-dev

npm install @types/express --save-dev

npm install @types/socket.io --save-dev

Server文件夹结构

├── app.js
├── gulpfile.js
├── register.js
├── src
│   ├── type-app.ts
│   └── type-register.ts
├── tsconfig.json
├── type-app.js
└── type-register.js

添加tsconfig.json

TypeScript官方手册

{"include": ["src/*.ts"],"compilerOptions": {"noImplicitAny": true,"lib": ["es6"],"target": "es5","outDir": ""}
}

配置gulpfile.js

var gulp = require("gulp");
var ts = require("gulp-typescript");
var tsProject = ts.createProject("tsconfig.json");gulp.task("build", function () {return tsProject.src().pipe(tsProject()).js.pipe(gulp.dest(""));
});

从JavaScript=>TypeScript

图片描述

部署到服务器

Linux+Nginx的组合,可以一键部署虚拟主机
OneinStack

部署的遇到的坑
https://github.com/socketio/s...

Error during WebSocket handshake: Unexpected response code: 400

在nginx.conf添加

location / {proxy_pass http://localhost:8989;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;}

如何使用

预览地址:https://app.spiritree.me/

Github地址:https://github.com/spiritree/...

开启JavaScript服务端

git clone https://github.com/spiritree/vue-socket.io-chat.git

npm install

npm run server

开启TypeScript服务端

npm install

cd server

gulp build

npm run tsserver

浏览器访问 http://localhost:8989
如遇在线列表不同步,刷新重进即可

预览

图片描述

图片描述

参考资料

  • TypeScript 入门教程
  • Vue + TypeScript 尝鲜体验
  • TypeScript官方手册

http://lihuaxi.xjx100.cn/news/249569.html

相关文章

VBScript中InStr函数的用法

InStr([start, ]str1, str2[, compare]) [用途]&#xff1a;返回str2在str1中的位置。匹配成功时&#xff0c;返回值最小值为1&#xff0c;未匹配到时返回0。 [参数说明]&#xff1a; start:在str1中开始匹配的位置&#xff0c;1表示从头开始&#xff0c;不能为0或更小值。 可选…

在数据库组件中用业务规则剖析挑选数据

2019独角兽企业重金招聘Python工程师标准>>> 直接去 techsmith 吧 http://www.screencast.com/t/6o6iWQac 转载于:https://my.oschina.net/ychenIntegration/blog/61634

[译] JWT 与 Spring Cloud 微服务

keyholesoftware.com/2016/06/20/…作者&#xff1a;THOMAS KENDALL译者&#xff1a;oopsguy.com 微服务安全是架构的一个重要部分。具体来说&#xff0c;就是认证和授权模式。 微服务认证和授权处理方式有几种选择&#xff0c;但本文只介绍 JSON Web Token 的使用。 JSON Web …

mac 拷贝文件时报错 8060 解决方案

解决如下&#xff1a; 即某文件夹下出现多重子目录&#xff0c;级数很多&#xff0c;删除多余的子文件夹即可。 至于如何产生的&#xff0c;有人说是xcode升级导致&#xff0c;不过没有见证 。我的不属于这类情况的。 &#xff08;参见&#xff1a;http://macosx.com/forums/ma…

CVPR 2022 视频全景分割新 Benchmark:VIPSeg

关注公众号&#xff0c;发现CV技术之美今天向大家分享 CVPR 2022 论文『Large-scale Video Panoptic Segmentation in the Wild: A Benchmark』,介绍一个新的视频全景分割&#xff08;Video Panoptic Segmentation&#xff09;领域 Benchmark&#xff1a;VIPSeg。论文链接&…

使用CruiseControl.Net全面实现持续集成

持续集成想必大家很多人都听说过&#xff0c;甚至都实践过&#xff0c;最近我又一次亲历了一次持续集成&#xff0c;现将我的经验分享给大家。关于持续集成的理论在本文概不涉及&#xff0c;本文的主要目的是实战CruiseControl.Net&#xff0c;用它来全面实现持续集成。 在配置…

c库的rand/random随机数产生函数性能差?

有网文称c标准库的rand/random随机数产生函数性能极差。一直信以为真&#xff0c;但从没做过验证。最近因其他因缘&#xff0c;写了些代码专门验证rand/random的性能。结果大出意料&#xff0c;颠覆之前的成见。 结论如下&#xff1a; 1) rand/random性极佳。在64位机器上&…

EXCHANGE证书

证书&#xff1a; CA&#xff08;证书颁发机构&#xff09;和证书有什么区别&#xff1f; CA&#xff1a;是服务器中的一个服务&#xff0c;主要是用来为计算机&#xff08;用户&#xff09;来颁发证书&#xff0c;安装CA的服务器称为证书服务器&#xff0c; 证书&#xff1a;从…