注册
web

前端同时联调多个后端

前言


最近公司项目有时需要和多个后端同时对接(😔小公司一对N),于是对公司项目基础配置文件做了些修改,最终达到能对于多个后端同时启动多个前端服务,而不是每次都需要和A同学对接完,代理地址再换成B同学然后重新启动项目


个人经验0.5年,菜鸡前端一枚,第一次写文章,只是对个人工作简要记录😂!!!


公司项目有vue脚手架搭建的也有vite搭建的,下面让我们分两种方式来修改配置文件


vue-cli方式【webpack】


1. 个人习惯把proxy单独抽离出来放到.env.development


# 启动端口号
VUE_PORT = 8000

# 代理配置
# A同学
VUE_PROXY_A = [["/api","http://localhost:3001"]]

# B同学
VUE_PROXY_B = [["/api","http://localhost:3002"]]

2. 使用cross-env来加载不同的代理


npm i -D cross-env

重新编写下script


image.png


3. 读取环境变量


vueCli内部dotenv已经加载到process.env,我们再做一层包裹,之前配置的proxy,这种其实是字符串,需要处理


const { VUE_PROXY, VUE_PORT } = require("./constant.js")

// Read all environment variable configuration files to process.env
function wrapperEnv(envConf) {
const ret = {}
const SERVER_NAME = process.env.NODE_ENV_PROXY || VUE_PROXY

for (const envName of Object.keys(envConf)) {
if (!envName.startsWith('VUE')) {
continue
}
let realName = envConf[envName].replace(/\\n/g, '\n')
realName = realName === 'true' ? true : realName === 'false' ? false : realName

if (envName === VUE_PORT) {
realName = Number(realName)
}
if (envName === SERVER_NAME && realName) {
try {
realName = JSON.parse(realName.replace(/'/g, '"'))
} catch (error) {
realName = ''
}
}
ret[envName === SERVER_NAME ? VUE_PROXY : envName] = realName
if (typeof realName === 'string') {
process.env[envName] = realName
} else if (typeof realName === 'object') {
process.env[envName] = JSON.stringify(realName)
}
}
return ret
}

module.exports = {
wrapperEnv
}

这样我们就可以拿到所有的环境变量,并且proxy是数组,而不是字符串


4. 生成proxy


/**
* Used to parse the .env.development proxy configuration
*/


const httpsRE = /^https:\/\//

/**
* Generate proxy
* @param list
*/

function createProxy(list = []) {
const ret = {}
for (const [prefix, target] of list) {
const isHttps = httpsRE.test(target)

// https://webpack.docschina.org/configuration/dev-server/#devserverproxy
ret[prefix] = {
target: target,
changeOrigin: true,
ws: true,
pathRewrite: { [`^${prefix}`]: '' },
// https is require secure=false
...(isHttps ? { secure: false } : {}),
}
}
return ret
}

module.exports = {
createProxy,
}

5. 修改vue.config.js


const { defineConfig } = require('@vue/cli-service')
const { wrapperEnv } = require('build/vue/util')
const { createProxy } = require('./build/vue/proxy')

const {
VUE_PORT,
VUE_PROXY
} = wrapperEnv(process.env)

module.exports = defineConfig({
transpileDependencies: true,
// webpack-dev-server 相关配置
devServer: {
host: '0.0.0.0',
port: VUE_PORT,
open: false,
overlay: {
logging: 'info',
errors: true,
warnings: true
},
proxy: createProxy(VUE_PROXY),
disableHostCheck: true
},
})

6. 使用mock模拟两个后端服务


A同学使用3001端口
B同学使用3002端口


image.png


7. 测试是否达到效果


同样我们前端也起两个8000和8001


image.png


接下来看下8000端口请求


image.png
再看下8001请求


image.png


vite


结语


以上只写了webpack不过vite和这也差不多!!!


作者:向天卷飞机
来源:juejin.cn/post/7456266020379541531

0 个评论

要回复文章请先登录注册