我们本地开发调试一般是 npm run serve
或 yarn serve
,然后打开 localhost:8080
(本机的IP),此时如果调用后端接口,可能会产生跨域,那如何解决呢?
解决跨域的方案
- jsonp
- 只支持GET请求,JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
- cors
- CORS支持所有类型的HTTP请求,是跨域HTTP请求的根本解决方案
- Node中间件代理(两次跨域)
- 通过同源策略对服务器不加限制。
- Nginx反向代理
- 通过同源策略对服务器不加限制。
日常工作中,生产环境用得比较多的跨域方案是cors和nginx反向代理。
本地项目中调试用的最多的就是 node 代理,当然像 nginx、charles(抓包工具)做代理也可以,只要你会配置。
vue 中的 proxy
就是利用了 Node 代理,原理是因为服务器端没有跨域,使用的是 http-proxy-middleware 这个模块(这个模块相当于是node.js的一个插件)
案例
- 你要调取的接口是
http://dev.com/api/test
,然后你可以在本地调http://localhost:8080/api/test
,如axios.get('/api/test')
配置代理后,会做如下转发:
http://localhost:8080/api/test
-> http://dev.com/api/test
http://localhost:8080/admin/api/test
-> http://dev.com/admin/api/test
1 | // vue-cli3.0 里面的 vue.config.js做配置 |
- 当你调后端接口的命名没有统一给接口前加
/api
这类的标识,那么你可以自己加,也就是你可以在本地调http://localhost:8080/api/test
,如axios.get('/api/test')
,而你要的目标接口是http://dev.com/test
,你就可以用pathRewrite
,遇到/api
就去找代理http://dev.com/test
并且把/api
重写为/
。
所以转发效果就是:
http://localhost:8080/api/test
-> http://dev.com/test
1 | // vue-cli3.0 里面的 vue.config.js做配置 |
- 对所有的接口都代理的,不止是检测到
/api
的接口,比如:
http://localhost:8080/api/test
-> http://dev.com/api/test
http://localhost:8080/test
-> http://dev.com/test
1 | devServer: { |
常用的devServer配置
- devServer.disableHostCheck
当设置为true
时,此选项将绕过主机检查。不建议这样做,因为不检查主机的应用程序容易受到DNS重新绑定攻击。
1 | devServer: { |
- devServer.publicPath
假设服务器在http://localhost:8080
下运行,output.filename
设置为bundle.js
。默认情况下,devServer.publicPath
是/
,所以你的包可以作为http://localhost:8080/bundle.js
使用。将devServer.publicPath
更改为 /assets/
就变为 http://localhost:8080/assets/bundle.js
1 | devServer: { |
确保devServer.publicPath始终以正斜杠开头和结尾。
常用vue/cli3的配置