使用 vue-cli 或者 webpack 开发时,配置 devServer 需要重启才能生效。但日常业务开发中,经常遇到切换后端地址联调的情况,而且公司的电脑配置不高,重启项目可能会很慢,本文讲介绍不重启切换 proxy 的地址的方法实践。

原理

  1. devServer: {
  2. proxy: {
  3. 'api/*': {
  4. target: 'localhost',
  5. changeOrigin: true,
  6. secure: false
  7. }
  8. }
  9. },

devServer 中 依赖了 http-proxy-middleware,平时都是配置 target为后端地址,但是还有个配置项[router](https://github.com/chimurai/http-proxy-middleware#router-objectfunction)可以重写target的地址(target配置项不能删除,会报错),基于此配置项可以实现热切换代理地址。

实现

在项目根目录增加两个文件:

  • proxy.switch.js
  • proxy.confg.json

    修改文件:vue.config.js

    ```javascript const { getRouter, getReq } = require(‘./proxy.switch.js’);

//… devServer: { proxy: { ‘api/*’: { // 修改 proxy.confg.json,切换 target和加 headers,无需重启 target: ‘localhost’, changeOrigin: true, secure: false, router: getRouter, onProxyReq: getReq } } } //…

  1. <a name="wjsbD"></a>
  2. ### 主文件:`proxy.switch.js`
  3. ```javascript
  4. const { readFileSync } = require('fs');
  5. const { resolve } = require('path');
  6. /**
  7. * @desc 配置文件说明
  8. * @param {*} target 要使用的目标地址,可以是routers中的key或地址
  9. * @param {*} routers 常用的后端服务地址
  10. * @param {*} token 直连平台使用的 X-CSRF-TOKEN
  11. * @param {*} cookie 直连平台使用的 Cookie
  12. */
  13. const configPath = './proxy.confg.json';
  14. const cache = {
  15. current: '',
  16. cookie: '',
  17. token: ''
  18. };
  19. /**
  20. * @desc 读取配置
  21. */
  22. function getConfig() {
  23. try {
  24. const jsonStr = readFileSync(resolve(__dirname, configPath), 'utf-8');
  25. const confg = JSON.parse(jsonStr);
  26. return confg;
  27. } catch {
  28. console.log('get proxy.config.json failed');
  29. }
  30. }
  31. /**
  32. * @desc 动态切换proxy target 无需重启devServer
  33. */
  34. function getRouter() {
  35. const { target, routes, cookie, token } = getConfig();
  36. const current = routes[target] || target;
  37. if (cache.current !== current) {
  38. console.log(`switch-proxy-target: ${target}(${current})`);
  39. }
  40. cache.current = current;
  41. cache.cookie = cookie;
  42. cache.token = token;
  43. return current;
  44. }
  45. /**
  46. * @desc 加headers
  47. */
  48. function getReq(proxyReq) {
  49. const { cookie, token } = cache;
  50. proxyReq.setHeader('X-CSRF-TOKEN', token);
  51. proxyReq.setHeader('Cookie', cookie);
  52. }
  53. module.exports = {
  54. getRouter,
  55. getReq
  56. };

配置文件:proxy.confg.json

  1. {
  2. "target": "105",
  3. "routes": {
  4. "105": "https://10.19.134.105",
  5. "20": "https://10.19.215.20",
  6. "161": "https://10.19.141.161",
  7. },
  8. "token": "94a517ac-7346-44f2-a915-546084c0a879",
  9. "cookie": "mNdoncxONxOhzf4i7WuocFmAUx4x0ZL-cas"
  10. }

通过 proxy.config.json,可以保存常用的后端服务地址,通过修改 target,无需重启即可实现代理地址的切换

如果直接连接平台环境还需要 CookieX-CSRF-TOKEN,通过F12查看平台上的接口,修改 json 里对应的配置即可。
image.png

总结

本文介绍了前端开发过程中,如何不重启热切换代理地址,解决开发过程中的痛点,已应用于业务开发中。