详解Webpack-dev-server的proxy用法


Posted in Javascript onSeptember 08, 2018

前言

如果你有单独的后端开发服务器 API,并且希望在同域名下发送 API 请求 ,那么代理某些 URL 会很有用。

解决开发环境的跨域问题(不用在去配置nginx和host, 爽歪歪~~)

在webpack.config.js中配置

下面简单介绍一下五个经常使用的场景

使用一:

mmodule.exports = {
  //...
  devServer: {
    proxy: {
      '/api': 'http://localhost:3000'
    }
  }
};

请求到 /api/xxx 现在会被代理到请求 http://localhost:3000/api/xxx, 例如 /api/user 现在会被代理到请求 http://localhost:3000/api/user

使用二

如果你想要代码多个路径代理到同一个target下, 你可以使用由一个或多个「具有 context 属性的对象」构成的数组:

module.exports = {
  //...
  devServer: {
    proxy: [{
      context: ['/auth', '/api'],
      target: 'http://localhost:3000',
    }]
  }
};

使用三:

如果你不想始终传递 /api ,则需要重写路径:

module.exports = {
  //...
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        pathRewrite: {'^/api' : ''}
      }
    }
  }
};

请求到 /api/xxx 现在会被代理到请求 http://localhost:3000/xxx, 例如 /api/user 现在会被代理到请求 http://localhost:3000/user

使用四:

默认情况下,不接受运行在 HTTPS 上,且使用了无效证书的后端服务器。如果你想要接受,只要设置 secure: false 就行。修改配置如下:

module.exports = {
  //...
  devServer: {
    proxy: {
      '/api': {
        target: 'https://other-server.example.com',
        secure: false
      }
    }
  }
};

使用五:

有时你不想代理所有的请求。可以基于一个函数的返回值绕过代理。

在函数中你可以访问请求体、响应体和代理选项。必须返回 false 或路径,来跳过代理请求。

例如:对于浏览器请求,你想要提供一个 HTML 页面,但是对于 API 请求则保持代理。你可以这样做:

module.exports = {
 //...
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        bypass: function(req, res, proxyOptions) {
          if (req.headers.accept.indexOf('html') !== -1) {
            console.log('Skipping proxy for browser request.');
            return '/index.html';
          }
        }
      }
    }
  }  
};

解决跨域原理

上面的参数列表中有一个changeOrigin参数, 是一个布尔值, 设置为true, 本地就会虚拟一个服务器接收你的请求并代你发送该请求,

module.exports = {
  //...
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true,
      }
    }
  }
};

vue-cli中proxyTable配置接口地址代理示例

修改 config/index.js

module.exports = {
  dev: {
  // 静态资源文件夹
  assetsSubDirectory: 'static',
  // 发布路径
  assetsPublicPath: '/',

  // 代理配置表,在这里可以配置特定的请求代理到对应的API接口
  // 使用方法:https://vuejs-templates.github.io/webpack/proxy.html
  proxyTable: {
    // 例如将'localhost:8080/api/xxx'代理到'https://wangyaxing.cn/api/xxx'
    '/api': {
      target: 'https://wangyaxing.cn', // 接口的域名
      secure: false, // 如果是https接口,需要配置这个参数
      changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
    },
    // 例如将'localhost:8080/img/xxx'代理到'https://cdn.wangyaxing.cn/xxx'
    '/img': {
      target: 'https://cdn.wangyaxing.cn', // 接口的域名
      secure: false, // 如果是https接口,需要配置这个参数
      changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
      pathRewrite: {'^/img': ''} // pathRewrite 来重写地址,将前缀 '/api' 转为 '/'。
    }
  },
  // Various Dev Server settings
  host: 'localhost', // can be overwritten by process.env.HOST
  port: 4200, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
}

更多参数

dev-server 使用了非常强大的http-proxy-middleware , http-proxy-middleware 基于 http-proxy 实现的,可以查看 http-proxy 的源码和文档:https://github.com/nodejitsu/node-http-proxy。

  • target:要使用url模块解析的url字符串
  • forward:要使用url模块解析的url字符串
  • agent:要传递给http(s).request的对象(请参阅Node的https代理和http代理对象)
  • ssl:要传递给https.createServer()的对象
  • ws:true / false,是否代理websockets
  • xfwd:true / false,添加x-forward标头
  • secure:true / false,是否验证SSL Certs
  • toProxy:true / false,传递绝对URL作为路径(对代理代理很有用)
  • prependPath:true / false,默认值:true - 指定是否要将目标的路径添加到代理路径
  • ignorePath:true / false,默认值:false - 指定是否要忽略传入请求的代理路径(注意:如果需要,您必须附加/手动)。
  • localAddress:要为传出连接绑定的本地接口字符串
  • changeOrigin:true / false,默认值:false - 将主机标头的原点更改为目标URL

参考

官方文档
http-proxy-middleware
node-http-proxy
API Proxying During Development

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 使用手册(四)
Sep 23 Javascript
原始的js代码和jquery对比体会
Sep 10 Javascript
jquery仅用6行代码实现滑动门效果
Sep 07 Javascript
JS继承之借用构造函数继承和组合继承
Sep 07 Javascript
JS HTML图片显示Canvas 压缩功能
Jul 21 Javascript
JavaScript学习笔记之惰性函数示例详解
Aug 27 Javascript
浅谈react受控组件与非受控组件(小结)
Feb 09 Javascript
vue-cli脚手架的安装教程图解
Sep 02 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
Feb 22 Javascript
vue设置导航栏、侧边栏为公共页面的例子
Nov 01 Javascript
区分vue-router的hash和history模式
Oct 03 Javascript
如何通过简单的代码描述Angular父组件、子组件传值
Apr 07 Javascript
详解Ubuntu安装angular-cli遇到的坑
Sep 08 #Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
Sep 07 #Javascript
Bootstrap-table使用footerFormatter做统计列功能
Sep 07 #Javascript
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 #jQuery
Bootstrap-table自定义可编辑每页显示记录数
Sep 07 #Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
Sep 07 #Javascript
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 #jQuery
You might like
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
封装的原生javascript弹出层代码
2010/09/24 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
python中lambda与def用法对比实例分析
2015/04/30 Python
python 对象和json互相转换方法
2018/03/22 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
Python常用特殊方法实例总结
2019/03/22 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
django列表筛选功能的实现代码
2020/03/27 Python
python使用pymongo与MongoDB基本交互操作示例
2020/04/09 Python
python 读取二进制 显示图片案例
2020/04/24 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
社会实践自我鉴定
2013/11/07 职场文书
业务经理岗位职责
2013/11/11 职场文书
给男朋友的道歉信
2014/01/12 职场文书
班级德育工作实施方案
2014/02/21 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
网络编辑求职信
2014/04/30 职场文书
庆七一活动总结
2014/08/27 职场文书
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers