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 相关文章推荐
测试你的JS的掌握程度的代码
Dec 09 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
Jul 28 Javascript
jquery单行文字向上滚动效果示例
Mar 06 Javascript
node.js中的fs.lchmod方法使用说明
Dec 16 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
Mar 05 Javascript
老生常谈 js中this的指向
Jun 30 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
Jul 28 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
Aug 03 Javascript
js判断PC端与移动端跳转
Dec 24 Javascript
js中document.write和document.writeln的区别
Mar 11 Javascript
JavaScript 处理树数据结构的方法示例
Jun 16 Javascript
vue elementUI批量上传文件
Apr 26 Vue.js
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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
php事务处理实例详解
2014/07/11 PHP
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
JS无限级导航菜单实现方法
2019/01/05 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
Python的动态重新封装的教程
2015/04/11 Python
python实现杨辉三角思路
2017/07/14 Python
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
对python字典过滤条件的实例详解
2019/01/22 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
如何利用python读取micaps文件详解
2020/10/18 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
python 模拟登陆163邮箱
2020/12/15 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
中青班党性分析材料
2014/02/16 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
二手手机买卖合同范本(2019年版)
2019/10/28 职场文书
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers
python pygame 开发五子棋双人对弈
2022/05/02 Python