前言
通常,我们在日常开发中,API可能由不同的后端程序员开发,代码就可能在不同电脑上,而已经上线的功能又在线上服务器上,线上服务器又可能分成测试服务器和正式服务器,总之一句话,前端开发中可能由N台PC或服务器提供API,所以我们的请求必须要指向不同PC或服务器,怎么办呢?
通常解决办法是配置Vue-CLI的devserver-proxy。
官方手册
https://cli.vuejs.org/zh/config/#devserver-proxy
官方手册很坑爹的好么?!不过,官方提供了一个页面,有更多的信息:
https://github.com/chimurai/http-proxy-middleware#proxycontext-config
但是依然很乱好么?!
整体上说,这个devserver-proxy的配置很有学问,很复杂,但是通常我们并不需要那么复杂的配置,今天就简单讲讲,够用即可。
范例
[process.env.VUE_APP_BASE_API + '/hikvision']: {
target: `http://192.168.9.50:8083`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
原理
-
process.env.VUE_APP_BASE_API
是项目根目录的.env.development
文件里配置的VUE_APP_BASE_API
的值。如果真实API接口有自己的一个根目录,比如http://www.foo.com/api/xxx/ooo/12
,那么,这里的/api
就是API接口的根目录,你就必须在.env.development
文件里配置VUE_APP_BASE_API
的值为/api
。 -
'/hikvision/'
是你的真实API除去VUE_APP_BASE_API
之后的path的第一段,因为一般API的path类似于/foo/bar
、/foo/bar/12
,所以/foo
是一致的,这里只填/foo
这种即可。 -
总说这个数组,一般就放1个元素即可,这个元素就是匹配你的真实API的前一截。
-
target
可以是后端程序员的IP、端口,如果,某个程序员给的接口,自己有一个自定义的根目录,比如他提供了一个API叫http://192.168.2.45:9527/jackyChan/foo/bar/12
,这个jackyChan
在正式服务器的API中是没有的,但是这个程序员任性,就喜欢加,那么,你写target
应该是http://192.168.2.45:9527/jackyChan
。如果这个程序员没这种癖好,只是http://192.168.2.45:9527/foo/bar/12
,那么更简单,你应该写http://192.168.2.45:9527
。
可能你会问,键名中有'/hikvision'
,那么target
中要不要加'/hikvision'
?
请注意,键名中的'/hikvision',只是为了表达“系统要匹配path包含'/hikvision'的API”,而不是说,系统会自主从'/hikvision'
后面截断。 -
changeOrigin
如实填写,跨域就true
,没跨就false
。 -
pathRewrite
的作用是,真实API假如根目录叫/api
,但是,后端开发者没有用这个目录,那么,你就必须在这做一个改写,这就是一个正则查找,将/api
替换成空串。
记得上面说的/jackyChan
吗?假如服务器根目录是/api
,后端程序员电脑提供的API根目录是/jackyChan
,那么你除了在target
写上/jackyChan
这种办法之外,还有第2种方案,就是在pathRewrite
里重写,将/api
重写为/jackyChan
,可以写成['^' + process.env.VUE_APP_BASE_API]: '/jackyChan'
。
多条配置
将范例连续写2次,那么,系统会从第一条开始匹配,如果配上了就执行,配不上,就找第二条。
所以,你可以写N条,最后一条应该是“托底”的,能适应大部分请求的,上面的若干条应该是只针对个别接口的。
这样一来,你一个人可以对接N个程序员电脑、N个服务器的API,一点压力都没有。
如果一个服务器提供/foo/bar
,另一个服务器提供/for/bar/12
,那么,应该先写后者,后写前者。
后者的键名可以是:[process.env.VUE_APP_BASE_API + '/foo/bar/']
前者的键名可以是:[process.env.VUE_APP_BASE_API + '/foo/bar']
为什么?因为先写的必须是最详细的。
[process.env.VUE_APP_BASE_API + '/system/base/']: {
target: `http://192.168.9.22:9527`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
[process.env.VUE_APP_BASE_API + '/system/base']: {
target: `http://192.168.9.12`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
[process.env.VUE_APP_BASE_API + '/hikvision']: {
target: `http://192.168.9.50:808`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '/jackyChan'
}
},
[process.env.VUE_APP_BASE_API]: {
target: `http://192.168.9.33:8083`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
注意事项
每次修改完vue.config.js,都要重新yarn dev
。
网友评论