怎么在vue-cli项目中通过代理proxyTable配置exclude?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
问题描述
如果是前后端分离的项目,本地开发环境需要访问mock,或者在调试时直接访问线上的接口,这时候就会有接口跨域的问题(mock不存在跨域问题,但是用这个方法配置起来方便,姑且算是一个问题)。以vue-cli生成的项目为例,需要配置 config/index.js 中的 proxyTable 属性,大概如下:
proxyTable: {
'/pc/my/list/': {
target: 'http://10.132.20.14:8083/mockjsdata/66',
pathRewrite: {
'^/pc/my/list/': '/pc/my/list/'
}
}
},
配置规则在网上搜proxyTable就能搜到,这里不做赘述。今天要说的是另一个问题,请见下面的代码:
proxyTable: {
'/m/userinfo/': {
target: 'http://10.132.20.14:8083',
pathRewrite: {
'^/m/userinfo/': '/mockjsdata/66/m/userinfo/'
}
},
'/m/my/ajax/list/': {
target: 'http://10.132.20.14:8083',
pathRewrite: {
'^/m/my/ajax/list/': '/mockjsdata/66/m/my/ajax/list/'
}
},
'/m/tkpreinterview':{
target: 'http://10.132.20.14:8083',
pathRewrite: {
'^/m/tkpreinterview': '/mockjsdata/66/m/tkpreinterview'
}
},
'/m/preinterview':{
target: 'http://10.132.20.14:8083',
pathRewrite: {
'^/m/preinterview': '/mockjsdata/66/m/preinterview'
}
},
'/m/interview':{
target: 'http://10.132.20.14:8083',
pathRewrite: {
'^/m/interview': '/mockjsdata/66/m/interview'
}
},
'/m/checkLogin':{
target: 'http://10.132.20.14:8083',
pathRewrite: {
'^/m/checkLogin': '/mockjsdata/66/m/checkLogin'
}
},
'/m/my/ajax/vdetail/':{
target: 'http://10.132.20.14:8083',
pathRewrite: {
'^/m/my/ajax/vdetail/': '/mockjsdata/66/m/my/ajax/vdetail/'
}
}
},
明明一句(见下)就能解决的问题,为什么要写成这个样子?难道就是因为使用者没有学好?
proxyTable:{
'/m':{
target: 'http://10.132.20.14:8083/mockjsdata/66'
}
},
事情当然没这么简单。原因是,后端在设计接口时,没有把api和模板分开,都在一个命名空间下(比如,首页的地址是 /m/index)。这时候,如果按照上面那样配置,连模板接口也会被代理掉,所以只能一个一个的写,实在是前端在给后端背锅啊!那么有没有更优雅的办法呢?比如exclude之类的?
我们发现,实现代理功能的插件是http-proxy-middleware,在文档中我们发现了这一段:
proxy('**', {...}) matches any path, all requests will be proxied.
proxy('**/*.html', {...}) matches any path which ends with .html
proxy('/*.html', {...}) matches paths directly under path-absolute
proxy('/api/**/*.html', {...}) matches requests ending with .html in the path of /api
proxy(['/api/**', '/ajax/**'], {...}) combine multiple patterns
proxy(['/api/**', '!**/bad.json'], {...}) exclusion
注意最后一条,此插件是支持exclude的。以我们上面的例子来说,只要key的值写成类似 ['/m/**' , '!/m/index'] 这样的就行了。可是!你见过object的key是个array的吗?好吧,不啰嗦,直接看源码。
说明一下,我们的项目,之前用的vue-cli版本是2.8.2,我自己实验的版本是2.9.1,这两个版本是不一样的,咱一个一个说。
先说2.9.1版本生成的,此版本没有了 build/dev-server.js 以及类似的文件,直接用了 webpack-dev-server。在看过源码后,我发现,webpack-dev-server的proxy接收参数其实是个数组,并且里面有一个context值,就是来传递http-proxy-middleware第一个参数的。所以,我们不用傻傻的按照vue-cli给的不敢动,只要改成下面的就行了
proxyTable: [{
context: ['/m/**','!/m/index'],
target: 'http://10.132.20.14:8083/mockjsdata/66'
}],
OK,这个版本是比较简单的,下面说一下2.8.2版本的
这个版本有个 build/dev-server.js 文件,大概在 50 行左右,有类似下面的代码
// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
可以看到,这里的context只考虑到了string的情况,没办法,我们自己来动手改一下吧,加个方法
// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context.split(','), options))//context -> context.split(',')
})
这样你传进来的key都会变成数组。然后在proxyTable的配置里只要写成如下即可
proxyTable:{
'm/**,!/m/index':{
target: 'http://10.132.20.14:8083/mockjsdata/66'
}
},
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
网络异常,请检查网络