学习一下webpack中devServer.proxy的配置
在实际开发过程中,我们经常遇到跨域的问题,一般我们都会让后端设置一下允许跨域就可以了,但其实我们自己也是可以弄的。
现在的项目用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>' } } } }
各种骚操作,等待你去发掘应用。