vue-cli项目代理proxyTable配置exclude的方法


Posted in Javascript onSeptember 20, 2018

问题描述

如果是前后端分离的项目,本地开发环境需要访问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的吗?好吧,不??拢?苯涌丛绰搿?/p>

说明一下,我们的项目,之前用的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'
 }
 },

可以了,现在两个版本都搞定了,强迫症的心好累,我去歇会。。。回头再优化吧

以上这篇vue-cli项目代理proxyTable配置exclude的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
node.js不得不说的12点内容
Jul 14 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
Sep 04 Javascript
noty ? jQuery通知插件全面解析
May 18 Javascript
JavaScript 是什么意思
Sep 22 Javascript
Canvas 制作动态进度加载水球详解及实例代码
Dec 09 Javascript
AngularJS表格样式简单设置方法示例
Mar 03 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
Jul 10 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
Mar 07 Javascript
js数组去重的N种方法(小结)
Jun 07 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
Jan 15 Javascript
JS三级联动代码格式实例详解
Dec 30 Javascript
记录一次websocket封装的过程
Nov 23 Javascript
Node批量爬取头条视频并保存方法
Sep 20 #Javascript
vue 本地环境跨域请求proxyTable的方法
Sep 19 #Javascript
vue 优化CDN加速的方法示例
Sep 19 #Javascript
Vue前后端不同端口的实现方法
Sep 19 #Javascript
vue-cli 3.x 修改dist路径的方法
Sep 19 #Javascript
浅谈React之状态(State)
Sep 19 #Javascript
jQuery使用each遍历循环的方法
Sep 19 #jQuery
You might like
极典R601SW收音机
2021/03/02 无线电
SONY ICF-F10中波修复记
2021/03/02 无线电
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
简单的自定义php模板引擎
2016/08/26 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
php微信公众平台示例代码分析(二)
2016/12/06 PHP
JavaScript 创建对象
2009/07/17 Javascript
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
js判断密码强度的方法
2020/03/18 Javascript
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
python删除文件示例分享
2014/01/28 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
深入理解Django的自定义过滤器
2017/10/17 Python
Python处理CSV与List的转换方法
2018/04/19 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
体育教师工作总结的自我评价
2013/10/10 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
离婚起诉书范本
2015/05/18 职场文书
2015重阳节座谈会主持词
2015/07/30 职场文书