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 相关文章推荐
javascript数组的扩展实现代码集合
Jun 01 Javascript
JavaScript iframe的相互操作浅析
Oct 14 Javascript
JavaScript实现简单的时钟实例代码
Nov 23 Javascript
jquery实现手机号码选号的方法
Jul 31 Javascript
jQueryUI DatePicker 添加时分秒
Jun 04 Javascript
url中的特殊符号有什么含义(推荐)
Jun 17 Javascript
微信小程序  modal弹框组件详解
Oct 27 Javascript
JS检测window.open打开的窗口是否关闭
Jun 25 Javascript
微信小程序之onLaunch与onload异步问题详解
Mar 28 Javascript
vue实现微信分享链接添加动态参数的方法
Apr 29 Javascript
js实现GIF图片的分解和合成
Oct 24 Javascript
vue学习笔记之给组件绑定原生事件操作示例
Feb 27 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
php往mysql中批量插入数据实例教程
2018/12/12 PHP
PHP函数积累总结
2019/03/19 PHP
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
JQuery UI DatePicker中z-index默认为1的解决办法
2010/09/28 Javascript
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
vue debug 二种方法
2018/09/16 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
一个简单的python程序实例(通讯录)
2013/11/29 Python
使用Python的Zato发送AMQP消息的教程
2015/04/16 Python
Python中functools模块的常用函数解析
2016/06/30 Python
python实现简单http服务器功能
2018/09/17 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
python中的对数log函数表示及用法
2020/12/09 Python
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
咨询公司各岗位职责
2013/12/02 职场文书
军训自我鉴定
2014/01/22 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
辞职信怎么写
2015/02/27 职场文书
现役军人家属慰问信
2015/03/24 职场文书
医院消毒隔离制度
2015/08/05 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
导游词之井冈山
2019/11/20 职场文书
python获取带有返回值的多线程
2022/05/02 Python