问题描述

如果是前后端分离的项目,本地开发环境需要访问mock,或者在调试时直接访问线上的接口,这时候就会有接口跨域的问题(mock不存在跨域问题,但是用这个方法配置起来方便,姑且算是一个问题)。以vue-cli生成的项目为例,需要配置 config/index.js 中的 proxyTable 属性,大概如下:

?
1
2
3
4
5
6
7
8
proxyTable: {
'/pc/my/list/': {
target: 'http://10.132.20.14:8083/mockjsdata/66',
pathRewrite: {
 '^/pc/my/list/': '/pc/my/list/'
}
}
},

配置规则在网上搜proxyTable就能搜到,这里不做赘述。今天要说的是另一个问题,请见下面的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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/'
}
}
},

明明一句(见下)就能解决的问题,为什么要写成这个样子?难道就是因为使用者没有学好?

?
1
2
3
4
5
proxyTable:{
'/m':{
target: 'http://10.132.20.14:8083/mockjsdata/66'
}
},

事情当然没这么简单。原因是,后端在设计接口时,没有把api和模板分开,都在一个命名空间下(比如,首页的地址是 /m/index)。这时候,如果按照上面那样配置,连模板接口也会被代理掉,所以只能一个一个的写,实在是前端在给后端背锅啊!那么有没有更优雅的办法呢?比如exclude之类的?

我们发现,实现代理功能的插件是http-proxy-middleware,在文档中我们发现了这一段:

?
1
2
3
4
5
6
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的吗?好吧,不啰嗦,直接看源码。

说明一下,我们的项目,之前用的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给的不敢动,只要改成下面的就行了

?
1
2
3
4
proxyTable: [{
context: ['/m/**','!/m/index'],
target: 'http://10.132.20.14:8083/mockjsdata/66'
}],

OK,这个版本是比较简单的,下面说一下2.8.2版本的

这个版本有个 build/dev-server.js 文件,大概在 50 行左右,有类似下面的代码

?
1
2
3
4
5
6
7
8
// 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的情况,没办法,我们自己来动手改一下吧,加个方法

?
1
2
3
4
5
6
7
8
// 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的配置里只要写成如下即可

?
1
2
3
4
5
proxyTable:{
'm/**,!/m/index':{
target: 'http://10.132.20.14:8083/mockjsdata/66'
}
},

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

解放程序猿(媛)的双手-IOS自动化测试那些干货视频课程   下载地址:百度网盘下载
selenium2从零学习自动化测试视频   下载地址:百度网盘下载
光荣之路Android自动化测试高级实战   下载地址:百度网盘下载
快速上手Jmeter性能测试工具全程实战视频教程   下载地址:百度网盘下载
Android手机app端基于DDMS性能测试实战   下载地址:百度网盘下载
系统学习Android系统级白盒测试以及与自动化测试全程实录   下载地址:百度网盘下载
浅谈零基础自学Android UIAutomator自动化测试系列开发知识体系图视频教程   下载地址:百度网盘下载
2016年小马哥IOS9 OC Swift2.0大神班第五期培训 高清视频教程80G   下载地址:百度网盘下载
极客学院iOS开发工程师初级+中级+高级视频教程   下载地址:百度网盘下载
极客学院C#视频教程   下载地址:百度网盘下载
极客学院Android安卓工程师初级+中级+高级培训   下载地址:百度网盘下载
2018年4月份刚毕业珠峰培训前端全栈视频   下载地址:百度网盘下载
微信小游戏入门与实战 刷爆朋友圈   下载地址:百度网盘下载
兄弟连新版Web 前端视频教程   下载地址:百度网盘下载
兄弟连新版PHP视频教程(共346讲)   下载地址:百度网盘下载
微信公众平台接口二次开发搭建教程   下载地址:百度网盘下载
蛮牛第2季- Unity2d游戏开发经典教程   下载地址:百度网盘下载
Unity3D ARPG网络游戏编程实践   下载地址:百度网盘下载
蛮牛unity开发第五季 C#编程开发摇摆直升机实例教程   下载地址:百度网盘下载
四大维度解锁 Webpack 3.0 前端工程化   下载地址:百度网盘下载

转载于:https://www.cnblogs.com/voleta/p/9853590.html

