首先强调的是webpack proxy只能用作于开发阶段,临时解决本地请求服务器(通常是测试服)产生的跨域问题,并不适用线上环境。配置在webpack的 devServer属性中

配置在package.jsonproxy也一样

原理

一句话总结:本地服务器充当代理服务器,使得请求不受浏览器同源策略的限制。

webpack 的 devServer开启了本地服务器。配置了proxy之后,本地服务器作为代理服务器,每次请求都会被本地服务器拦截。
本地服务器帮我们向真正有资源的服务器发起请求,以此获取真正的资源,使得前端发起的请求不受浏览器同源策略的限制。

  1. 如果我们没有使用 proxy,请求是这样发送的

Webpack 的 Proxy - 图1

  1. 如果我们使用了 proxy,请求是这样发送的

Webpack 的 Proxy - 图2

更多细节

devServer使用了[http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware),而http-proxy-middleware是基于[http-proxy](https://github.com/http-party/node-http-proxy)实现的

webpack 的配置方法

  1. 代理到某个域名

    1. module.exports = {
    2. //...
    3. devServer: {
    4. proxy: 'http://localhost:3000'
    5. }
    6. };

    这样写,发起的任何请求,都会代理到 http://localhost:3000

  2. 如果只想代理某类路径,比如说 /api

    1. module.exports = {
    2. //...
    3. devServer: {
    4. proxy: {
    5. '/api': 'http://localhost:3000'
    6. }
    7. }
    8. };

    假如现在,对 /api/users 的请求会将请求代理到 http://localhost:3000/api/users

  3. 如果不希望代理 /api,就重写路径

    1. module.exports = {
    2. //...
    3. devServer: {
    4. proxy: {
    5. '/api': {
    6. target: 'http://localhost:3000',
    7. pathRewrite: {'^/api' : ''}
    8. }
    9. }
    10. }
    11. };
  4. 如果想将多个路径,用 context

    1. module.exports = {
    2. //...
    3. devServer: {
    4. proxy: [
    5. {
    6. context: ['/auth', '/api'],
    7. target: 'http://localhost:3000',
    8. },
    9. ],
    10. },
    11. };

    参考资料

    《Webpack-dev-server的proxy用法》
    《Webpack 官网 devServer》