vue-chat项目之重构与体验优化

2023-11-01

前言

vue-chat 也就是我的几个月之前写的一个基于vue的实时聊天项目,到目前为止已经快满400star了,注册量也已经超过了1700+,消息量达2000+,由于一直在实习,没有时间对它频繁地更新,趁着这个国庆,对他进行了一次重构,希望我的经验对大家有帮助。有宝贵的意见请在issue提给我。
旧版本:
https://github.com/hua1995116/webchat/tree/v1.2.0
新版本:
https://github.com/hua1995116/webchat/tree/dev
可以说这也是一个稳定版本,但是代码细节方面存在许多的不堪。
所以我从以下几个大方面进行了优化
线上地址:http://www.qiufengh.com:9090/#/

前面两个版本的介绍:
vue+websocket+express+mongodb实战项目(实时聊天)(一)
vue+websocket+express+mongodb实战项目(实时聊天)(二)

代码结构

1.梳理项目目录结构

原目录:
这里写图片描述
新目录
这里写图片描述
主要是多了一个api目录,view目录和一个Basetransition.vue文件。
api的作用为对axios的统一处理
view使得页面和组件分离,因为一般写都是混在一起,会导致不太清楚
Basetransition.vue为一个切换特效的基本文件

2.对每个页面的结构进行整改

这里不细说,具体看每个页面,主要是对一些可以在单页内使用的data,去除了vuex。使得每个页面具有其通用性,去除了耦合性。

3.将公共工具utils抽取出来

里面有三个工具,
这里写图片描述

分别为处理时间,localStoragec存储,处理url的query参数
4.页面与组件分离

刚才讲了,将components 分离出来,分离成真正的组件以及页面。

5.axios进行了统一的处理

api下的axios.js对axios进行了统一的处理
包括,响应出错,响应超时

import axios from 'axios'

const baseURL = ''


const instance = axios.create()

instance.defaults.timeout = 30000 // 所有接口30s超时

// 请求统一处理
instance.interceptors.request.use(async config => {
  if (config.url && config.url.charAt(0) === '/') {
    config.url = `${baseURL}${config.url}`
  }

  return config
}, error => Promise.reject(error))

// 对返回的内容做统一处理
instance.interceptors.response.use(response => {
  if (response.status === 200) {
    return response
  }
  return Promise.reject(response)
}, error => {
  if (error) {
    console.log(JSON.stringify(error))
  } else {
    console.log('出了点问题,暂时加载不出来,请稍后再来吧')
  }
  return Promise.reject(error)
})

export default instance

6.运用了async await,ES7的特性

大量运用了async/await 新特性,使得更好的处理异步,使得代码更加简化,例如,处理首页是否登录
src/view/loan.vue

async mounted() {
  const uerId = getItem('userid')
  if (!uerId) {
    await Confirm({
      title: '提示',
      content: '请先登录'
    })
    this.$router.push({ path: 'login' })
  } else {
    this.$store.commit('setTab', true)
  }
},

代码性能

1.压缩所有图片

利用 https://tinypng.com/
进行了对所有图片的压缩,以及手动对一些尺寸大的图片进行压缩,
例如,项目中只需要用到80*80像素的图片,实际上服务器传了一张200*200的,所以手动进行了对图片调整。

2.所有请求,统一采用先加载页面,再进行请求,体验优化

在之前的版本,是让请求和切换页面同时进行,所以在切换的过程过,会出现卡顿的现象。。现在,我将移到了页面的mounted中,并且加入了loading动画,为了展示loading动画,特别搞了点小动作,因为我们的项目“太快了“!!“太快了“!!“太快了“!!,我怕你们看不到这个动画。以下src/view/chat.vue为例子,删除了一些不利于阅读的代码。

mounted() {
  loading.show()
  setTimeout(async () => {
    await this.$store.dispatch('getMessHistory', {roomid: this.roomid})
    loading.hide()
    this.isLoadingAchieve = true
//        window.scroll(0, 10000)
  }, 1000)
},

体验优化

1.切换路由动画

切换的顺序,主要参考了这位大哥的思路,
https://github.com/zhengguorong/pageAinimate并且在他的基础上,我再进行了优化,让我们的项目页面切换变成了牛逼哄哄的样子。
“顺畅的不像话“,看起来分不清楚是app还是h5