vue-cli项目代理proxyTable配置exclude的方法相关推荐

  1. vue服务器代理proxyTable配置解决跨域

    目录 1.Proxy代理作用 2 .常见情况 3.应用方式 4.具体配置实例 5.配置思路 代理原理 总结 1.Proxy代理作用 proxy代理作用:前端服务器代理的作用是,告诉服务器任何未知请求( ...

  2. 安装vue/cli的一些警告的解决方法

    一.vue/cli 1.npm WARN vue-virtual-scroller@1.0.0-rc.2 requires a peer of vue@^2.5.21 but none is inst ...

  3. vue排除proxyTable配置错误调试方法

    解决方法 打开 node_modules\http-proxy\lib\http-proxy\common.js 106行回车添加一下代码,就能打印代理的地址 console.log('proxy:' ...

  4. Vue CLI:全局CLI配置

    配置参考 全局 CLI 配置 有些针对 @vue/cli 的全局配置,例如你惯用的包管理器和你本地保存的 preset,都保存在 home 目录下一个名叫 .vuerc 的 JSON 文件.你可以用编 ...

  5. Vue CLI 3结合Lerna进行UI框架设计

    第一次在掘金发文章,有点啰里啰嗦,大家见谅. 当前大部分UI框架设计的Webpack配置都相对复杂,例如Element.Ant Design Vue和Muse-UI等Vue组件库.例如Element, ...

  6. vue/cli是什么?vue/cli如何使用? 入门篇(安装创建,组件使用,定义路由,项目导出) ∠( °ω°)/ 前端知识

    文章目录 简介 安装 安装nodejs nvm npm换源 单次换源 永久换源 方法一 方法二 Vue/cli安装 创建Vue/cli项目 解决常见错误 用命令行创建项目 可视化界面创建 项目目录简介 ...

  7. Vue CLI 是如何实现的 -- 终端命令行工具篇

    若微信中阅读体验不佳,可点击阅读原文在 PC 端阅读. Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供了终端命令行工具.零配置脚手架.插件体系.图形化管理界面等.本文暂且只分析 ...

  8. 体验 vue cli 3.0

    vue cli 3x 发布已经有好长一段时间了,webpack 4x 现在版本已经到了 4.28.0:如果你现在用或者不用手脚架搭建项目,我都推荐你使用 webpack 4x,体验一把新技术带来的变化 ...

  9. 前端笔记-vue cli中axios批量发送get和post请求及注意事项

    目录 基本概念 关键代码 基本概念 这里安装好axios后,还要安装qs npm install --save qs 在vue cli中在created里面调用方法,他会在页面加载完成后自动调用! 批 ...

  10. Vue脚手架的使用(Vue CLI)

    一.什么是脚手架: CLI是Command-Line interface,翻译为命令行界面.Vue CLI是一个官方发布的Vue.js项目脚手架,它可以快速搭建Vue开发环境以及对应的webpack配 ...

最新文章

  1. deepnode处理过的图片_这款实用的图片软件,其功能相当于十几款图片处理软件的功能之和...
  2. Java基础--类与对象
  3. 北大博士干了半年外卖骑手,写出AI伦理论文登上顶刊,“系统知道一切”
  4. Axure external link打开原理
  5. ec200s 方案 移远_移远 4G Cat 1 无线通信模块EC200S
  6. java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...
  7. union共用体(联合体)、宏定义、枚举
  8. python原理及代码_链表的基本原理及Python代码的实现,与,python
  9. SQL注入学习part01:(结合sqli-libs学习:1-10关)
  10. 【2019南京ICPC网络赛 D】Robots【DAG上的随机游走】
  11. (1.6w字)浏览器灵魂之问,请问你能接得住几个?
  12. 如何优雅的进行W10远程控制
  13. VS code + miktex + 内置pdf阅读器 配置latex编译环境
  14. iOS播放器常用功能
  15. 对于 ACM程序设计选修课的感想
  16. Java小游戏,防止物体跑出四周边界的算法
  17. ubuntu下运行.exe程序
  18. 软件工程-非功能需求撰写参考案例
  19. moviepy多张图片合成视频
  20. DSNet: A Flexible Detect-to-Summarize Network for Video Summarizationa论文笔记

热门文章

  1. 如何成为一个Linux内核开发者(经典)
  2. 浏览器ocx控件安装 IE浏览器可用
  3. css超出div部分用省略号,css实现超出div长度用省略号表示
  4. 北漂人的独白,是否有所共鸣
  5. NUC8 i5beh 黑苹果macOS Monterey 12.3.1安装教程
  6. 【opencv-python】 HSV抠图-智能车拟合道路边界和中线
  7. 肿瘤基因组学数据库终结者:cBioPortal---转载
  8. 【矩阵论笔记】相似对角化、特征子空间(几何重数和代数重数)
  9. Codeforces Round #736 (Div. 2)
  10. Simon Game实现过程记录