头图

Vue修改代理无需重启项目解决方式

Vue 代理无需重启项目解决方式

问题描述

在使用 vue-cli3 创建项目时,如果在 vue.config.js 中配置了代理,那么在开发环境下,每次修改代理配置后都需要重启项目才能生效,这样就会造成开发效率的降低,因此需要解决这个问题。

vue 的代理是通过 http-proxy-middleware 实现的,它的原理是在开发环境下,通过 webpack-dev-server 启动一个 express 服务器,然后通过 http-proxy-middleware 将请求转发到目标服务器,因此,我们只需要在开发环境下,将 http-proxy-middleware 的配置写入到 webpack-dev-server 的配置中即可。

旧方案

在 vue.config.js 中配置如下代码:

devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      },
       '/message': {
        target: 'http://localhost:6000',
        changeOrigin: true,
        pathRewrite: {
          '^/message': ''
        }
      }
    }
  }

这样就可以在开发环境下,通过/api 访问 3000 端口的服务,通过/message 访问 6000 端口的服务。但是,每次修改代理配置后都需要重启项目才能生效。

新方案

我们使用http-proxy-middlewarerouter属性,它的优先级高于target,因此,我们可以通过router属性来实现动态代理,具体改造如下:

新的目录结构如下:

  ...
  ...
+ ├──proxy.js
+ ├──proxy-config.js
  ├──vue.config.js

我们将proxy.jsproxy-config.js放在根目录下,然后在 vue.config.js 中引入 proxy.js,具体代码如下:

vue.config.js
const proxy = require('./proxy')

devServer: {
  proxy: proxy
}
proxy.js
const fs = require('fs')

function looseJsonParse(obj) {
  return Function('"use strict";return (' + obj + ')')()
}
let currentProxy = ''
function getUrl(key) {
  const router = fs.readFileSync('./proxy-config.js', 'utf8')
  const a = router.indexOf('{')
  const b = router.lastIndexOf('}')
  const proxy = looseJsonParse(router.substring(a, b + 1))
  if (currentProxy !== proxy[key]) {
    console.log(`${key} proxy changed =>`, proxy[key])
  }
  currentProxy = proxy[key]
  return proxy[key]
}
module.exports = {
 '/api': {
    target: 'target',// 这个字段必须有
    router: () => getUrl('api'),
    changeOrigin: true,
    pathRewrite: {
      '^/api': ''
    }
  },
  '/message': {
    target: 'target',
    router: () => getUrl('message'),
    changeOrigin: true,
    pathRewrite: {
      '^/message': ''
    }
  }
}
proxy-config.js
/**
 * 代理配置,修改完代理后,不需要重启项目,直接刷新浏览器即可
 * 不使用json文件的原因是,json文件无法注释,不利于维护
 * https://github.com/chimurai/http-proxy-middleware#router-objectfunction
 */
const proxy = {
  /**
   * api
   */

  api: 'http://localhost:3000', //dev
  // api: 'http://localhost:3001', //sit

  /**
   * message
   */

  message: 'http://localhost:6000', //dev
  // message: 'http://localhost:6001', //sit

}

测试

启动项目,然后在proxy-config.js修改代理配置,不需要重启项目,直接刷新浏览器即可。

image.png

交流群

丰富自己,胜过取悦别人。

10.6k 声望
7.7k 粉丝
0 条评论
推荐阅读
Vue微信公众号开发踩坑记录
JS-SDK需要向服务端获取签名,且获取签名中需要的参数包括所在页面的url,但由于单页应用的路由特殊,其中涉及到iOS和android微信客户端浏览器内核的差异性导致的兼容问题

imwty132阅读 68.4k评论 81

「多图预警」完美实现一个@功能
一天产品大大向 boss 汇报完研发成果和产品业绩产出,若有所思的走出来,劲直向我走过来,嘴角微微上扬。产品大大:boss 对我们的研发成果挺满意的,balabala...(内心 OS:不听,讲重点)产品大大:咱们的客服 I...

wuwhs40阅读 4.7k评论 5

封面图
安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...

边城31阅读 7.2k评论 5

封面图
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...

chokcoco20阅读 2.1k评论 2

在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...

边城17阅读 1.9k

封面图
【已结束】SegmentFault 思否写作挑战赛!
SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等级,快来参与挑战,向更好的自己前进!

SegmentFault思否20阅读 5.6k评论 10

封面图
过滤/筛选树节点
又是树,是我跟树杠上了吗?—— 不,是树的问题太多了!🔗 相关文章推荐:使用递归遍历并转换树形数据(以 TypeScript 为例)从列表生成树 (JavaScript/TypeScript) 过滤和筛选是一个意思,都是 filter。对于列表来...

边城18阅读 7.7k评论 3

封面图

丰富自己,胜过取悦别人。

10.6k 声望
7.7k 粉丝
宣传栏