首页 > 其他分享 >【解决webpack-dev-server 动态配置代理问题】

【解决webpack-dev-server 动态配置代理问题】

时间:2023-01-22 03:33:45浏览次数:79  
标签:http target dev server webpack api router com

【解决webpack-dev-server 动态配置代理问题】:https://code84.com/723524.html#devServerproxy_12

 

文章目录

 


前言

在常规开发中,基本上都会有好几套环境,开发环境dev.com,测试环境test.com。我们在对接不同的环境联调的时候,一般是通过切换target,来实现连接不同的环境。然而,总是需要切换不同的域名,或者与多个后端同事协同开发的时候,经常切换target,那就得经常重启服务,这就让人很难受了。


一、devServer-proxy

前端开的时候,本地启动的环境,访问的地址一般都是默认的 localhost+端口,而我们由于业务,需要与不同的环境进行联调,这个时候就有了跨域的问题需要解决,而解决的方式一般是两种,一种是本地用Nginx做代理,另一种就是我们常用的 devServer-proxy。

devServer: {
        proxy: {
            '/api': {
                target: `http://${ip}:9002/`,
                changeOrigin: true,
                pathRewrite: {
                    '^/api': '',
                },
            },
        },
    },

二、配置方式

1. 配置多个代理

有些小伙伴就想,解决经常重启服务问题也很好办,我多配置几个’/api’就可以了,通过axios发起请求的时候,对不同环境,分别配置一个中间路径,这也可以是一个解决办法:

devServer: {
        proxy: {
            '/test-api': {
                target: 'http://test.com/',
                changeOrigin: true,
                pathRewrite: {
                    '^/test-api': '',
                },
            },
            '/dev-api': {
                target: 'http://dev.com/',
                changeOrigin: true,
                pathRewrite: {
                    '^/dev-api': '',
                },
            },
            ...
        },
    },

但是这种方式维护起来很麻烦,也有不小心将开发环境的变量提交到测试环境的风险。

2.使用 http-proxy-middleware 的router

http-proxy-middleware有一个属性 router 它可以动态覆盖target:

// Use `host` and/or `path` to match requests. First match will be used.
// The order of the configuration matters.
router: {
    'integration.localhost:3000' : 'http://localhost:8001',  // host only
    'staging.localhost:3000'     : 'http://localhost:8002',  // host only
    'localhost:3000/api'         : 'http://localhost:8003',  // host + path
    '/rest'                      : 'http://localhost:8004'   // path only
}

// Custom router function (string target)
router: function(req) {
    return 'http://localhost:8004';
}

// Custom router function (target object)
router: function(req) {
    return {
        protocol: 'https:', // The : is required
        host: 'localhost',
        port: 8004
    };
}

// Asynchronous router function which returns promise
router: async function(req) {
    const url = await doSomeIO();
    return url;
}

而我们仅需要这样子配置:

devServer: {
        proxy: {
            '/api': {
                target: 'http://dev.com/',
                //target: 'http://test.com/',
                changeOrigin: true,
                pathRewrite: {
                    '^/api': '',
                },
                router: () => url //URL 会覆盖 target,成为新的代理地址
            },
        },
    },

具体的实现方式就是,在项目的根目录,配置一个target.env 文件,将需要代理的地址,写在这个文件里,然后通过fs去读取target.env里的内容,动态返回给router,从而实现动态切换环境,而不需要重启服务:

devServer: {
        proxy: {
            '/api': {
                target: 'http://dev.com/',
                changeOrigin: true,
                pathRewrite: {
                    '^/api': '',
                },
                 router: () => {
                    return fs.readFileSync(process.cwd() + '/target.env', 'utf8');
                }
            },
        },
    },

target.env 的内容默认和proxy的target一样:

 http://dev.com/

需要访问哪个环境,就填入哪个环境的地址就可以了,比如我原本访问的是
http://dev.com ,现在要访问http://test.com/ 。我只需要将文件里的内容替换成 http://test.com/ ,代理就会立即生效,不需要重启。

 http://test.com/

总结

动态配置代理,解决开发过程中需要频繁重启服务借还不同环境的问题,能够给我们开发带来极大的便利,提升开发效率。

标签:http,target,dev,server,webpack,api,router,com
From: https://www.cnblogs.com/bydzhangxiaowei/p/17064170.html

相关文章

  • vue3学习之---webpack配置【resolve.alias修改】
    在vue3中,脚手架生成的项目里,webpack的配置文件没有了,因为公共的配置被封装到安装包里了,可以找到如下目录,同样可以修改配置文件:node_modules》@vue》cli-service   ......
  • 记录一下我安装ubuntu server的几个要点
       今天安装了一下ubuntuserver22.04,记录一下过程中的几个要点,以备下次折腾:1.虚拟硬件配置2.镜像地址3.自定义磁盘分区4.桌面系统1.虚拟硬件配置   内存......
  • dremio backend webserver 简单说明
    dremio的webserver是基于jetty+jersey开发的webserver同时也和标准的dremio服务一样实现了service接口方便服务的启动具体是由DACDaemon调用触发的启动webserve......
  • C# 使用DevExpress轻松将SVG转为Imag格式
    如果你正在使用DevExpress,那么轻松搞定!//从资源中导入SVG图片SvgBitmapsvgImage=newSvgBitmap(Resources.svgImg);Imageimg1=svgImage.Render(null,1);//1是缩......
  • Linux 系统无法正常启动——pvs显示unknown device
    目录[hide]一、问题现象二、unknown的device查找1、pvs查看2、pvdispaly,二、恢复方案2、/etc/lvm/backup/sapvg查看(1)找到sdf1的uuid:(2)移除/dev/sdf1设备......
  • sql server CONVERT(VARCHAR(7),'2023-01-07 18:34:53.690',120)转换
    convert语法:sqlCONVERT(data_type[(length)],expression[,style])data_type目标数据的数据类型,包括xml,bigint,sql_variant。不能使用别名数据类型。......
  • Windows Server上部署IoTdb 集群
    本文是参考官方的IoTDB集群版(1.0.0)的安装及启动教程:https://iotdb.apache.org/zh/UserGuide/V1.0.x/Cluster/Cluster-Setup.html,在WindowsServer2019上部署集群的实践......
  • 中小型系统必要可行的DevOps方案概述
    本文内容是个人针对实际工作中的问题,进行的一番思考、总结,供中小型公司进行DevOps实践时作一个思路上的参考,我觉得做事情,思路很重要,抛砖引玉...背景本文主要探讨中小型公......
  • SQL Server表的数据量大小查询
    CREATETABLE#Temp(NAMEnvarchar(100),ROWSchar(20),reservedvarchar(18),Datavarchar(18),index_sizevarchar(18),Unusedvarchar(18))GOINSERT#TempEXEC......
  • Caddy-用Go写的新一代可扩展WebServer
    前几天用Netmaker的时候发现它用Caddy替换掉了Nginx,用了后发现确实简单好用,就安利一下。Caddy是一个强大的、可扩展的平台,用Go编写,可以为你的站点、服务和应用程......