vue-cli项目代理proxyTable配置exclude的方法
Posted voleta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue-cli项目代理proxyTable配置exclude的方法相关的知识,希望对你有一定的参考价值。
问题描述
如果是前后端分离的项目,本地开发环境需要访问mock,或者在调试时直接访问线上的接口,这时候就会有接口跨域的问题(mock不存在跨域问题,但是用这个方法配置起来方便,姑且算是一个问题)。以vue-cli生成的项目为例,需要配置 config/index.js 中的 proxyTable 属性,大概如下:
1
2
3
4
5
6
7
8
|
proxyTable: { ‘/pc/my/list/‘ : { 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/‘ : { pathRewrite: { ‘^/m/userinfo/‘ : ‘/mockjsdata/66/m/userinfo/‘ } }, ‘/m/my/ajax/list/‘ : { pathRewrite: { ‘^/m/my/ajax/list/‘ : ‘/mockjsdata/66/m/my/ajax/list/‘ } }, ‘/m/tkpreinterview‘ :{ pathRewrite: { ‘^/m/tkpreinterview‘ : ‘/mockjsdata/66/m/tkpreinterview‘ } }, ‘/m/preinterview‘ :{ pathRewrite: { ‘^/m/preinterview‘ : ‘/mockjsdata/66/m/preinterview‘ } }, ‘/m/interview‘ :{ pathRewrite: { ‘^/m/interview‘ : ‘/mockjsdata/66/m/interview‘ } }, ‘/m/checkLogin‘ :{ pathRewrite: { ‘^/m/checkLogin‘ : ‘/mockjsdata/66/m/checkLogin‘ } }, ‘/m/my/ajax/vdetail/‘ :{ pathRewrite: { ‘^/m/my/ajax/vdetail/‘ : ‘/mockjsdata/66/m/my/ajax/vdetail/‘ } } }, |
明明一句(见下)就能解决的问题,为什么要写成这个样子?难道就是因为使用者没有学好?
1
2
3
4
5
|
事情当然没这么简单。原因是,后端在设计接口时,没有把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 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
|
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
|
可以了,现在两个版本都搞定了,强迫症的心好累,我去歇会。。。回头再优化吧
解放程序猿(媛)的双手-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 前端工程化 下载地址:百度网盘下载
以上是关于vue-cli项目代理proxyTable配置exclude的方法的主要内容,如果未能解决你的问题,请参考以下文章