同源策略,跨域,不管是工作还是面试都是不可回避的问题,在vue cli中,是如何来解决跨域问题的?
vue cli 可以在 vue.config.js 中配置 webpack 相关信息,可以利用 webpack 请求代理来解决此问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   |  module.exports = {   runtimeCompiler: true,   publicPath: '/',    devServer: {               proxy: {       '/api': {         target: 'http://127.0.0.1:8100/',          changeOrigin: true,         ws: true,         pathRewrite: {           '^/api': ''         }       }     }   }, }
 
  | 
 
接下来配置 axios 请求;
1 2 3 4 5 6 7 8 9 10
   |  axios.defaults.timeout = 5000   axios.defaults.baseURL = '/api/'  
 
  axios.post('/postData/', {       name: 'cedric', }).then((res) => {   console.log(res.data) })
 
  | 
 
生产环境下,只需要修改 axios 配置即可,其余不需要改变;
1 2 3 4 5 6 7 8 9 10
   |  axios.defaults.timeout = 5000  axios.defaults.baseURL = 'http://api.demourl.com/'
 
  axios.post('/postData/', {     name: 'cedric', }).then((res) => {   console.log(res.data) })
 
  | 
 
再补充一个 axios 配置时候遇到的一个小问题,在调用后台 delete 方法的时候总是报403/401的错误,究其原因,是在配置 axios 请求头的时候把 token 用这种方式给写死了,这就导致传到后台的 token 还是上一次的旧 token
1
   | axios.defaults.headers['token'] = sessionStorage.getItem('token');
  | 
 
解决办法是需进行请求拦截,这样就可以获取到实时的 token 了
1 2 3 4 5
   | axios.interceptors.request.use(req =>{   let token = sessionStorage.getItem('token') || '';   req.headers.common['token'] = token   return req; })
  |