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

来源:互联网 发布:生命周期假说 知乎 编辑:程序博客网 时间:2024/05/29 19:12

前言

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.增加历史记录功能

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

对比

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

这里写图片描述

重构后:
这里写图片描述

这里写图片描述

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 杯子螺口错位怎么办 散粉盖子扭不开怎么办 玻璃瓶饮料盖子打不开怎么办 玻璃瓶玻璃盖子打不开怎么办 美甲没有胶水怎么办 按压式瓶盖打不开怎么办 睫毛胶水瓶盖打不开怎么办 玻璃杯盖子滑丝怎么办 瓶盖滑扣了怎么办 胶水瓶口被塞住怎么办 美林盖子打不开怎么办 美林瓶盖打不开怎么办 泰诺瓶盖打不开怎么办 玻璃罐头瓶盖打不开怎么办 塑料罐头瓶盖打不开怎么办 喷笔壶盖打不开怎么办 陶瓷壶盖卡住了怎么办 贝德玛瓶盖摔坏怎么办 塑料盖子错位拧不开怎么办 安全瓶盖坏了怎么办 刚买面霜打不开怎么办 可乐瓶盖鼓起来怎么办 暖壶塞子吸住了怎么办 茶兀瓶盖打不开怎么办 水杯盖太紧了拧不开怎么办 矿泉水瓶盖拧不开了怎么办 弩弦用手拉不上怎么办 茅台酒瓶口漏酒怎么办 化妆品盖子丢了怎么办 化妆品盖子碎了怎么办 自制水泵压力小怎么办 大学数学不会做怎么办 下雪了怎么办教案幼儿园小班 下水道被混凝土堵塞怎么办 日本足贴丢了胶布怎么办 牙齿被可乐腐蚀怎么办 三十岁满嘴无牙怎么办 水乳盖子打不开怎么办 蜂蜜罐子打不开了怎么办 蜂蜜盖子第二次拧不开怎么办 玻璃杯子拧不开盖子怎么办