这里写图片描述

可以看我的Basetransition.vue页面。

script

  export default {
    data () {
      return {
        transitionName: 'slide-left'
      }
    },
    beforeRouteUpdate (to, from, next) {
      let isBack = this.$router.isBack
      if (isBack) {
        this.transitionName = 'slide-right'
      } else {
        this.transitionName = 'slide-left'
      }
      this.$router.isBack = false
      next()
    }
  }

css

.slide-left-enter{
    -webkit-transform: translate(100%, 0);
    transform: translate(100%, 0);
  }
  .slide-left-leave-active {
    -webkit-transform: translate(-100px, 0);
    transform: translate(-100px, 0);
  }
  .slide-right-enter {
    -webkit-transform: translate(-100%, 0);
    transform: translate(-100%, 0);
  }
  .slide-right-leave-active {
    -webkit-transform: translate(100%, 0);
    transform: translate(100%, 0);
  }

核心主要是这两段代码。

当旧的路由(旧的页面)被新的路由(页面)替换,其实在一般的app中你可以看到新的页面滑进来,旧的页面一般都是会往左偏移一段距离,我们正是实现了这样的一个过程。并且通过一个属性isBack来判断进入和退出所需要的动画方向。

还有一个就是退出的时候,我们需要将child-view设置overflow:hidden,因为我们这个聊天组件的时候,需要渲染许多dom,所以如果让文档溢出的话,会出现卡顿的效果。

2.首页加载速度性能提升(移除首页所有不必要的请求)

在我们本来的项目中,首页有载入许多图片,现在移除了所有不必要的图片。

3.加入loading, 优化处理

这里写图片描述

4.加入静态组件,仿苹果弹窗(Alert, confirm)

这里写图片描述

5.加入用户缓存机制,不必每次刷新重新登录了

我们可以使用utils下的localStorage.js,setItem这个函数,
setItem(key, value, duration),参数分别为,属性名,属性值,缓存时长。

6.增加历史记录功能

下面的历史记录也可以查看啦。

对比

因为服务器比较渣,所以还是能体谅这个速度,我们主要看前后对比时间。
重构前:
这里写图片描述

这里写图片描述

重构后:
这里写图片描述

这里写图片描述

比较之下还是有很大的改善的。剩下的自己慢慢体会吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue-chat项目之重构与体验优化 的相关文章

  • linux下网站压力测试工具webbench

    webbench最多可以模拟3万个并发连接去测试网站的负载能力 个人感觉要比Apache自带的ab压力测试工具好 安装使用也特别方便 1 适用系统 Linux 2 编译安装 引用wget http blog s135 com soft li

