【实践】不小心写了一个BUG, 让我对 Vue DevServer有了更深刻的理解

同步更新 微信公众号【爱写代码的小任】 欢迎关注

1. 背景

在上篇文章 手把手教你开发WebSocket(Vue + SpringBoot) 之后,
这边经过近两个月的加班, 项目终于上线了。
突然发现 webSocket地址 在生产和开发环境下是不同的两个地址(一个是静态配置,一个是动态配置)。
这就引发了我想要以一种更优雅的方式来配置一个websocket地址, 于是就和朋友开始了调整。

2. 调整过程

2.1 调整 server 地址为动态

 let currentDomain = window.location.host
 let uri = `ws://${currentDomain}/${process.env.VUE_APP_BASE_API}/websocket/${token}`

这样确实临时解决了问题。
当我代码提交到gitlab代码仓库之后,小伙伴把代码拉取下来之后, 却怎么启动不起来, 一直报错

node:events:492
      throw er; // Unhandled 'error' event
      ^

Error: read ECONNRESET
    at TCP.onStreamRead (node:internal/stream_base_commons:217:20)
Emitted 'error' event on Socket instance at:
    at emitErrorNT (node:internal/streams/destroy:151:8)
    at emitErrorCloseNT (node:internal/streams/destroy:116:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  errno: -54,
  code: 'ECONNRESET',
  syscall: 'read'
}

Node.js v18.17.1
 ELIFECYCLE  Command failed with exit code 1.

然后调试服务就直接终止了, 项目也因此一直启动不起来

2.2 错误分析

上面出现的问题困扰了几个人,几天… 通过重新下载依赖,升级依赖等能想到的办法都试了,就始终不行。

最后逼着自己看了下 webpack-devServer使用、运行流程、实现原理、常用配置项, 反复琢磨

最后了解到是 devServer 这个东西是靠 webSocket机制来触发代码变更,通过发送websocket消息来实现浏览器刷新的, 下图是一个一个大概的效果

在这里插入图片描述

而我们的websocket 算是重连了他那个Socket机制, 直接导致调式程序终止了

我们通过打印出来开发环境环境里面的变量,发现地址跟上图里面的webSocket地址是同一个地址,

    let currentDomain = window.location.host
    let uri = `ws://${currentDomain}/${process.env.VUE_APP_BASE_API}/websocket/${token}`
    console.log(currentDomain,uri)

这个时候就想明白了,我们代码的会重新创建一个webSocket连接, 导致他内置的那个 websocket 服务就断开了, 这个时候 调试服务 无法正常获取到webSocket, 就会出现上面的那个错误。

2.3 问题解决

通过改良代码之后, 发现完整解决问题

  let currentDomain = window.location.host
  let uri = `ws://${currentDomain}/${process.env.VUE_APP_BASE_API}/websocket/${token}`
    // console.log(currentDomain,uri)
  if (process.env.NODE_ENV === 'development') {
      uri = `${process.env.VUE_APP_SOCKET_BASE_API}/${token}`
      // console.log('uri',process.env)
  }

通过在开发环境下增加一个判断是否是开发环境, 同时在配置文件中配置一个自己的socket地址

// 消息通知
VUE_APP_SOCKET_BASE_API = 'ws://192.168.1.100:8280/websocket'

3. 总结

经过此次调整, 让我对 devServer的理解,直接提升了一个层级,后面有时间再细细研究 devServer的源码。

最后,感谢小伙伴们的帮助和支持。愿大家 2024 充实,快乐~

关注我,实时获取我的更新动态,和我一起讨论

  • 41
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱写代码的小任

感谢老板打赏,我将会再接再厉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值