最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue解決開發(fā)環(huán)境Ajax跨域問題的多種方法對比

 更新時間:2025年11月03日 09:56:17   作者:咖啡の貓  
本文將帶大家深入理解跨域原理,并提供 Vue CLI(webpack)和 Vite 兩種構(gòu)建工具下的完整解決方案,讓大家的開發(fā)流程更順暢,希望對大家有所幫助

一、前言

在 Vue 項目開發(fā)中,我們經(jīng)常會遇到這樣的報錯:

Access to XMLHttpRequest at 'http://api.example.com/login' 
from origin 'http://localhost:8080' has been blocked by CORS policy: 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

這就是典型的 跨域請求被瀏覽器攔截。

雖然生產(chǎn)環(huán)境中通常由后端配置 CORS 或 Nginx 反向代理解決,但在本地開發(fā)階段,前后端往往獨立運行(前端 localhost:8080,后端 localhost:3000),如何優(yōu)雅地繞過跨域限制?

本文將帶你深入理解跨域原理,并提供 Vue CLI(webpack)和 Vite 兩種構(gòu)建工具下的完整解決方案,讓你的開發(fā)流程更順暢。

二、什么是跨域?為什么會出現(xiàn)?

同源策略(Same-Origin Policy)

瀏覽器出于安全考慮,實施了“同源策略”:只有 協(xié)議(protocol)、域名(host)、端口(port) 完全相同,才允許訪問彼此的資源。

當前頁面請求地址是否跨域原因
http://localhost:8080http://localhost:8080/api? 不跨域同協(xié)議、同域名、同端口
http://localhost:8080http://localhost:3000/api? 跨域端口不同
http://localhost:8080https://localhost:8080/api? 跨域協(xié)議不同
http://localhost:8080http://api.dev.com:8080? 跨域域名不同

瀏覽器會阻止 JavaScript 發(fā)起跨域請求,除非服務端明確允許(CORS)。

三、開發(fā)環(huán)境 vs 生產(chǎn)環(huán)境的區(qū)別

環(huán)境特點跨域解決方案
開發(fā)環(huán)境前后端分離,本地啟動使用 開發(fā)服務器代理(Proxy)
生產(chǎn)環(huán)境部署在同一域名下通過 Nginx 反向代理或后端開啟 CORS

重點:本文聚焦 開發(fā)環(huán)境 的跨域解決!

四、解決方案 1:Vue CLI / webpack-dev-server 代理(推薦)

如果你使用的是 Vue CLI 創(chuàng)建的項目(基于 webpack),可以通過配置 vue.config.js 實現(xiàn)請求代理。

1. 創(chuàng)建vue.config.js

在項目根目錄創(chuàng)建文件 vue.config.js

// vue.config.js
const { defineConfig } = require('@vue/cli-service')

module.exports = defineConfig({
  devServer: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000', // 后端服務地址
        changeOrigin: true,               // 修改請求頭中的 origin
        secure: false,                    // 支持 https 目標
        pathRewrite: {
          '^/api': ''                     // 重寫路徑,去掉 /api 前綴
        }
      }
    }
  }
})

2. 前端代碼中發(fā)起請求

// 原本請求:http://localhost:3000/user/login
// 現(xiàn)在只需請求:/api/user/login

axios.post('/api/user/login', { username, password })
  .then(res => console.log(res.data))

3. 工作原理圖解

前端代碼 → http://localhost:8080
           ↓ (瀏覽器)
axios.post('/api/user/login')
           ↓
Vue DevServer 攔截以 /api 開頭的請求
           ↓
轉(zhuǎn)發(fā)到真實后端 → http://localhost:3000/user/login
           ↓
返回響應 → 再由 DevServer 返回給前端

優(yōu)點

  • 前端無需關(guān)心真實后端地址
  • 完美繞過瀏覽器跨域限制
  • 配置簡單,一行代碼搞定

五、解決方案 2:Vite 項目代理(適用于 Vue 3 + Vite)

如果你使用的是 Vite 構(gòu)建的 Vue 項目(如 create-vuevite create),配置方式略有不同。

1. 修改vite.config.js

// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '') // Vite 中用 rewrite
      }
    }
  }
})

注意:Vite 中使用 rewrite 而不是 pathRewrite。

2. 前端請求方式不變

axios.get('/api/users') // 自動代理到 http://localhost:3000/users

六、進階配置:多接口前綴代理

如果項目需要對接多個后端服務,可以配置多個代理規(guī)則:

// vue.config.js 或 vite.config.js
proxy: {
  '/api': {
    target: 'http://localhost:3000',
    changeOrigin: true,
    pathRewrite: { '^/api': '' }
  },
  '/upload': {
    target: 'http://upload.service.com',
    changeOrigin: true
  },
  '/mock': {
    target: 'https://mockapi.com',
    changeOrigin: true,
    secure: false
  }
}

示例:

  • /api/users → http://localhost:3000/users
  • /upload/file → http://upload.service.com/file
  • /mock/data → https://mockapi.com/mock/data

七、其他方案對比(不推薦用于開發(fā))

方案是否推薦說明
JSONP?僅支持 GET,已被時代淘汰
CORS 后端配置?? 有條件需后端配合,開發(fā)期可能無法修改
瀏覽器禁用安全策略?危險操作,影響系統(tǒng)安全
自己起一個中間 Node 服務?? 復雜小題大做,不如用代理

結(jié)論開發(fā)服務器代理是最佳選擇!

八、常見問題與解決方案

問題 1:代理后接口 404?

