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实现的图片马赛克后显示并切换加文字功能
Apr 21 Javascript
jQuery 全选效果实现代码
Mar 23 Javascript
基于jquery实现图片广告轮换效果代码
Jul 07 Javascript
Knockout visible绑定使用方法
Nov 15 Javascript
用js判断输入是否为中文的函数
Mar 10 Javascript
javascript与有限状态机详解
May 08 Javascript
动态载入js提高网页打开速度的方法
Jul 04 Javascript
javascript闭包的理解
Apr 01 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
Nov 03 Javascript
vue-week-picker实现支持按周切换的日历
Jun 26 Javascript
Vue.js 中的实用工具方法【推荐】
Jul 04 Javascript
微信小程序单选框自定义赋值
May 26 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 多关键字 高亮显示实现代码
2012/04/23 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
prototype class详解
2006/09/07 Javascript
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
JS创建类和对象的两种不同方式
2014/08/08 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
JS 循环li添加点击事件 (闭包的应用)
2016/12/10 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
[06:43]2018DOTA2国际邀请赛寻真——VGJ.Thunder
2018/08/11 DOTA
python从ftp下载数据保存实例
2013/11/20 Python
Python中的__SLOTS__属性使用示例
2015/02/18 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
劳资员岗位职责
2013/11/11 职场文书
教师节宣传方案
2014/05/23 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
尼克胡哲观后感
2015/06/08 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书
教你部署vue项目到docker
2022/04/05 Vue.js
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers