目的:使用vue-cli搭建的项目在开发时配置跨域,上线后不做任何任何修改,接口也可以访问
1.开发环境设置跨域
- 使用工具:vue-cli自带的配置
- 在config > index.js 文件中的proxyTable里边添加’/api’配置
- 后台接口:http://47.102.123.133:8080/infintyshop
proxyTable: {
'/api': {
// 跨域域名
target: 'http://47.102.123.133:8080/infintyshop',//后台api
// 是否跨域
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
在vue组件中使用
this.$axios.get('/api/queryAll?productId='+this.productId)//相当于
this.$axios.get('http://47.102.123.133:8080/infintyshop/queryAll?productId='+this.productId)
- 需要重新运行项目,不然会报错
- 重新运行项目后本地开发就不会出现跨域问题了。
- 当项目打包,放到服务器上,会报错
- 这样就存在一个问题,你的接口都是/api开头的,打包之后部署到服务器要去除/api,才能正常访问后台接口,如何解决呢?
2.生产环境设置跨域
思路
解决的思路是这样的:
- 首先,axios的默认实例有一个baseURL的属性,配置了baseURL之后,你访问接口时就会自动带上
- 假设你vue-cli起了一个开发环境,地址为http://localhost:8080
//例1 当不设置baseURL时
axios.get('/user') //访问/user相当于访问 http://localhost:8080/user
//例2
axios.defaults.baseURL='/api'
axios.get('/user') //访问/user就相当于访问 http://localhost:8080/api/user
然后我们要根据现在的环境是开发环境还是生产环境,配置不同的baseURL
//判断是否是生产环境
var isPro = process.env.NODE_ENV === 'production' //process.env.NODE_ENV用于区分是生产环境还是开发环境
//配置不同的baseURL
module.exports = {
baseURL: isPro ? 'http://sbsb.com:8888/' : '/api'
}
process.env.NODE_ENV用于区分是生产环境还是开发环境,这个值是webpack设置的
动手操作
- 假设后台api是http://47.102.123.133:8080/infintyshop
- 首先在/config目录下新建一个文件,我这里叫api.config.js
写入以下代码
//判断是否是生产环境
var isPro = process.env.NODE_ENV === 'production' //process.env.NODE_ENV用于区分是生产环境还是开发环境
//根据环境不同导出不同的baseURL
module.exports = {
baseURL: isPro ? 'http://47.102.123.133:8080/infintyshop' : '/api'
}
- 然后,在main.js中引入axios和api.config.js
//main.js
import Vue from 'vue'
import axios from 'axios'
import apiConfig from '../config/api.config.js'
axios.defaults.baseURL=apiConfig.baseURL
//axios的其他配置...
这样配置之后,打包部署到服务器上也不用再手工去除/apis
在vue组件中使用
this.$axios.get('/queryAll?productId='+this.productId)
this.$axios.get('/api/queryAll?productId='+this.productId)//开发环境相当于这个
this.$axios.get('http://47.102.123.133:8080/infintyshop/queryAll?productId='+this.productId)//生产环境相当于这个