原因pathRewrite 配置錯誤,路徑未正確轉(zhuǎn)發(fā)。

解決

  • 檢查 target 地址是否可達
  • 打開瀏覽器 Network,查看實際請求 URL
  • 確保 changeOrigin: true

問題 2:WebSocket 也能代理嗎?

可以!Vite 和 webpack 都支持 WebSocket 代理:

proxy: {
  '/ws': {
    target: 'ws://localhost:8080',
    ws: true,
    changeOrigin: true
  }
}

問題 3:代理后 Cookie/Sessions 丟失?

原因:跨域時 Cookie 默認不攜帶。

解決

前端請求設置 withCredentials: true

axios.defaults.withCredentials = true

后端響應頭需允許:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:8080  # 不能為 *

九、生產(chǎn)環(huán)境部署建議

開發(fā)期用代理,上線后怎么辦

推薦方案:Nginx 反向代理

server {
    listen 80;
    server_name yourdomain.com;

    # 前端靜態(tài)資源
    location / {
        root /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
    }

    # API 代理到后端
    location /api/ {
        proxy_pass http://backend-server:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

這樣前后端共用同一域名,徹底解決跨域問題。

十、總結(jié)

工具配置文件核心配置
Vue CLI (webpack)vue.config.jsdevServer.proxy
Vitevite.config.jsserver.proxy
生產(chǎn)環(huán)境Nginxlocation + proxy_pass

開發(fā)環(huán)境跨域三步走

  • 確定后端接口地址(如 http://localhost:3000
  • 在 vue.config.js 或 vite.config.js 中配置代理
  • 前端請求統(tǒng)一加前綴(如 /api

到此這篇關(guān)于Vue解決開發(fā)環(huán)境Ajax跨域問題的多種方法對比的文章就介紹到這了,更多相關(guān)Vue解決Ajax跨域問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Vue中延遲執(zhí)行某個函數(shù)的實現(xiàn)方式

    在Vue中延遲執(zhí)行某個函數(shù)的實現(xiàn)方式

    在Vue中延遲執(zhí)行某個函數(shù),你可以使用setTimeout()函數(shù)或者Vue提供的生命周期鉤子函數(shù),本文通過一些示例代碼給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • vue-cli2.x項目優(yōu)化之引入本地靜態(tài)庫文件的方法

    vue-cli2.x項目優(yōu)化之引入本地靜態(tài)庫文件的方法

    這篇文章主要介紹了vue-cli2.x項目優(yōu)化之引入本地靜態(tài)庫文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Vue組件之間數(shù)據(jù)共享淺析

    Vue組件之間數(shù)據(jù)共享淺析

    本文章向大家介紹vue組件中的數(shù)據(jù)共享,主要包括vue組件中的數(shù)據(jù)共享使用實例、應用技巧、基本知識點總結(jié)和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下
    2022-11-11
  • 從0到1搭建element后臺框架優(yōu)化篇(打包優(yōu)化)

    從0到1搭建element后臺框架優(yōu)化篇(打包優(yōu)化)

    這篇文章主要介紹了從0到1搭建element后臺框架優(yōu)化篇(打包優(yōu)化),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • vue中定義全局聲明vscode插件提示找不到問題解決

    vue中定義全局聲明vscode插件提示找不到問題解決

    這篇文章主要為大家介紹了vue中定義全局聲明vscode插件提示找不到問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Vue3使用md-editor-v3的實例解讀markdown文本

    Vue3使用md-editor-v3的實例解讀markdown文本

    本文介紹了如何在Vue3項目中使用md-editor-v3實現(xiàn)Markdown編輯器,包括基礎實現(xiàn)、工具欄自定義、預覽功能以及擴展功能
    2026-01-01
  • vue.js實現(xiàn)簡單輪播圖效果

    vue.js實現(xiàn)簡單輪播圖效果

    這篇文章主要為大家詳細介紹了vue.js實現(xiàn)簡單輪播圖效果的相關(guān)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Vue對象的單層劫持圖文詳細講解

    Vue對象的單層劫持圖文詳細講解

    這篇文章主要介紹了vue2.x對象單層劫持的原理實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • ElementUI修改實現(xiàn)更好用圖片上傳預覽組件

    ElementUI修改實現(xiàn)更好用圖片上傳預覽組件

    這篇文章主要為大家介紹了ElementUI修改實現(xiàn)更好用圖片上傳預覽組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • js 實現(xiàn)拖拽排序詳情

    js 實現(xiàn)拖拽排序詳情

    這篇文章主要介紹了js 實現(xiàn)拖拽排序,拖拽排序?qū)τ谛』锇閭儊碚f應該不陌生,平時工作的時候,可能會選擇使用類似Sortable.js這樣的開源庫來實現(xiàn)需求。但在完成需求后,大家有沒有沒想過拖拽排序是如何實現(xiàn)的呢?感興趣得話一起來看看下面文章得小心內(nèi)容吧
    2021-11-11

最新評論

竹北市| 蓬莱市| 米林县| 上饶县| 宜兰市| 柳林县| 桑日县| 马关县| 顺平县| 乃东县| 浙江省| 叙永县| 新竹县| 长宁区| 梅州市| 板桥市| 临潭县| 额尔古纳市| 十堰市| 昌吉市| 阿坝| 禄劝| 桓台县| 休宁县| 合作市| 临安市| 班戈县| 遵义县| 德兴市| 大竹县| 宜阳县| 浦东新区| 库尔勒市| 天柱县| 巨野县| 平邑县| 堆龙德庆县| 方城县| 蒲城县| 桂平市| 贺兰县|