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('**',{...})matchesanypath,allrequestswillbeproxied. proxy('**/*.html',{...})matchesanypathwhichendswith.html proxy('/*.html',{...})matchespathsdirectlyunderpath-absolute proxy('/api/**/*.html',{...})matchesrequestsendingwith.htmlinthepathof/api proxy(['/api/**','/ajax/**'],{...})combinemultiplepatterns 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行左右,有类似下面的代码
//proxyapirequests Object.keys(proxyTable).forEach(function(context){ varoptions=proxyTable[context] if(typeofoptions==='string'){ options={target:options} } app.use(proxyMiddleware(options.filter||context,options)) })
可以看到,这里的context只考虑到了string的情况,没办法,我们自己来动手改一下吧,加个方法
//proxyapirequests Object.keys(proxyTable).forEach(function(context){ varoptions=proxyTable[context] if(typeofoptions==='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' } },
可以了,现在两个版本都搞定了,强迫症的心好累,我去歇会。。。回头再优化吧
以上这篇vue-cli项目代理proxyTable配置exclude的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。