Vite前端API調(diào)用與本地開發(fā)代理配置策略詳解
本文檔詳細(xì)描述了本項(xiàng)目在前端代碼中定義后端 API URL 的風(fēng)格,以及如何配置 Vite 開發(fā)服務(wù)器的代理(Proxy),并解釋這套組合方案解決了哪些關(guān)鍵問題。
一、 核心問題
現(xiàn)代 Web 開發(fā)中,前端應(yīng)用(運(yùn)行在瀏覽器)和后端 API(運(yùn)行在服務(wù)器)通常是分離的。這會(huì)帶來兩個(gè)主要問題:
- 跨域資源共享 (CORS):在本地開發(fā)時(shí),前端運(yùn)行在
http://localhost:5173,而后端 API 運(yùn)行在云端的https://gateway.jpgcp.cloud。由于源(協(xié)議、域名、端口)不同,瀏覽器會(huì)出于安全策略,默認(rèn)阻止前端直接調(diào)用后端 API。 - 環(huán)境差異:前端代碼需要一種方法,既能在本地開發(fā)時(shí)正確調(diào)用云端 API,又能在部署到生產(chǎn)環(huán)境后,正確地調(diào)用生產(chǎn)環(huán)境的 API,而不需要每次都手動(dòng)修改代碼。
二、 解決方案:“相對(duì)路徑” + “Vite 代理”
我們采用了一套標(biāo)準(zhǔn)的、優(yōu)雅的組合方案來解決以上所有問題。
1. API URL 風(fēng)格:使用相對(duì)路徑
我們修改了 src/services/api.ts 文件,將 API 的 URL 定義為一個(gè)相對(duì)路徑。
代碼 (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, { ... });
原理與優(yōu)勢(shì):
- 當(dāng) URL 以
/開頭時(shí),瀏覽器會(huì)自動(dòng)將當(dāng)前頁(yè)面的協(xié)議和域名加在它的前面。 - 在生產(chǎn)環(huán)境: 頁(yè)面在
https://gateway.jpgcp.cloud/chat/,請(qǐng)求就會(huì)發(fā)往https://gateway.jpgcp.cloud/chat-api-svc/api/v1/chat。這正好能匹配上我們 GKE Gateway 中的路由規(guī)則,實(shí)現(xiàn)了同源調(diào)用,沒有 CORS 問題。 - 在本地開發(fā)環(huán)境: 頁(yè)面在
http://localhost:5173/chat/,請(qǐng)求就會(huì)發(fā)往http://localhost:5173/chat-api-svc/api/v1/chat。這個(gè)地址本身是無效的,但它為我們的第二步——Vite 代理——創(chuàng)造了條件。
2. Vite 代理配置
為了讓本地開發(fā)時(shí)的 API 請(qǐng)求能成功,我們配置了 Vite 的開發(fā)服務(wù)器,讓它充當(dāng)一個(gè)代理。
配置 (vite.config.ts):
// ...
export default defineConfig({
// ...
server: {
host: true,
// This proxy configuration is for the local development server ONLY.
proxy: {
// 當(dāng)開發(fā)服務(wù)器收到一個(gè)以 '/chat-api-svc' 開頭的請(qǐng)求時(shí)...
'/chat-api-svc': {
// ...就將它轉(zhuǎn)發(fā)給這個(gè)目標(biāo)地址。
target: 'https://gateway.jpgcp.cloud',
// 改變請(qǐng)求的 Origin 頭,對(duì)于 HTTPS 和虛擬主機(jī)托管是必需的。
changeOrigin: true,
},
},
},
// ...
})
原理與優(yōu)勢(shì):
- 這個(gè)
server.proxy配置僅在npm run dev時(shí)生效,對(duì)生產(chǎn)構(gòu)建沒有影響。 - 它告訴 Vite:“你就是中間人。所有發(fā)給你的、路徑以
/chat-api-svc開頭的請(qǐng)求,都不要自己處理,而是原封不動(dòng)地轉(zhuǎn)發(fā)給https://gateway.jpgcp.cloud,然后再把那邊的響應(yīng)拿回來,交給瀏覽器。” - 對(duì)于瀏覽器來說,它始終認(rèn)為自己是在和
localhost:5173通信,因此完全規(guī)避了 CORS 問題。
三、 總結(jié)
通過**“前端使用相對(duì)路徑”和“本地開發(fā)環(huán)境使用代理”**這套組合拳,我們實(shí)現(xiàn)了:
- 一套代碼,兩種環(huán)境無縫運(yùn)行:同一份前端代碼,無需任何修改,既可以在本地開發(fā)時(shí)調(diào)用云端 API,也可以在部署后調(diào)用生產(chǎn)環(huán)境的網(wǎng)關(guān)。
- 徹底解決 CORS 問題:無論是本地還是生產(chǎn),從瀏覽器的視角來看,API 調(diào)用都是同源的。
- 配置清晰,易于維護(hù):API 的真實(shí)地址只存在于一處(Vite 的代理配置中),便于未來修改。生產(chǎn)環(huán)境的路由則完全由 GKE Gateway 的配置來管理。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)圖片預(yù)覽組件封裝與使用
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)圖片預(yù)覽組件封裝與使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
vue2.0項(xiàng)目集成Cesium的實(shí)現(xiàn)方法
這篇文章主要介紹了vue2.0項(xiàng)目集成Cesium的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
vue實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能(完整代碼)
驗(yàn)證碼功能在我們的身邊用處極廣,今天小編給大家分享基于vue實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能,感興趣的朋友跟隨小編一起看看吧2019-12-12
基于 Vue.js 之 iView UI 框架非工程化實(shí)踐記錄(推薦)
為了快速體驗(yàn) MVVM 模式,我選擇了非工程化方式來起步,并選擇使用 Vue.js,以及基于它構(gòu)建的 iView UI 框架。本文給大家分享基于 Vue.js 之 iView UI 框架非工程化實(shí)踐記錄,需要的朋友參考下吧2017-11-11
vue導(dǎo)出excel和echart圖形分別在不同工作表的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了如何使用vue實(shí)現(xiàn)導(dǎo)出excel和echart圖形分別在不同工作表,文中有詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-10-10
vue路由前進(jìn)后退動(dòng)畫效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue路由前進(jìn)后退動(dòng)畫效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12
vue實(shí)現(xiàn)聊天框自動(dòng)滾動(dòng)的示例代碼
本文主要介紹了vue實(shí)現(xiàn)聊天框自動(dòng)滾動(dòng)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05

