最近在开发的一个项目,因为后端一些原因,在本地环境不能请求到测试环境的接口.
导致开发前端项目还需要在本机起一个后端的java服务,很是麻烦.作为一个有追求的程序员(搬运工),这哪能忍?
其实这个说到底还是跨域的问题,后来想到用charles
做代理解决问题.
想法是:
请求 https://myhost
下的静态资源时,用charles
重写到http://localhost:8089
.
1、因为要代理的地址是https
的,首先需要给charles
安装ssl证书,具体步骤见上一篇文章安装ssl.
2、然后打开tools -> rewrite
配置重写规则
3、图中A区域的规则表示哪些路径要走重写,B区域表示重写的规则,我这里直接为/*
表示所有路径
4、重写的规则如下:
因为线上的静态资源有
hash
值,而本地资源是没有带hash
的,而且二者资源相对路径也不太一样,所以用正则的分组匹配一下:如
https://myhost/static/js/app.ae3fd2jmh2.js
-> http://localhost:8089/app.js
:还有
https://myhost/11.js
-> http://localhost:8089/11.js
:到这里,先运行本地项目在8089
端口,然后在本地代码加一个debug
断点.然后访问https://myhost.com
发现走到了断点,则说明已经代理成功了,但是看到了报错:
GET https://myhost:8089/sockjs-node/info?t=1646743597862 net::ERR_TUNNEL_CONNECTION_FAILED
这是热更新的报错,因为热更新请求的地址会默认使用当前的host
也就是myhost
,但是现在是在开发环境,这当然不对啦,应该是localhost:8089
才对.但怎么去改这个值呢,不同版本的webpack-dev-server
改的方式不太一样.因为我的项目用的webpack-dev-server
版本是2.11.2
比较老,没有提供host
修改的配置,所以只能去node_modules
找到源码修改:
node_modules/webpack-dev-server/client/index.js
文件
// 修改前
var socketUrl = url.format({
protocol: protocol,
auth: urlParts.auth,
hostname: hostname,
port: urlParts.port,
pathname: urlParts.path == null || urlParts.path === '/' ? '/sockjs-node' : urlParts.path
});
// 修改后
var socketUrl = url.format({
protocol: 'http',
auth: urlParts.auth,
hostname: 'localhost',
port: urlParts.port,
pathname: urlParts.path == null || urlParts.path === '/' ? '/sockjs-node' : urlParts.path
});
然后刷新浏览器,修改代码,会发现热更新已经生效了.