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的public、private和privileged模式
Dec 28 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
Dec 31 Javascript
javascript 获取浏览器版本
Jan 21 Javascript
js实现图片和链接文字同步切换特效的方法
Feb 20 Javascript
js实现简单秒表走动的时钟特效
Mar 25 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
Jan 19 Javascript
在js中做数字字符串补0(js补零)
Mar 25 Javascript
vue二级菜单导航点击选中事件的方法
Sep 12 Javascript
vue-cli3 从搭建到优化的详细步骤
Jan 20 Javascript
JS实现页面数据懒加载
Feb 13 Javascript
记一次vue跨域的解决
Oct 21 Javascript
JavaScript原型链详解
Nov 07 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
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
Yii2 RESTful中api的使用及开发实例详解
2016/07/06 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
js 创建书签小工具之理论
2011/02/25 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
JS实现百度搜索框
2021/02/25 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
python中pygame模块用法实例
2014/10/09 Python
wxpython中Textctrl回车事件无效的解决方法
2016/07/21 Python
Python之os操作方法(详解)
2017/06/15 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
Python中的asyncio代码详解
2019/06/10 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
基于Python实现粒子滤波效果
2020/12/01 Python
英国最大的海报商店:GB Posters
2018/03/20 全球购物
英国女性时尚品牌:Apricot
2018/12/04 全球购物
护理职业应聘自荐书
2013/09/29 职场文书
创新型城市实施方案
2014/03/06 职场文书
企业活动策划方案
2014/06/02 职场文书
旅游文化节策划方案
2014/06/06 职场文书
初中班级口号
2014/06/09 职场文书
公司聚餐通知
2015/04/22 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
百年孤独读书笔记
2015/06/29 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
Python django中如何使用restful框架
2021/06/23 Python
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技