Vite前端API调用与本地开发代理配置策略详解

 更新时间:2025年12月30日 08:48:08   作者:nvd11  
本文详细介绍了如何在前端代码中使用相对路径定义后端API URL,并通过Vite开发服务器的代理配置,解决了跨域资源共享(CORS)问题和环境差异问题,通过这套组合方案,实现了同一份前端代码在本地开发和生产环境下的无缝运行

本文档详细描述了本项目在前端代码中定义后端 API URL 的风格,以及如何配置 Vite 开发服务器的代理(Proxy),并解释这套组合方案解决了哪些关键问题。

一、 核心问题

现代 Web 开发中,前端应用(运行在浏览器)和后端 API(运行在服务器)通常是分离的。这会带来两个主要问题:

  • 跨域资源共享 (CORS):在本地开发时,前端运行在 http://localhost:5173,而后端 API 运行在云端的 https://gateway.jpgcp.cloud。由于源(协议、域名、端口)不同,浏览器会出于安全策略,默认阻止前端直接调用后端 API。
  • 环境差异:前端代码需要一种方法,既能在本地开发时正确调用云端 API,又能在部署到生产环境后,正确地调用生产环境的 API,而不需要每次都手动修改代码。

二、 解决方案:“相对路径” + “Vite 代理”

我们采用了一套标准的、优雅的组合方案来解决以上所有问题。

1. API URL 风格:使用相对路径

我们修改了 src/services/api.ts 文件,将 API 的 URL 定义为一个相对路径

代码 (src/services/api.ts):

// The URL of your backend API. Using a relative path works for both
// local development (with proxy) and production deployment.
const API_URL = '/chat-api-svc/api/v1/chat';

// ...
const response = await fetch(API_URL, { ... });

原理与优势:

  • 当 URL 以 / 开头时,浏览器会自动将当前页面的协议和域名加在它的前面。
  • 在生产环境: 页面在 https://gateway.jpgcp.cloud/chat/,请求就会发往 https://gateway.jpgcp.cloud/chat-api-svc/api/v1/chat。这正好能匹配上我们 GKE Gateway 中的路由规则,实现了同源调用,没有 CORS 问题
  • 在本地开发环境: 页面在 http://localhost:5173/chat/,请求就会发往 http://localhost:5173/chat-api-svc/api/v1/chat。这个地址本身是无效的,但它为我们的第二步——Vite 代理——创造了条件。

2. Vite 代理配置

为了让本地开发时的 API 请求能成功,我们配置了 Vite 的开发服务器,让它充当一个代理。

配置 (vite.config.ts):

// ...
export default defineConfig({
  // ...
  server: {
    host: true,
    // This proxy configuration is for the local development server ONLY.
    proxy: {
      // 当开发服务器收到一个以 '/chat-api-svc' 开头的请求时...
      '/chat-api-svc': {
        // ...就将它转发给这个目标地址。
        target: 'https://gateway.jpgcp.cloud',
        // 改变请求的 Origin 头,对于 HTTPS 和虚拟主机托管是必需的。
        changeOrigin: true,
      },
    },
  },
  // ...
})

原理与优势:

  • 这个 server.proxy 配置仅在 npm run dev 时生效,对生产构建没有影响。
  • 它告诉 Vite:“你就是中间人。所有发给你的、路径以 /chat-api-svc 开头的请求,都不要自己处理,而是原封不动地转发给 https://gateway.jpgcp.cloud,然后再把那边的响应拿回来,交给浏览器。”
  • 对于浏览器来说,它始终认为自己是在和 localhost:5173 通信,因此完全规避了 CORS 问题

三、 总结

通过**“前端使用相对路径”“本地开发环境使用代理”**这套组合拳,我们实现了:

  • 一套代码,两种环境无缝运行:同一份前端代码,无需任何修改,既可以在本地开发时调用云端 API,也可以在部署后调用生产环境的网关。
  • 彻底解决 CORS 问题:无论是本地还是生产,从浏览器的视角来看,API 调用都是同源的。
  • 配置清晰,易于维护:API 的真实地址只存在于一处(Vite 的代理配置中),便于未来修改。生产环境的路由则完全由 GKE Gateway 的配置来管理。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • ElementUi中select框在页面滚动时el-option超出元素区域的问题解决

    ElementUi中select框在页面滚动时el-option超出元素区域的问题解决

    本文主要介绍了ElementUi中select框在页面滚动时el-option超出元素区域的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • vue中插槽(slot)几种类型的使用方法

    vue中插槽(slot)几种类型的使用方法

    本文主要介绍了vue中插槽(slot)几种类型的使用方法,主要分三种,默认插槽,具名插槽,作用域插槽,下面就来一起介绍一下,感兴趣的可以了解一下
    2024-03-03
  • vue中实现打印功能的几种方法示例

    vue中实现打印功能的几种方法示例

    这篇文章主要给大家介绍了关于vue中实现打印功能的几种方法,打印功能在实际开发中非常常见,通常我们需要将网页中的某一部分或整个网页打印出来,需要的朋友可以参考下
    2023-09-09
  • antd的select下拉框因为数据量太大造成卡顿的解决方式

    antd的select下拉框因为数据量太大造成卡顿的解决方式

    这篇文章主要介绍了antd的select下拉框因为数据量太大造成卡顿的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Vue项目中使用jquery的简单方法

    Vue项目中使用jquery的简单方法

    这篇文章主要给大家介绍了关于Vue项目中使用jquery的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • vue动态路由加载时出现Cannot find module xxx问题

    vue动态路由加载时出现Cannot find module xxx问题

    这篇文章主要介绍了vue动态路由加载时出现Cannot find module xxx问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • vue 指定组件缓存实例详解

    vue 指定组件缓存实例详解

    keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。这篇文章主要介绍了vue 指定组件缓存,需要的朋友可以参考下
    2018-04-04
  • vue使用video.js进行视频播放功能

    vue使用video.js进行视频播放功能

    video.js是一个拥有h5背景的网络视频播放器,同时支持h5以及Flash视频播放,这篇文章主要介绍了vue中使用video.js进行视频播放,需要的朋友可以参考下
    2019-07-07
  • Vue3实现markdown-it支持chartjs、Echartjs、mermaid的渲染(附实例代码)

    Vue3实现markdown-it支持chartjs、Echartjs、mermaid的渲染(附实例代码)

    markdown-it-vue使用markdown-it作为Markdown数据解析引擎,整合多种markdown-it插件,并内置了一些自己的功能性插件,这篇文章主要介绍了Vue3实现markdown-it支持chartjs、Echartjs、mermaid渲染的相关资料,需要的朋友可以参考下
    2025-08-08
  • Element Carousel 走马灯的具体实现

    Element Carousel 走马灯的具体实现

    这篇文章主要介绍了Element Carousel 走马灯的具体实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论