解决使用自定义域名时webpack的devserver热更新失效的问题

3 篇文章 0 订阅
2 篇文章 0 订阅

解决使用自定义域名时webpack的devserver热更新失效的问题

背景

如今webpack几乎成为了前端应用不可或缺的工具,其强大的功能和生态,让我们能够做到很多以前想都不敢想的事情。在开发阶段,相信大家都会用到webpackdevserver工具,此工具可以实现热更新,即我们代码改变后,实时进行编译,并实时更新页面上的对应视图,已达到代码更改,页面立即生效的效果,极大提升了开发效率。然而,近期,由于公司业务框架需要,我们不得不使用自定义域名,如:devxxx.kiner.com,而不是使用localhost:8080127.0.0.1:80800.0.0.0:8080,由此而产生了一个问题:我们亲爱的热更新失效了,改代码之后,还是会实时编译,但是需要刷新浏览器才能生效。为此,笔者研究了一下webpackdevserver源码,找到了解决方案,再次分享一下,避免后来者入坑

问题

因配置自定义域名导致热更新模块实时更新失效,要刷新网页才能看到更新

解决问题思路

  1. 热更新失效了,那我们就看看,webpack是通过什么原理实现热更新的呢?

    • 在这里插入图片描述
    • 在这里插入图片描述
    • 从上面的截图不难看出,当我是使用自定义域名是,控制台出现了报错,而我们的请求当中,也有一个异常请求。在webpack中,采用了websocket的方式实现热更新,大概的原理是这样的:webpack启动开发服务时会启动一个websocket,并且在我们的网页上注入监听代码,一旦webpack监听到我们项目中有文件发生了改变,就会触发实时编译,然后通过websock实时通知网页他这一次更新改变了什么,网页接收到消息后,就会对更新的模块进行重新渲染,以达到实时更新的目的。
  2. 了解了webpack实时更新的原理之后,我们再来分析一下,为什么使用自定义域名之后,会导致我们的websocket的连接失效呢。

    • 对比一下使用localhost的时候是怎样的。

      在这里插入图片描述

    • 从上图我们可以发现,其实两者的不同点就是域名和端口不一样,使用自定义域名后,连接变成了ws://devquestionnaire.tomabc.cn/sockjs-node,而使用localhost时,则是:ws://localhost:3246/sockjs-node

    • 那么,我们有没有办法在使用自定义域名的时候,让websocket的请求连接依然保持ws://localhost:3246/sockjs-node呢?这样是不是就能够请求成功,解决我们的问题了呢?

  3. 通过上一步,我们基本找到的症结所在,现在,我们就要想办法,在使用自定义域名的时候,让我们的websocket的链接保持ws://localhost:3246/sockjs-node

    • 我们来看一下devserver的源码,发现,其实让我们没有显示的指定websocket的host和port的时候,他会自动获取当前网页的host和port作为websocket的host和port,因此就会出现上述情况。

      在这里插入图片描述

    • 既然发现了这一点,那就简单了,我们通过环境变量显示指定一下,是不是就可以解决问题了呢?

      # 先安装一个cross-env模块,这样我们就可以更方便的设置环境变量
      yarn add cross-env -D
      

      接下来,在package.json的启动命令中增加环境变量

      {
        ...
        "scripts": {
          "start": "cross-env WDS_SOCKET_HOST=localhost WDS_SOCKET_PORT=3246 BUILD_ENV=development PORT=3246 react-app-rewired start"
        },
        "devDependencies": {
          ...
          "cross-env": "^7.0.2",
          ...
        }
      }
      
      
    • 最后,启动服务,看看效果

      在这里插入图片描述

      修改一下代码试一下

      在这里插入图片描述

      完美!!!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星河阅卷

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值