在实际开发过程中,我们经常遇到跨域的问题,一般我们都会让后端设置一下允许跨域就可以了,但其实我们自己也是可以弄的。

现在的项目用vue写的多一点,vue-cli脚手架搭建也比较方便,脚手架搭建的项目其实已经融入了webpack。更多时候我们会在项目根目录下面建一个vue.config.js文件,用来做webpack的一些配置。

最近使用的配置大概是这样的:

module.exports = {
  /* 部署生产环境和开发环境下的URL:可对当前环境进行区分,baseUrl 从 Vue CLI 3.3 起已弃用,要使用publicPath */
  /* baseUrl: process.env.NODE_ENV === 'production' ? './' : '/' */
  // publicPath: process.env.NODE_ENV === "production" ? "/public/" : "./",
  publicPath: './',
  /* 输出文件目录:在npm run build时,生成文件的目录名称 */
  outputDir: 'dist',
  /* 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录 */
  assetsDir: 'assets',
  /* 是否在构建生产包时生成 sourceMap 文件,false将提高构建速度 */
  productionSourceMap: false,
  /* 默认情况下,生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存,你可以通过将这个选项设为 false 来关闭文件名哈希。(false的时候就是让原来的文件名不改变) */
  filenameHashing: true,
  /* 代码保存时进行eslint检测 */
  lintOnSave: true,
  /* webpack-dev-server 相关配置 */
  devServer: {
    /* 自动打开浏览器 */
    open: true,
    /* 设置为0.0.0.0则所有的地址均能访问 */
    host: '0.0.0.0',
    port: 8085,
    https: false,
    hotOnly: false
  }
}

devServer中其实还有一个proxy属性,可以用做代理,简单来说,配好了他,就可以用来实现跨域

因为dev-server使用了http-proxy-middleware包。

例如你在localhost:3000上有后端服务的话,可以这样启动代理

proxy: {
  "/api": "http://localhost:3000"
}

请求到/api/users现在会被代理到请求http://localhost:3000/api/user

如果不想始终传递/api,可以重写路径:

proxy: {
  "/api": {
    target: "http://localhost:3000",
    pathRewrite: {"^/api" : ""}
  }
}

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

proxy: {
  "/api": {
    target: "https://other-server.example.com",
    secure: false
  }
}

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

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

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

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";
      }
    }
  }
}

如果要将多个特定路径代理到统一目标,可以使用一个或多个具有上下文属性的对象数组:

proxy: [{
  context: ["/auth", "/api"],
  target: "http://localhost:3000",
}]

还可以同时代理多个

module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: '<url>',
        ws: true,
        changeOrigin: true
      },
      '/foo': {
        target: '<other_url>'
      }
    }
  }
}

各种骚操作,等待你去发掘应用。

12-20 18:25