如何在vue里面优雅的解决跨域(路由冲突问题)


Posted in Javascript onJanuary 20, 2019

如何在vue里面优雅的解决跨域,路由冲突问题

当我们在路由里面配置成以下代理可以解决跨域问题

proxyTable: {
   '/goods/*': {
    target: 'http://localhost:3000'
   },
   '/users/*': {
    target: 'http://localhost:3000'
   }
  },

这种配置方式在一定程度上解决了跨域问题,但是会带来一些问题,

比如我们的vue 路由 也命名为 goods,这时候就会产生了冲突,

如果项目中接口很多,都在这里配置是很麻烦的,也容易产生路由冲突。

正确的姿势

如果把所有的接口,统一规范为一个入口,在一定程度上会解决冲突

把以上配置统一前面加上 /api/

proxyTable: {
   '/api/**': {
    target: 'http://localhost:3000'
   },
  },

如果我们配置成这种方式,在使用http请求的时候就会发生变化,会在请求前面加上一个api,相对路由也会发生变化,也会在接口前面加上api,这样也会很麻烦,我们可以使用以下方式来解决这个问题

proxyTable: {
   '/api/**': {
    target: 'http://localhost:3000',
    pathRewrite:{
     '^/api':'/'
    }
   },
  },

上面这个代码,就是把咱们虚拟的这个api接口,去掉,此时真正去后端请求的时候,不会加上api这个前缀了,那么这样我们前台http请求的时候,还必须加上api前缀才能匹配到这个代理,代码如下:

logout(){
  axios.post('/api/users/logout').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 },
 getGoods(){
  axios.post('/api/goods/list').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 }

我们可以利用axios的baseUrl直接默认值是 api,这样我们每次访问的时候,自动补上这个api前缀,就不需要我们自己手工在每个接口上面写这个前缀了

在入口文件里面配置如下:

import Axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, Axios)
Axios.defaults.baseURL = 'api'

如果这配置 'api/' 会默认读取本地的域

上面这样配置的话,不会区分生产和开发环境

在config 文件夹里面新建一个 api.config.js 配置文件

const isPro = Object.is(process.env.NODE_ENV, 'production')

module.exports = {
 baseUrl: isPro ? 'http://www.vnshop.cn/api/' : 'api/'
}

然后在main.js 里面引入,这样可以保证动态的匹配生产和开发的定义前缀

import apiConfig from '../config/api.config'

import Axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, Axios)
Axios.defaults.baseURL = apiConfig.baseUrl

经过上面配置后,在dom里面可以这样轻松的访问,也不需要在任何组件里面引入axios模块了。

logout(){
  this.$http.post('/users/logout').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 },
 getGoods(){
  this.$http.post('/goods/list').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 }

最终代码

在代理里面配置
 

proxyTable: {
   '/api/**': {
    target: 'http://localhost:3000',
    pathRewrite:{
     '^/api':'/'
    }
   },
  },

在config里面的api.config.js 配置

在config 文件夹里面新建一个 api.config.js 配置文件

const isPro = Object.is(process.env.NODE_ENV, 'production')

module.exports = {
 baseUrl: isPro ? 'http://www.vnshop.cn/api/' : 'api/'
}

关于生产和开发配置不太了解

可以去 dev-server.js 里面看配置代码

const webpackConfig = (process.env.NODE_ENV === 'testing' || process.env.NODE_ENV === 'production') ?
 require('./webpack.prod.conf') :
 require('./webpack.dev.conf')

在main.js 入口文件里面配置

import apiConfig from '../config/api.config'

import Axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, Axios)
Axios.defaults.baseURL = apiConfig.baseUrl
在dom里面请求api的姿势
 logout(){
  this.$http.post('/users/logout').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 },
 getGoods(){
  this.$http.post('/goods/list').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 }

vuejs项目生产环境,上线解决跨域问题,请看以下文章

vue项目上线 看看这个文章,专门讲上线的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery循环滚动图片代码
Dec 08 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
May 27 Javascript
JS获取IP、MAC和主机名的五种方法
Nov 14 Javascript
javascript实现动态模态绑定grid过程代码
Sep 22 Javascript
JQuery插入DOM节点的方法
Jun 11 Javascript
详解在 Angular 项目中添加 clean-blog 模板
Jul 04 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
Sep 01 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
Sep 13 Javascript
javascript中函数的写法实例代码详解
Oct 28 Javascript
Javascript地址引用代码实例解析
Feb 25 Javascript
原生JavaScript实现刮刮乐
Sep 29 Javascript
原生js实现自定义消息提示框
Nov 19 Javascript
JavaScript禁用右键单击优缺点分析
Jan 20 #Javascript
JavaScript中concat复制数组方法浅析
Jan 20 #Javascript
JavaScript中import用法总结
Jan 20 #Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 #Javascript
js序列化和反序列化的使用讲解
Jan 19 #Javascript
vue-router传参用法详解
Jan 19 #Javascript
vue-router实现嵌套路由的讲解
Jan 19 #Javascript
You might like
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
JQuery1.6 使用方法三
2011/11/23 Javascript
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
JS设计模式之命令模式概念与用法分析
2018/02/06 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
python查找目录下指定扩展名的文件实例
2015/04/01 Python
用Python实现换行符转换的脚本的教程
2015/04/16 Python
python K近邻算法的kd树实现
2018/09/06 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
Python3.7安装keras和TensorFlow的教程图解
2020/06/18 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
你对IPv6了解程度
2016/02/09 面试题
致长跑运动员加油稿
2014/02/20 职场文书
工商干部先进事迹
2014/05/14 职场文书
中学后勤工作总结2015
2015/07/22 职场文书