随机推荐

  • Sentinel 入门使用

    目录 一 Sentinel简介 1 1Sentinel简介 1 2 Sentinel与Hystrix的区别 1 3 名词解释 二 sentinel控制台 2 1 下载启动控制台 2 3 客户端接入控制台 2 4 Rest整合Sentinel
  • python基本概念-关键要素

    1 要素1 数据类型 Python提供了几种内置的数据类型 现在我们只关注其中两种 Python使用int类型表示整数 正整数或负整数 使用str类型表示字符串 Unicode字符序列 如果需要将一个数据项从某种类型转换为另一种类型 可以使
  • DB2数据库连接(jdbc连接)encoding not supported

    在进行db2数据库连接过程中发现了一些问题 报如下错误 com ibm db2 jcc b DisconnectException encoding not supported 该问题的出现是IBM JDK和sun JDK之间相互不支持 解
  • 【滤波器】7. 带通滤波器

    将低通滤波器和高通滤波器串联 如下图所示 就可得到带通滤波器 设低通滤波器的截止频率为 f p 1 f p1 fp1 高通滤波器的截止频率为
  • Spark 的Shuffle过程详解

    一 Shuffle的作用是什么 Shuffle的中文解释为 洗牌操作 可以理解成将集群中所有节点上的数据进行重新整合分类的过程 其思想来源于hadoop的mapReduce Shuffle是连接map阶段和reduce阶段的桥梁 由于分布式
  • if与if else与if else if else之间的用法与区别(C++)

    1 if 满足这个条件 执行语句操作 不满足条件 不操作 结构 if 条件 语句 2 if else 满足这个条件 执行语句1操作 不满足 执行语句2操作 结构 if 条件 语句1 else 语句2 备注 通俗说就是两者取其一 注意 if
  • 简单方法恢复linux以及windows启动引导

    1 恢复linux启动引导 以ubuntu为例 很多小孩喜欢用wubi装linux 确实这种方法比较简单 比较安全 但是这种安装方法是基于windows的 也就是说 如果windows挂了 比如重装了或还原了 那么原来安装的linux也就没
  • cvFindContours函数使用

    CV IMPL intcvFindContours void img CvMemStorage storage CvSeq firstContour int cntHeaderSize int mode int method CvPoint
  • Servlet 实现重定向几种方法

    servlet重定向 在servlet JSP编程中 服务器端重定向可以通过下面两个方法来实现 1 运用javax servlet RequestDispatcher接口的forward方法 2 或者运用javax servlet http
  • 基于FPGA的串口通讯设计与实现

    繁體 基于FPGA的串口通讯设计与实现 日期 2012 03 26 来源 作者 字体 大 中 小 随着多微机系统的应用和微机网络的发展 通信功能越来起重要 串行通信是在一根传输线上一位一位传送信息 这根线既作数据线又作联络线 串行通信作为一
  • uniapp实现支付功能 和 可视化拖拽工具

    1 支付功能 https blog csdn net weixin 37787674 article details 103012041 2 分享一个 uniapp uview ui 可视化 完全自由拖拽 一键生成flex代码网站 http
  • 你必须知道的495个C语言问题整理三

    1 为什么大家都说不要使用gets 跟fgets 不同 gets 不能被告知输入缓冲区的大小 因此不能避免缓冲区的溢出 标准库的fgets 函数对gets 作了很大的改进 尽管它仍然不完善 2 fgetops fsetops 和ftell
  • python入门笔记——函数①

    python入门笔记 函数 def function 定义一个名为function的函数 定义函数时用下面来解释该函数的用处 这个函数是用来重复输出4次 你好 的 return for i in range 1 5 print 你好 pas
  • SSL、TLS、HTTPS的关系

    SSL TLS HTTPS的关系 SSL Secure Sockets Layer 安全套接字协议 TLS Transport Layer Security 传输层安全性协议 TLS是SSL的升级版 两者几乎是一样的 HTTPS Hyper
  • Java 多线程 -- 从入门到精通

    持续更新中 欢迎收藏 关注 以便查看后续 Java 多线程 从入门到精通 Java线程与线程的区别 多线程的实现方法 Thread中start和run方法的区别 Thread和Runnable的关系 使用Callable和Future创建线
  • 神经网络的三种可视化方法——使用keras和MXNet(gluon)实现

    神经网络的三种可视化方法 用keras和MXNet gluon 实现 目录 神经网络的三种可视化方法 用keras和MXNet gluon 实现 概述 keras实现 keras特征图可视化 keras可视化滤波器 卷积核 的最大响应图 k
  • 清除内存/缓存

    1 查看缓存 free h 2 清理缓存 sync echo 3 gt proc sys vm drop caches 我们在清理缓存前应该先sync下 因为系统在操作的过程当中 会把你的操作到的文件资料先保存到buffer中去 因为怕你在
  • 刷脸支付产业也迎来新的跃升时刻

    2019年刷脸支付异常火爆 一种创投人青睐有加 纷纷入局 一项新事物从诞生到发展总要经历很多波折 对于刷脸支付行业来说 更是如此 2020年初新冠疫情肆虐 人们被围在城里 圈在村里 各类实体门店到店率急剧下降 刷脸支付一度遇冷 而在疫情期间
  • C++星罗万象时钟罗盘

    编写思路 该程序的难点在于字符串的书写角度 理解了这个就已经理解了这个程序的核心内容 需要注意的地方是这个程序的每一圈代表一个 for 循环 我开始写的时候认为一个 for 循环嵌套一个 for 循环 但是后面我发现 for 循环嵌套的太多
  • vue-chat项目之重构与体验优化

    前言 vue chat 也就是我的几个月之前写的一个基于vue的实时聊天项目 到目前为止已经快满400star了 注册量也已经超过了1700 消息量达2000 由于一直在实习 没有时间对它频繁地更新 趁着这个国庆 对他进行了一次重构 希望我