近期用 webpack-dev-server 作代理的一些经验
如今前端开发使用 webpack-dev-server 作为本地服务器已经是基本配置,加上 proxy 功能可以很好的应对 SSL、跨域、线上环境切换等需求。Vue CLI 3 里也做了相应的集成,用起来很方便。
对于 Vue CLI 3 创建的项目,只要修改 vue.config.js,增加下面这段代码即可:
devServer: {
proxy: {
'/api': {
target: BASE_HTTP,
changeOrigin: true,
autoRewrite: true,
secure: false,
},
},
},
关于其中参数的意义,大家可以参考 http-proxy-middleware 的文档,我就不多解释了。接下来,在身份认证存储 Cookie 方面,我厂后端使用了比较严格的模式:
Set-Cookie: XXID=xxid; Max-Age=2678400; Path=/; Secure; HttpOnly; SameSite=Strict
这样一来,因为域名和端口不同(本地开发是 localhost:8080),Cookie 写不进去,无法完成身份认证。虽然可以手工写入,但明显不是长久之计。经过一些搜索和尝试,最简单的做法是修改 HTTP header 中 set-cookie 的部分,不那么严格就可以:
onProxyRes(proxyRes) {
const key = 'set-cookie';
if (proxyRes.headers[key]) {
const cookies = proxyRes.headers[key].join('').split(' ');
proxyRes.headers[key] = [cookies[0], 'Path=/'].join(' ');
console.log(proxyRes.headers[key]);
}
},
接下来,还要代理 WebSocket 请求。这里的问题在于生产环境里 WS 的路径也是 /api 开头的,所以直接写在后面会被提前匹配出来。所以我选择换 /socket 前缀,然后 rewrite :
'/socket': {
target: BASE_WS,
changeOrigin: true,
ws: true,
secure: false,
pathRewrite: {
'^/socket': '/api',
},
},
这样,就能够在开发环境里代理使用线上的测试和生产环境了。
相关文章
Vite 里使用动态加载
有时候,我们希望根据用户当前的使用状态决定加载哪些模块。比如一个网页 IDE,用户在写 JS,我们就加载 JS […]
2022-02-135 分钟
近期帮一个朋友做的 Vue 网站优化方案
前几天有个朋友找到我,说他们公司的网站产品打开速度不太理想,加载的数据量很大,想优化一下。并且询问我,是不是用 […]
2022-01-224 分钟
复盘近期升级工具链的过程
公司希望我提升产品在移动端的体验,于是我就打开了 Lighthouse,然后看了眼代码,发现有几个问题: 移动 […]
2021-12-196 分钟


