Vue —— 进阶 AJAX(解决开发环境 Ajax 跨域问题)

简介: Vue —— 进阶 AJAX(解决开发环境 Ajax 跨域问题)

Vue 脚手架配置代理

一、方法一(只能代理一个服务器的情况)

1. 配置

在 vue.config.js 中添加如下:

  devServer: {
    proxy: 'http://localhost:5000'  
  }
2. 说明
  1. 优点:配置简单,请求资源时直接发给前端(8080)即可。
  2. 缺点:不能配置多个代理,不能灵活的控制请求是否走代理。
  3. 工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器(优先匹配前端资源)。
3. 实例
  1. 准备好 server1.js 服务器文件,当前文件夹下通过在 cmd 中键入 node server1 启动服务器,并在浏览器中打开。

6b89e9abcb304cdd8e156eec11b64cb8.png

  1. vue.config.js 中配置
    module.exports = {
      pages: {
        index: {
          // 入口
          entry: 'src/main.js',
        },
      },
      lintOnSave: false, //关闭语法检查
      // 开启代理服务器 (方式一)
      devServer: {
        proxy: 'http://localhost:5000'
      }
    }
  1. App.vue 获取学生的信息。需要提前在终端键入 npm i axios 安装 axios,并导入使用。
    <template>
      <div>
        <button @click="getStudents">获取学生信息</button>
      </div>
    </template>
    <script>
    import axios from "axios";
    export default {
      name: "App",
      methods: {
        getStudents() {
          axios.get("http://localhost:8080/students").then(
            (response) => {
              console.log("请求成功了", response.data);
            },
            (error) => {
              console.log("请求失败了", error.message);
            }
          );
        },
      },
    };
    </script>
  1. 2fe82dbeba9041beb1a142ef2136f159.png

二、方法二(可以代理多个服务器的情况)

1. 配置

在 vue.config.js 中添加如下:

    module.exports = {
      pages: {
        index: {
          // 入口
          entry: 'src/main.js',
        },
      },
      lintOnSave: false, //关闭语法检查
    // 开启代理服务器 (方式二)
    devServer: {
      proxy: {
        '/api1': { //匹配所有以 /api1 开头的请求路径
            target: 'http://localhost:5000', //代理目标的基础路径
            pathRewrite: {'^/demo': ''}, //去掉请求头匹配目标地址
            ws: true, //用于支持 websocket
            changeOrigin: true //用于控制请求头中的 host值
          }
        }
      }
    }

注意:


changeOrigin 设置为 true 时,服务器收到的请求头中的 host 为:localhost: 5000

changeOrigin 设置为 false 时,服务器收到的请求头中的 host 为:localhost: 8000

changeOrigin 默认值为 true

2. 说明
  1. 优点:可以配置多个代理,且可以灵活的控制请求是否走代理。
  2. 缺点:配置略微繁琐,请求资源时必须加前缀。
3. 实例
  1. 准备好 server1.js 和 server2.js 服务器文件,当前文件夹下通过在 cmd 中键入 node server1 启动服务器 server1,通过键入 node server2 启动服务器 server2,并在浏览器中打开。

6b89e9abcb304cdd8e156eec11b64cb8.png

31fb178d39724dae872ee2c6b8153592.png

  1. vue.config.js 中配置
  module.exports = {
    pages: {
      index: {
        // 入口
        entry: 'src/main.js',
      },
    },
    lintOnSave: false, //关闭语法检查
    // 开启代理服务器 (方式二)
    devServer: {
      proxy: {
        // /api:请求前缀
        '/demo': {
          target: 'http://localhost:5000',
          pathRewrite: {
            '^/demo': ''
          }, //去掉请求头匹配目标地址
          ws: true, //用于支持 websocket
          changeOrigin: true //用于控制请求头中的 host值
        },
        '/test': {
          target: 'http://localhost:5001',
          pathRewrite: {
            '^/test': ''
          }, //去掉请求头匹配目标地址
          ws: true, //用于支持 websocket
          changeOrigin: true //用于控制请求头中的 host值
        }
      }
    }
  }
  1. App.vue 获取学生和汽车的信息。
    <template>
      <div>
        <button @click="getStudents">获取学生信息</button>
        <button @click="getCars">获取汽车信息</button>
      </div>
    </template>
  <script>
  import axios from "axios";
  export default {
    name: "App",
    methods: {
      getStudents() {
        axios.get("http://localhost:8080/demo/students").then(
          (response) => {
            console.log("请求成功了", response.data);
          },
          (error) => {
            console.log("请求失败了", error.message);
          }
        );
      },
      getCars() {
        axios.get("http://localhost:8080/test/cars").then(
          (response) => {
            console.log("请求成功了", response.data);
          },
          (error) => {
            console.log("请求失败了", error.message);
          }
        );
      }
    },
  };

742ace8d209640769297950b347ee6bd.png

三、注意事项

方法一虽然配置简单,但一次只能代理 一个 服务器。方法二一次可以代理 多个 服务器。

vue.config.js 中配置的地址是 500x(5050),在 App.vue 中 axios 通过 get 得到的地址是 808x(8080)。

方法二在配置过程中,要对请求头通过正则表达式进行 重写,这样可以去掉 axios 请求地址的请求前缀,才能正确匹配。

不积跬步无以至千里 不积小流无以成江海

相关文章
|
22天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
8天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
9天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
9天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
9天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
8天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
10天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
8天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
10天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
15天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发