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 相关文章推荐
document对象execCommand的command参数介绍
Aug 01 Javascript
[JS源码]超长文章自动分页(客户端版)
Jan 09 Javascript
Javascript 对象的解释
Nov 24 Javascript
文本框根据输入内容自适应高度的代码
Oct 24 Javascript
javascript学习笔记(十二) RegExp类型介绍
Jun 20 Javascript
Javascript实现动态菜单添加的实例代码
Jul 05 Javascript
JS防止用户多次提交的简单代码
Aug 01 Javascript
js 判断文件类型并控制表单提交示例代码
Nov 14 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
Nov 17 Javascript
详解Vue如何支持JSX语法
Nov 10 Javascript
深入浅析vue-cli@3.0 使用及配置说明
May 08 Javascript
Vue 使用typescript如何优雅的调用swagger API
Sep 01 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-fpm的配置详解
2013/06/03 PHP
PHP多个文件上传到服务器实例
2014/10/29 PHP
PHP 枚举类型的管理与设计知识点总结
2020/02/13 PHP
js图片翻书效果代码分享
2015/08/20 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
如何使用angularJs
2017/05/08 Javascript
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
TypeScript类型声明书写详解
2019/08/28 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
为什么要做架构设计
2015/07/08 面试题
生物化工工艺专业应届生求职信
2013/10/08 职场文书
师范院校学生自荐信范文
2013/12/27 职场文书
政工例会汇报材料
2014/08/26 职场文书
小学生作文评语集锦
2014/12/25 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA